Atualmente em testes: o código do GitHub será aberto quando concluído.

Implantação do servidor Ticketing

Ambiente
Shell
Modo
bash
Exemplo de conexão do cliente
rust
Teste rápido com nc
bash

Variáveis de Ambiente

A configuração do servidor é feita inteiramente por variáveis de ambiente. As chaves não diferenciam maiúsculas de minúsculas, um valor vazio conta como não definido, e valores do tipo flag só são verdadeiros para 1/true/yes/on. A imagem Docker é baseada em scratch, então a configuração é injetada apenas por variáveis de ambiente, sem arquivo de configuração.

Variável de ambientePadrãoDescrição
PORT5225Porta de escuta no modo single. Ignorada no modo cluster, onde a porta de CLUSTER_SELF é usada em seu lugar
SOCKET_BIND0.0.0.0Endereço de escuta
CLIENT_TOKENS(nenhum)Lista de tokens de autenticação do cliente separada por vírgulas. Se não definida, um token vazio é permitido
CLUSTER_SELF(nenhum)O endereço anunciado deste nó, host:port. Sua presença ativa o modo cluster
CLUSTER_PEERS(nenhum)Lista separada por vírgulas do endereço anunciado de todo nó. Exatamente 3 ou 5, na mesma ordem em todo nó, deve incluir self
CLUSTER_TOKENS(nenhum)Lista de tokens de autenticação entre pares separada por vírgulas
TLS_CERT / TLS_KEY(nenhum)Caminhos para os arquivos PEM de certificado/chave privada — defina ambos juntos para ativar o TLS
TLS_CA(nenhum)CA para verificar certificados de pares — recorre ao repositório de confiança do sistema se não definida
TLS_SKIP_VERIFYfalsePula a verificação do certificado do par — apenas para testes
DOCKERfalseFixa as portas de escuta internas em 5225/6225 no modo cluster — definido por padrão na imagem oficial
DEBUGDepende do build1/true ativa o log de depuração

Para as regras completas (derivação de porta, endereços anunciados, rotação de token sem downtime etc.), veja Configuração (Variáveis de Ambiente).

Single vs. Cluster

  • Single (1 nó): sem CLUSTER_*, o nó roda de forma independente. É o mais rápido, mas há uma breve interrupção ao reiniciar, e o estado fica em memória, então se perde ao reiniciar (lease é a rede de segurança).
  • Cluster (sem interrupções): 3 ou 5 nós. Os nós compartilham um único estado de lock via consenso Raft — somente o líder trata as requisições, e toda mudança de estado só é finalizada após um commit da maioria. Se o líder morre, um novo é eleito dentro de 0,5-1 segundo, e, enquanto uma maioria permanecer viva, o estado do lock e o serviço continuam funcionando. Veja Como Funciona e Protocolo (Cluster) para a explicação completa.
  • Cada nó do cluster escuta na porta do cliente mais uma porta Raft (porta do cliente + 1000) — abra as duas portas no seu firewall.

As implantações de cluster no Kubernetes usam um StatefulSet + Service headless. Dê a cada pod um nome DNS estável (ticketing-0.ticketing…, ticketing-1.ticketing…), coloque esses nomes em CLUSTER_PEERS, e injete automaticamente o CLUSTER_SELF de cada pod via downward API (metadata.name).

Reinício sem Interrupção (Rolling)

Há uma regra central — uma maioria deve sempre permanecer viva (no máximo 1 de 3 fora do ar por vez).

  1. Reinicie primeiro os seguidores, um de cada vez. Assim que um nó reiniciado se atualiza via replicação ou um snapshot, passe para o próximo.
  2. Por fim, derrube o líder — um novo é eleito dentro de 0,5-1 segundo, e os clientes trocam de forma transparente.
  3. Subir novamente um nó derrubado o reingressa como seguidor.

Veja Procedimento de Reinício sem Interrupção (Rolling) para os passos detalhados.

Referência