Skip to content

Nginx Proxy Manager (NPM)

O Nginx Proxy Manager é responsável pela publicação dos serviços, atuando como ponto de entrada único do ambiente.

Ele opera em alta disponibilidade usando VIP (192.168.1.20) com keepalived.


  • centralizar acesso aos serviços
  • simplificar publicação via subdomínios
  • aplicar SSL automaticamente
  • integrar autenticação (Authelia)
  • suportar alta disponibilidade (VIP)

ComponenteNó primárioNó secundárioEndereço
Nginx Proxy ManagerRPi (192.168.1.11)NAS (192.168.1.10)VIP 192.168.1.20
KeepalivedRPiNASstatus.json na porta 9080
  • configuração do NPM no RPi
  • sincronização manual para NAS via /opt/scripts/npm-sync.sh
  • Pi-hole com split DNS apontando domínios internos para 192.168.1.20
  • keepalived saudável nos dois nós
  • Authelia no RPi para hosts protegidos
Terminal window
curl http://192.168.1.20:9080/status.json
curl -k -I https://servico.scultetus.dev.br
curl http://192.168.1.11:9080/status.json
curl http://192.168.1.10:9080/status.json
  • o VIP cobre endpoint, mas não sincroniza configuração automaticamente
  • failover pode manter proxy ativo e ainda falhar em serviços dependentes só do RPi
  • 20/04/2026

InstânciaLocalObservação
NPM principalRaspberry Piexecuta enquanto o NAS está ligado
NPM secundárioNASgarante continuidade
ComponenteFunção
keepalivedgerencia estado MASTER/BACKUP
VIP 192.168.1.20endpoint único do proxy
status.jsonreferência de estado HA
  • keepalived roda em container Docker
  • os dois hosts participam do cluster
  • apenas um nó responde pelo VIP por vez

Usuário → DNS (Pi-hole)
VIP 192.168.1.20
Nginx Proxy Manager
(opcional) Authelia
Serviço

  • um nó responde como MASTER
  • o outro permanece como BACKUP
  • o acesso externo e interno deve apontar sempre para o VIP
  • o VIP migra para o outro host
  • o NPM do nó ativo assume o tráfego
  • o serviço continua acessível, desde que a configuração esteja alinhada

⚠️ O failover do VIP mantém a disponibilidade do endpoint, mas não substitui sincronização de configuração entre as instâncias do NPM.


O NPM não possui sincronização nativa entre múltiplas instâncias.

Como o ambiente utiliza VIP com keepalived, é essencial manter as configurações alinhadas entre os dois nós.


A sincronização é realizada manualmente via script:

  • origem: RPi (instância principal / fonte da verdade)
  • destino: NAS (instância secundária)
  • mecanismo: tar via SSH

/data/nginx/

Inclui:

  • proxy hosts
  • certificados
  • configurações do NPM

Local típico:

/opt/scripts/npm-sync.sh

Função:

  • para o NPM no destino
  • sincroniza arquivos
  • sobe novamente o serviço

A sincronização é feita sob demanda:

Terminal window
bash /opt/scripts/npm-sync.sh

Alteração no NPM (RPi)
Executar sync
NAS atualizado
Ambos os nós consistentes

  • alterações feitas diretamente no NAS podem ser sobrescritas
  • sempre considerar o RPi como origem
  • executar sync após mudanças relevantes
  • garantir que o NPM esteja parado durante o sync

  • Authelia roda somente no RPi
  • o serviço foi migrado do NAS para o RPi porque o RPi permanece ligado 24/7
  • em incidentes de failover, validar se o backend do Authelia no RPi está acessível

  • acessar interface do NPM nos dois nós
  • validar proxy hosts
  • testar acesso via domínio
  • validar certificados

⚠️ O VIP garante disponibilidade de rede, mas a consistência depende da sincronização.

Sem sync, o failover pode resultar em comportamento diferente entre os nós.


  • proteger serviços publicados externamente
  • exigir autenticação/2FA fora da rede local
  • preservar acesso interno quando aplicável
  • acesso interno → liberado ou menos restrito
  • acesso externo → protegido via Authelia
include /snippets/authelia-location.conf;
include /snippets/authelia-authrequest.conf;
location / {
proxy_pass http://SERVICO_INTERNO;
}
allow 192.168.1.0/24;
allow 10.13.13.0/24;
deny all;

  • certificados gerenciados pelo próprio NPM
  • uso de Let’s Encrypt
  • validação via domínio público
  • o proxy é o ponto central para TLS dos serviços publicados

Terminal window
ping 192.168.1.20
Terminal window
curl http://192.168.1.11:9080/status.json
curl http://192.168.1.10:9080/status.json
Terminal window
curl -I http://IP_DO_SERVICO
Terminal window
curl -k -I https://servico.scultetus.dev.br
Terminal window
openssl s_client -connect servico.scultetus.dev.br:443
Terminal window
docker exec -it nginx-proxy-manager curl http://SERVICO_INTERNO

SintomaInterpretação provável
DNS resolve, mas não conectaproblema no proxy
HTTP funciona, HTTPS nãoproblema de SSL/certificado
acesso pede autenticação inesperadaregra/autenticação do Authelia
funciona internamente, falha externamenteregra de acesso, proxy ou auth
VIP responde, mas host não abrebackend ou configuração do NPM

DNS resolve?
↓ não → Pi-hole / DNS
↓ sim
VIP responde?
↓ não → keepalived / HA
↓ sim
Backend responde?
↓ não → serviço interno
↓ sim
Authelia / SSL / regra do proxy?

  • manter as configurações do NPM alinhadas entre os dois nós
  • testar acesso interno e externo após alterações
  • validar backend antes de culpar o proxy
  • tratar o VIP como endpoint único de publicação
  • documentar exceções de acesso local/VPN

  • o VIP 192.168.1.20 é o endpoint estável da camada de proxy
  • o DNS dos serviços publicados deve resolver para esse fluxo de acesso
  • o keepalived garante continuidade do IP virtual, não consistência automática das configs do NPM

  • DNS → Pi-hole
  • Proxy → NPM
  • HA → keepalived + VIP 192.168.1.20
  • Auth → Authelia
  • Monitoramento → Uptime Kuma