Docs/ Infraestrutura/ Multi-Servidor

Multi-Servidor

Gerencie e implante em múltiplos servidores a partir de um único painel sh0 usando túneis SSH seguros.

Visão Geral

O sh0 suporta um modelo Traga Seu Próprio Servidor (BYOS) onde você pode conectar múltiplos servidores remotos (nós) à sua instância sh0 primária. O servidor primário atua como plano de controle, gerenciando implantações e roteamento em todos os nós conectados.

Esta arquitetura permite:

  • Distribuir cargas de trabalho entre múltiplos servidores para melhor desempenho
  • Posicionar aplicações mais perto dos usuários em diferentes regiões geográficas
  • Isolar cargas de trabalho (ex.: bancos de dados em hardware dedicado)
  • Escalar além dos recursos de um único servidor
Multi-server architecture diagram showing primary node and remote nodes
Note
Nós remotos precisam apenas ter Docker instalado e acesso SSH. O sh0 cuida de todo o resto -- você não precisa instalar o binário sh0 nos nós remotos.

Adicionando Nós Remotos

Para adicionar um servidor remoto como nó:

  1. Navegue até Configurações → Nós no painel.
  2. Clique em Adicionar Nó.
  3. Insira os detalhes do nó: hostname ou IP, porta SSH e usuário SSH.
  4. Forneça a chave privada SSH ou selecione uma chave existente do seu gerenciador de chaves.
  5. Clique em Conectar. O sh0 verificará a conexão e registrará o nó.
Add node form with hostname, SSH port, and authentication fields

Via API:

Terminal
curl -X POST https://your-server:9000/api/nodes \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "eu-node-1",
    "hostname": "10.0.1.50",
    "ssh_port": 22,
    "ssh_user": "deploy",
    "ssh_key_id": "key_abc123"
  }'
Warning
O usuário SSH deve ter permissão para executar comandos Docker no nó remoto. Adicione o usuário ao grupo docker ou configure sudo sem senha para Docker.

Configuração de Túnel SSH

O sh0 se comunica com nós remotos via túneis SSH. O túnel encaminha requisições da API Docker do servidor primário para o socket Docker do nó remoto, mantendo todo o tráfego criptografado.

O túnel é estabelecido automaticamente quando você adiciona um nó. O sh0 usa SSH TOFU (Trust On First Use) para verificação de chave de host -- você verá a impressão digital do servidor na primeira conexão e será solicitado a confirmá-la.

SSH Tunnel Architecture
Primary Server (sh0)
  |
  |-- SSH Tunnel (encrypted) --> Remote Node 1
  |                                 |-- Docker Socket
  |                                 |-- Container A
  |                                 |-- Container B
  |
  |-- SSH Tunnel (encrypted) --> Remote Node 2
                                    |-- Docker Socket
                                    |-- Container C
SSH tunnel status showing connected nodes and latency
Tip
O sh0 reconecta túneis automaticamente se caírem. A reconexão acontece em segundos, e contêineres em execução no nó remoto não são afetados -- apenas operações de gerenciamento ficam brevemente indisponíveis.

Monitoramento de Saúde dos Nós

O sh0 monitora continuamente a saúde de todos os nós conectados. O monitoramento inclui:

  • Conectividade SSH: Verifica se o túnel está ativo e responsivo.
  • Status do Docker: Verifica se o daemon Docker está rodando no nó remoto.
  • Uso de recursos: Rastreia uso de CPU, memória e disco em cada nó.
  • Saúde dos contêineres: Monitora todos os contêineres rodando no nó.
Node health dashboard showing CPU, memory, disk, and container status for each node

Quando um nó fica indisponível, o sh0 envia alertas pelos seus canais de notificação configurados (e-mail, Slack, Discord ou webhooks). Você pode configurar limites de alerta por nó nas configurações do nó.

Implantando em Nós Específicos

Ao criar ou configurar uma aplicação, você pode especificar em qual nó ela deve rodar. Isso é configurado nas configurações de implantação da aplicação.

Node selection dropdown in the app deployment settings

Opções:

  • Primário (padrão): Implantar no servidor sh0 principal.
  • Nó específico: Fixar a aplicação em um nó remoto nomeado.
  • Qualquer nó: Deixe o sh0 escolher o nó com mais recursos disponíveis.
Terminal
curl -X PUT https://your-server:9000/api/apps/my-app \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"node_id": "node_eu1"}'
Note
Ao implantar em um nó remoto, o sh0 transfere a imagem Docker construída do servidor primário para o nó remoto via túnel SSH. Isso acontece automaticamente -- nenhum registro de contêineres é necessário.

Roteamento Inteligente de Nós

O proxy reverso Caddy do servidor primário gerencia o roteamento para contêineres em todos os nós. Quando uma requisição chega para um domínio, o Caddy a roteia para o nó e contêiner corretos, independentemente de onde o contêiner está rodando.

Para aplicações com réplicas distribuídas entre nós, o Caddy faz balanceamento de carga entre todas as réplicas saudáveis em todos os nós. A latência entre o proxy primário e os nós remotos deve ser considerada ao planejar sua arquitetura.

Tip
Para a menor latência, posicione seu proxy reverso (servidor sh0 primário) na mesma região da maioria dos seus usuários e use nós remotos para processamento em segundo plano ou implantações regionais.

Gerenciando Múltiplos Servidores

O painel de Nós no dashboard fornece uma visão centralizada de todos os servidores na sua frota:

Nodes management panel showing all connected servers with their status and resource usage

A partir deste painel você pode:

  • Ver métricas do nó: CPU, memória, disco e uso de rede para cada nó.
  • Listar contêineres: Ver todos os contêineres rodando em um nó específico.
  • Drenar um nó: Mover graciosamente todos os contêineres de um nó antes de manutenção.
  • Remover um nó: Desconectar um nó remoto (contêineres devem ser migrados ou parados primeiro).
  • Acesso ao terminal: Abrir um terminal SSH para qualquer nó diretamente do painel.
Danger
Remover um nó que ainda tem contêineres em execução tornará esses contêineres inacessíveis. Sempre drene um nó antes de removê-lo para garantir que todas as aplicações sejam migradas para outro nó.