Índice do diárioDockup / nota de campo
Note / self-host-ntfy

Como fazer self-hosting do ntfy em 2026: tópicos, controle de acesso e entrega

Um guia prático para fazer self-hosting do ntfy, abordando Docker, portas, dados persistentes, TLS, segurança, backups e as falhas que impedem o uso em produção. Passo a passo.

A maioria das instruções de instalação do ntfy termina no primeiro carregamento da página. Isso é cedo demais: o cache é efêmero ou as conexões WebSocket/SSE expiram no proxy. Um teste de produção útil é mais exigente: publicar uma mensagem com curl, recebê-la por meio de subscriptions HTTP e WebSocket, anexar um arquivo e testar um tópico autenticado.

O papel do ntfy é simples: enviar notificações push com uma requisição HTTP simples. Seus limites operacionais vão além do processo web, portanto a dependência, o estado armazenado e a rota pública precisam ser especificados antes que dados reais cheguem.

A estrutura do ntfy em produção

O processo HTTP do ntfy escuta na porta 80; mantenha essa porta na rede da aplicação e publique apenas a rota da plataforma. O requisito do runtime local é um volume de configuração e, opcionalmente, um banco de dados de autenticação. Teste esse limite antes da publicação e novamente após substituir o container.

Registre esse limite como um contrato curto: quem é responsável pelo requisito, qual credencial é usada, qual timeout é aceitável e como a falha se manifesta. Em seguida, execute esta transação: publique uma mensagem com curl, receba-a por meio de subscriptions HTTP e WebSocket, anexe um arquivo e teste um tópico autenticado. Durante a execução, observe as conexões de subscribers de longa duração, o tamanho dos anexos, a retenção do cache e os relays de push de saída, pois essa carga oferece um ponto de partida mais útil para dimensionamento do que um container ocioso.

Inicie o ntfy sem ocultar as partes móveis

Use o container como um runtime substituível, não como a fonte da verdade.

docker run -d \
  --name ntfy \
  --restart unless-stopped \
  -p 127.0.0.1:80:80 \
  -v ntfy-data:/var/cache/ntfy \
  -e NTFY_BASE_URL=https://app.example.com \
  binwiederhier/ntfy:latest serve

Confirme o requisito local antes da exposição: um volume de configuração e, opcionalmente, um banco de dados de autenticação. Inspecione o usuário do container, os caminhos com permissão de escrita e a porta em escuta antes de expô-lo. Execute a ação completa — publique uma mensagem com curl, receba-a por meio de subscriptions HTTP e WebSocket, anexe um arquivo e teste um tópico autenticado — e salve a referência exata da imagem que produziu o resultado.

Dê ao ntfy um endereço canônico

Defina base-url como a origem HTTPS pública usada por publishers e subscribers. Encaminhe o hostname escolhido para a porta 80 do container, encaminhe o host original e o esquema HTTPS e evite publicar uma segunda origem direta.

Teste o ntfy a partir de um client externo limpo. Separe falhas de ingress do limite conhecido da aplicação — o cache é efêmero ou as conexões WebSocket/SSE expiram no proxy. Um erro de certificado, DNS ou 502 pertence ao roteamento; uma requisição que chega ao ntfy e falha depois pertence ao estado da aplicação, à capacidade ou ao requisito de suporte. O guia de TLS para domínios personalizados aborda o primeiro grupo.

Comprove que o ntfy sobrevive à substituição

Proteja o estado do ntfy antes de otimizar o container. O conjunto necessário inclui a configuração, o banco de dados de autenticação e os anexos que precisam sobreviver. Monte /var/cache/ntfy antes do bootstrap, grave dados de exemplo inofensivos e substitua o container para comprovar que esse caminho é realmente persistente. Se vários stores precisarem permanecer consistentes, documente a ordem em que as gravações são pausadas e os backups são realizados.

Mantenha cópias fora do servidor de deployment e criptografe o material que contenha credenciais ou conteúdo privado. A recuperação é bem-sucedida quando usuários, ACLs, configuração e anexos retidos retornam e um subscriber autenticado recebe uma nova mensagem. A diferença entre um mount persistente e uma cópia independente é abordada em armazenamento persistente e snapshots.

Não dê ao ntfy acesso ao host inteiro

No ntfy, a superfície mais valiosa não é necessariamente a landing page. O principal erro é permitir a enumeração pública de tópicos quando as mensagens contêm detalhes operacionais. Combata isso deliberadamente: use ACLs de tópicos, pois nomes de tópicos difíceis de adivinhar não são uma autorização forte para mensagens operacionais.

NTFY_BASE_URL é uma configuração, não um segredo; mantenha seu valor explícito e proteja as credenciais separadas usadas pelo ntfy. Use um usuário não privilegiado no container quando a imagem oferecer suporte a isso e não monte credenciais que não tenham relação com o serviço. Aplique limites de rate ou tamanho no ingress, onde trabalho não confiável pode consumir conexões de subscribers de longa duração, tamanho dos anexos, retenção do cache e relays de push de saída.

