Nginx Proxy Manager 2.16: reverse proxy com HTTPS automático
|

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

  1. Crie a pasta do projeto e o arquivo docker-compose.yml:

    mkdir -p ~/npm && cd ~/npm
    nano docker-compose.yml
  2. Cole o conteúdo abaixo. A imagem fixa a versão 2.16.0 de propósito — evite a tag latest em 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
  3. 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.

  4. Acompanhe o log até ver a mensagem de serviço pronto:

    docker compose logs -f app
  5. Acesse o painel em http://IP-DO-SERVIDOR:81 e 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.

  6. 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.

  7. 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/ e letsencrypt/. É 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 latest a 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.

Gostou? Compartilhe.

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *