Nginx Proxy Manager 2.16: reverse proxy com HTTPS automático
O Nginx Proxy Manager (NPM) resolve um problema concreto de quem mantém mais de um serviço web em casa ou no servidor: expor cada aplicação em HTTPS sem escrever um bloco de configuração do Nginx na mão para cada uma. A versão 2.16 trouxe um visualizador de log embutido, e desde a 2.13.6 o painel tem autenticação de dois fatores nativa — dois motivos a mais para rodar a versão atual em vez de uma imagem antiga esquecida num Compose de dois anos atrás.
O que o NPM resolve na prática
Por baixo, o NPM continua sendo um Nginx. A diferença é que ele guarda a configuração num banco SQLite e expõe um painel web na porta 81, onde cada “Proxy Host” vira um formulário: domínio de entrada, IP e porta de destino, e um botão para emitir certificado Let’s Encrypt. Ele renova os certificados sozinho via cron interno — não precisa de certbot rodando em paralelo nem de renovação manual a cada 90 dias.
Isso importa porque o erro mais comum em quem gerencia vários serviços internos é deixar o certificado vencer sem perceber, porque a renovação dependia de um script esquecido. Centralizando no NPM, a renovação é um problema resolvido uma vez para todos os domínios.
Pré-requisitos
- Docker e Docker Compose instalados no servidor (Linux, VPS ou mini PC).
- Portas 80 e 443 livres e sem outro serviço escutando nelas — é para onde o Let’s Encrypt manda o desafio HTTP-01 e por onde o tráfego público passa.
- O(s) domínio(s) já apontando via DNS (registro A ou CNAME) para o IP público do servidor. Sem isso, a emissão do certificado falha porque a Let’s Encrypt não consegue validar o domínio.
- Porta 81 liberada só para a sua rede ou VPN — é o painel de administração, não deve ficar exposto à internet (mais sobre isso na seção de segurança).
Passo a passo: instalação via Docker Compose
-
Crie a pasta do projeto e o arquivo
docker-compose.yml:mkdir -p ~/npm && cd ~/npm nano docker-compose.yml
-
Cole o conteúdo abaixo. A imagem fixa a versão 2.16.0 de propósito — evite a tag
latestem produção, porque uma atualização automática pode mudar o comportamento de um dia para o outro sem aviso:services: app: image: jc21/nginx-proxy-manager:2.16.0 restart: unless-stopped ports: - "80:80" - "443:443" - "81:81" environment: TZ: "America/Sao_Paulo" volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt -
Suba o container:
docker compose up -d
A primeira inicialização demora mais que o normal — o NPM gera as chaves JWT usadas para autenticação do painel, e isso consome entropia do sistema. Em VPS pequenas, pode levar um ou dois minutos.
-
Acompanhe o log até ver a mensagem de serviço pronto:
docker compose logs -f app
-
Acesse o painel em
http://IP-DO-SERVIDOR:81e entre com as credenciais padrão de fábrica:E-mail: admin@example.com Senha: changeme
O próprio painel força a troca de e-mail, nome e senha no primeiro login — não pule essa etapa. Um NPM com a senha padrão na porta 81 exposta é a forma mais comum de alguém sequestrar todos os domínios que passam por ele.
-
Em Hosts → Proxy Hosts → Add Proxy Host, preencha o domínio de entrada (ex.:
app.seudominio.com.br) e o IP/porta interno do serviço de destino (ex.:192.168.1.50:8080). Ative Block Common Exploits e, se o serviço usar WebSocket (chat, dashboards com atualização em tempo real, Portainer), ative Websockets Support — sem isso a conexão cai ou fica instável. -
Na aba SSL do mesmo formulário, escolha Request a new SSL Certificate, marque Force SSL e HTTP/2 Support, aceite os termos da Let’s Encrypt e salve. O certificado é emitido e instalado sem sair do navegador, e a renovação a partir daqui é automática.
Segurança: o que travar depois de instalar
- Não exponha a porta 81 na internet. Deixe-a acessível só pela rede local ou por VPN (WireGuard, Tailscale). O tráfego público só precisa das portas 80 e 443.
- Ative o 2FA no seu usuário admin, em Users → editar usuário → 2FA — recurso nativo desde a versão 2.13.6, sem plugin externo.
- Faça backup das pastas
data/eletsencrypt/. É ali que ficam o banco SQLite com toda a configuração dos Proxy Hosts e os certificados emitidos — perder essas duas pastas significa recriar cada host manualmente. - Fixe a versão da imagem no Compose (como no passo 2) e atualize de forma deliberada, lendo o changelog antes, em vez de deixar o Docker buscar
latesta cada restart.
Perguntas frequentes
O NPM substitui o Traefik?
Não necessariamente — são filosofias diferentes. O Traefik se configura por labels dentro do próprio docker-compose.yml de cada serviço, o que é mais automatizável em ambientes com muitos containers subindo e caindo. O NPM centraliza tudo numa interface web, o que é mais rápido para quem gerencia poucos serviços estáveis e prefere um painel a editar YAML.
Dá para usar com serviços que não são containers?
Sim. O destino de um Proxy Host pode ser qualquer IP e porta alcançável pelo container do NPM, incluindo uma máquina física ou uma VM na mesma rede — não precisa estar na mesma stack Docker.
O certificado Let’s Encrypt renova mesmo sem eu fazer nada?
Sim, o NPM roda uma tarefa interna que verifica a validade e renova automaticamente antes do vencimento, desde que a porta 80 continue acessível para o desafio HTTP-01 (ur a 443 para TLS-ALPN-01, dependendo do método escolhido).
Esqueci a senha do admin, como recupero o acesso?
Acesse o shell do container (docker compose exec app sh) e use o script de reset de senha que vem na imagem, ou, em último caso, pare o container e edite o banco SQLite em data/database.sqlite diretamente. Vale manter um e-mail de recuperação válido cadastrado para evitar chegar a esse ponto.
Funciona com domínios wildcard (*.seudominio.com.br)?
Sim, mas só pelo desafio DNS-01, que exige configurar as credenciais da sua API de DNS (Cloudflare, Route53 etc.) nas variáveis de ambiente do container — o desafio HTTP-01 padrão não valida wildcard.
Conclusão
Para quem já sofreu com certificado vencido ou com um nginx.conf de 300 linhas acumulado ao longo de anos, o Nginx Proxy Manager troca isso por um painel que qualquer pessoa da equipe consegue operar sem saber a sintaxe do Nginx de cabeça. O custo é um ponto único de administração que precisa de backup e de porta 81 trancada — pague esse preço desde o primeiro dia e a manutenção depois é mínima.