Atualize o ntfy sem fazer suposições

Use publicar uma mensagem com curl, recebê-la por meio de subscriptions HTTP e WebSocket, anexar um arquivo e testar um tópico autenticado como smoke test do ntfy após cada deployment. Suas métricas de suporte são conexões de subscribers de longa duração, tamanho dos anexos, retenção do cache e relays de push de saída; gere alertas quando esses recursos se aproximarem de um ponto que degrade a ação do usuário.

O principal risco de mudança é que as chaves de configuração, as migrações do banco de dados de autenticação e as expectativas dos clients devem ser verificadas antes da atualização do ntfy. Um release seguro começa com um snapshot restaurável e valida qualquer alteração de estado irreversível antes de mover o tráfego. Quando o cache é efêmero ou as conexões WebSocket/SSE expiram no proxy, mantenha o container com falha tempo suficiente para ler sua configuração e o primeiro erro.

O gate de release do ntfy

Um release candidate do ntfy ganha tráfego ao concluir um cenário fixo: publicar uma mensagem com curl, recebê-la por meio de subscriptions HTTP e WebSocket, anexar um arquivo e testar um tópico autenticado. Registre o digest da imagem, a configuração efetiva não secreta, a origem pública e os timestamps desse cenário. Os dados de teste devem ser descartáveis, mas realistas o suficiente para exercitar o mesmo caminho usado pelos usuários.

Execute o cenário após substituir o runtime e, em seguida, recrie o serviço a partir da configuração, do banco de dados de autenticação e dos anexos que precisam sobreviver. A recuperação é aprovada quando usuários, ACLs, configuração e anexos retidos retornam e um subscriber autenticado recebe uma nova mensagem. Compare as medições de recursos — conexões de subscribers de longa duração, tamanho dos anexos, retenção do cache e relays de push de saída — com o release anterior e investigue qualquer variação significativa antes da promoção.

Por fim, exercite esta falha controlada: envie uma entrada inofensiva próxima do limite de recurso ou formato associado a este limite: o cache é efêmero ou as conexões WebSocket/SSE expiram no proxy. Verifique se o ntfy explica a falha, não danifica o estado existente e retoma a operação quando a condição válida retorna. Salve um trecho de log com dados sensíveis removidos e o tempo de recuperação. Juntos, esses testes cobrem comportamento, durabilidade e operabilidade, em vez de apenas a disponibilidade do processo.

Mantenha o ntfy explícito enquanto o Dockup cuida do roteamento

Roteamento, certificados, substituição do serviço e armazenamento anexado são alvos razoáveis para automação. O Dockup cuida disso para o ntfy e pode provisionar o banco de dados gerenciado relacionado ou conectar-se a serviços no servidor do próprio cliente.

O que ele não deve inventar é a trust policy do ntfy. Após o deployment, defina base-url como a origem HTTPS pública usada por publishers e subscribers, aplique este limite — use ACLs de tópicos, pois nomes de tópicos difíceis de adivinhar não são uma autorização forte para mensagens operacionais — e verifique o resultado deste cenário: publique uma mensagem com curl, receba-a por meio de subscriptions HTTP e WebSocket, anexe um arquivo e teste um tópico autenticado. O resultado é uma infraestrutura de um clique com um acceptance test específico da aplicação.

Perguntas frequentes

O que o ntfy precisa para um deployment em produção?

Encaminhe o container do ntfy na porta 80 por meio de uma única origem HTTPS. O requisito do runtime local é um volume de configuração e, opcionalmente, um banco de dados de autenticação. Não considere o ntfy pronto até conseguir publicar uma mensagem com curl, recebê-la por meio de subscriptions HTTP e WebSocket, anexar um arquivo e testar um tópico autenticado.

Quais dados do ntfy devem fazer parte do backup?

Torne /var/cache/ntfy persistente e inclua a configuração, o banco de dados de autenticação e os anexos que precisam sobreviver no mesmo recovery manifest. Um restore limpo do ntfy só é aprovado quando usuários, ACLs, configuração e anexos retidos retornam e um subscriber autenticado recebe uma nova mensagem.

O ntfy precisa de HTTPS atrás de um reverse proxy?

Use HTTPS para a origem pública do ntfy e mantenha a porta 80 na rota interna. Aplique corretamente a configuração do ntfy: defina base-url como a origem HTTPS pública usada por publishers e subscribers. No ntfy, o HTTPS protege credenciais ou conteúdo dos usuários durante o trânsito e mantém consistente o comportamento dos clients sensível à origem.

Como testar uma atualização do ntfy?

Restaure o estado atual do ntfy em um deployment isolado, aplique a versão candidata e repita sua transação de acceptance. Dê atenção especial ao fato de que as chaves de configuração, as migrações do banco de dados de autenticação e as expectativas dos clients devem ser verificadas antes da atualização do ntfy. Mantenha a imagem anterior do ntfy até compreender os limites de migração de dados e rollback.