Imagem: jc21/nginx-proxy-manager:latest Pasta: /opt/server/infra/npm/ Container name: npm

Para que serve

NPM (Nginx Proxy Manager) é um reverse proxy com interface web. Ele:
  • Termina TLS (HTTPS) com certificados Let’s Encrypt automáticos.
  • Roteia requisições por subdomínio para containers internos.
  • Permite criar Proxy Hosts via UI sem editar arquivos de config nginx à mão.
É o único container com portas expostas no host.

Portas

HostContainerUso
0.0.0.0:8080HTTP (redireciona p/ HTTPS), aberto pra Internet
0.0.0.0:443443HTTPS, aberto pra Internet
127.0.0.1:8181UI de admin, só loopback (acesso via subdomínio ou SSH tunnel)
Docker contorna o UFW. Portas publicadas com 81:81 (sem prefixo de IP) ficam acessíveis externamente mesmo com ufw deny 81/tcp — o Docker escreve regras de iptables que passam antes das do UFW. Por isso o NPM publica a 81 explicitamente em 127.0.0.1, garantindo que só processos no host (ou via SSH tunnel) acessam.A mesma regra vale pra qualquer porta administrativa de outros serviços que adicionar.

Volumes

./data           → /data              # config, banco SQLite interno do NPM
./letsencrypt    → /etc/letsencrypt   # certificados emitidos

Subir

cd /opt/server/infra/npm
docker compose up -d

Acesso à UI

A UI fica em http://127.0.0.1:81 no servidor. Como a 81 só escuta em loopback, você acessa por SSH tunnel ou pelo subdomínio reverso (depois de configurado). Via SSH tunnel (sempre funciona):
ssh -L 8081:127.0.0.1:81 <user>@<ip-do-servidor>
# browser local: http://localhost:8081
Via subdomínio reverso (depois do primeiro setup):
https://npm.example.com

Primeiro login

  1. Acessar pela primeira vez (SSH tunnel é o caminho garantido pro setup inicial).
  2. Login default: admin@example.com / changeme.
  3. NPM força você a trocar email e senha imediatamente. Faça isso.

Configurar um Proxy Host

Para expor o n8n em n8n.example.com, por exemplo:
1

DNS apontado

n8n.example.com precisa já estar resolvendo para o IP do servidor antes de tentar emitir o certificado — o Let’s Encrypt faz o desafio HTTP-01 batendo no próprio domínio. Validar com dig +short n8n.example.com. Detalhes em Configurar DNS.
2

Hosts → Proxy Hosts → Add

  • Domain Names: n8n.example.com
  • Scheme: http
  • Forward Hostname: n8n (nome do container na server_net)
  • Forward Port: 5678
  • Block Common Exploits: ligado
  • Websockets Support: ligado (n8n usa)
3

Aba SSL

  • Request a new SSL Certificate
  • Force SSL: ligado
  • HTTP/2 Support: ligado
  • Email: seu email
  • Aceitar termos do Let’s Encrypt
4

Save

NPM emite o certificado em ~30s. A partir daí, https://n8n.example.com funciona.

Por que NPM e não Traefik/Caddy

  • UI gráfica — adicionar/editar proxy hosts sem mexer em arquivo.
  • TLS automático com Let’s Encrypt out of the box.
  • Suficiente para um servidor pessoal sem dezenas de regras complexas.
Trade-off: configuração mora dentro do banco SQLite do NPM (data/database.sqlite), não em arquivos versionáveis. Para reproduzir em outro servidor é necessário copiar essa pasta.