Servidor HTTP

Um http.service possui um listener e hospeda roteadores, endpoints e handlers de arquivos estáticos.

Classificação: referência de configuração do servidor. Os blocos são fragmentos parciais do registro, a menos que definam todas as entradas de rede, ambiente, sistema de arquivos, roteador, certificado, ator e política referenciadas.

Configuração

- name: gateway
  kind: http.service
  addr: ":8080"
  timeouts:
    read: "5s"
    write: "30s"
    idle: "60s"
  host:
    buffer_size: 1024
    worker_count: 4
  lifecycle:
    auto_start: true
    security:
      actor:
        id: "http-gateway"
      policies:
        - app:http_policy
Campo Tipo Padrão Descrição
addr string obrigatório Endereço de escuta (:8080, 0.0.0.0:443)
timeouts.read duration - Timeout de leitura de requisição
timeouts.write duration - Timeout de escrita de resposta
timeouts.idle duration - Timeout de conexão keep-alive
host.buffer_size int 1024 Tamanho do buffer do relay de mensagens
host.worker_count int NumCPU Workers do relay de mensagens
network ID do Registro - Vincula o listener por uma rede overlay, como Tailscale ou I2P
tls object - Terminação TLS (ver TLS)

Timeouts

Configure timeouts para evitar esgotamento de recursos:

timeouts:
  read: "10s"    # Max time to read the entire request (headers + body)
  write: "60s"   # Max time to write response
  idle: "120s"   # Keep-alive timeout
  • read - Curto (5-10s) para APIs, maior para uploads
  • write - Deve corresponder ao tempo esperado de geração de resposta
  • idle - Balanço entre reutilização de conexão e uso de recursos
Formato de duração: 30s, 1m, 2h15m. Use 0 para desabilitar.

Configuração de Host

A seção host configura o relay interno de mensagens do servidor, usado por componentes como WebSocket relay:

host:
  buffer_size: 2048
  worker_count: 8
Campo Padrão Descrição
buffer_size 1024 Capacidade da fila de mensagens por worker
worker_count NumCPU Goroutines paralelas de processamento de mensagens
Aumente esses valores para aplicações WebSocket de alto throughput. O relay de mensagens trata a entrega assíncrona entre componentes HTTP e processos.

Segurança

Servidores HTTP podem ter um contexto de segurança padrão aplicado através da configuração de lifecycle:

lifecycle:
  auto_start: true
  security:
    actor:
      id: "gateway-service"
    policies:
      - app:http_access_policy

Isso define um ator e políticas de base para todas as requisições. Para requisições autenticadas, o middleware token_auth substitui o ator com base no token validado, permitindo políticas de segurança por usuário.

Lifecycle

Servidores são gerenciados pelo supervisor:

lifecycle:
  auto_start: true
  start_timeout: 30s
  stop_timeout: 60s
  requires:
    - app:database
Campo Descrição
auto_start Iniciar quando a aplicação iniciar
start_timeout Tempo máximo de espera pelo início do servidor
stop_timeout Tempo máximo para shutdown graceful
requires Iniciar depois que essas entradas estiverem prontas (depends_on é a grafia legada)

Conectando Componentes

Roteadores e handlers estáticos referenciam o servidor via metadados:

entries:
  - name: gateway
    kind: http.service
    addr: ":8080"

  - name: api
    kind: http.router
    meta:
      server: gateway
    prefix: /api

  - name: static
    kind: http.static
    meta:
      server: gateway
    path: /
    fs: app:public

Múltiplos Servidores

Execute servidores separados para propósitos diferentes:

entries:
  # Public API
  - name: public
    kind: http.service
    addr: ":8080"
    lifecycle:
      auto_start: true

  # Admin (localhost only)
  - name: admin
    kind: http.service
    addr: "127.0.0.1:9090"
    lifecycle:
      auto_start: true

TLS

O servidor pode terminar TLS diretamente. Defina tls.mode como manual (forneça seu próprio certificado) ou auto (certificado fornecido por um driver de rede overlay, ex. network.tailscale). Listeners clearnet simples não suportam auto. Omita tls ou deixe o mode vazio para executar HTTP simples.

No modo auto o servidor não deve especificar cert/key — o driver de rede os fornece.

Certificado manual

Sob mode: manual, cert e key carregam conteúdo PEM. Forneça esse conteúdo de uma de três formas (escolha uma por campo, nunca misture):

  1. PEM inline — a string PEM literal.
  2. Referência file:// — caminho relativo ao manifesto, resolvido e embutido no momento do carregamento (seguro contra traversal).
  3. Referência ao registro de ambiente — obtém o PEM de uma variável de ambiente registrada no momento da decodificação, usando um placeholder ${env:NAME}.
- name: api
  kind: http.service
  addr: ":443"
  tls:
    mode: manual
    cert: file://./certs/server.pem
    key:  file://./certs/server.key
- name: api
  kind: http.service
  addr: ":443"
  tls:
    mode: manual
    cert: ${env:app.env:tls_cert}
    key:  ${env:app.env:tls_key}

O placeholder ${env:NAME} resolve NAME através do registro de ambiente — o nome público de uma variável registrada ou o ID da sua entrada (ex. app.env:tls_cert). Não é uma variável de ambiente bruta do SO; um valor do SO só é alcançável quando uma variável com backend env.storage.os está registrada sob aquele nome. Um padrão pode ser fornecido com ${env:NAME|default}.

Os campos companheiros legados cert_env / key_env ainda resolvem através do registro de ambiente da mesma forma, mas estão deprecados — prefira o placeholder ${env:NAME} mostrado acima.
Campo Descrição
mode "" (off), auto ou manual
cert / key Conteúdo PEM — inline, referência file:// ou placeholder ${env:NAME}

Mutual TLS (mTLS)

Sob mode: manual o servidor pode adicionalmente verificar certificados de cliente:

tls:
  mode: manual
  cert: ${env:app.env:tls_cert}
  key:  ${env:app.env:tls_key}
  client_ca: file://./certs/clients-ca.pem
  client_auth: require_and_verify

client_ca aceita as mesmas três formas de cert/key (PEM inline, file:// ou ${env:NAME}). O campo companheiro legado client_ca_env está igualmente deprecado em favor de client_ca: ${env:NAME}.

Campo Descrição
client_auth request, require_any, verify_if_given, require_and_verify
client_ca Bundle PEM de CAs de cliente confiáveis (inline, file:// ou ${env:NAME})

verify_if_given e require_and_verify exigem uma CA. request e require_any aceitam qualquer certificado de cliente sem verificação de CA.

Veja Também