Visão geral

Tudo que aparece no diagrama está dentro de uma única rede Docker chamada server_net. Containers nessa rede se enxergam pelo nome (postgres, redis, n8n, etc.) sem precisar de IP.

Como o tráfego entra

  1. Cliente bate em algo.example.com:443.
  2. DNS resolve para o IP do servidor.
  3. NPM (único container com portas expostas no host) recebe na porta 443.
  4. NPM consulta seus “Proxy Hosts” configurados via UI e encaminha para o container certo (ex.: n8n:5678).
  5. NPM termina o TLS — o tráfego dentro de server_net é HTTP em texto claro (rede privada do Docker).

Por que rede external

Cada docker-compose.yml declara:
networks:
  server_net:
    external: true
Isso significa que o compose não cria a rede — ele assume que ela já existe. Quem cria é o bootstrap.sh na primeira execução. Esse padrão permite que múltiplos composes (um por serviço) compartilhem a mesma rede sem disputar a “posse” dela.

Portas expostas no host

ServiçoPortas no hostPara quê
NPM80, 443, 81HTTP, HTTPS, UI de admin
Postgresnenhumasó interno (postgres:5432)
Redisnenhumasó interno (redis:6379)
n8nnenhumaacessado via NPM (n8n.example.com)
Regra: apenas o que precisa ser falado da Internet é exposto no host. Banco e cache ficam na rede interna — projetos os acessam pelo nome.

Persistência

Cada serviço usa bind mounts para sua pasta data/:
/opt/server/infra/postgres/data/   →  /var/lib/postgresql/data
/opt/server/infra/redis/data/      →  /data
/opt/server/infra/n8n/data/        →  /home/node/.n8n
/opt/server/infra/npm/data/        →  /data
/opt/server/infra/npm/letsencrypt/ →  /etc/letsencrypt
Backup = tar czf backup.tar.gz /opt/server/infra/*/data/ /opt/server/infra/npm/letsencrypt/.