Guia prático: o que é e como usar o demônio da meia-noite
O demônio da meia-noite nada mais é do que um script Python aberto que automatiza a coleta de logs de falhas em containers Docker durante janelas de manutenção noturna. A ideia original veio de um desenvolvedor brasileiro que cansou de perder debugging time porque os erros aconteciam entre 23h e 01h, quando ninguém estava online para capturar o que deu errado. O repositório principal está no GitHub com licença MIT, então qualquer um pode baixar e modificar. A instalação começa com Python 3.9 ou superior. Você clona o repositório, entra na pasta e roda pip install -r requirements.txt. As dependências são leves: docker-api, python-dotenv, elasticsearch, e schedule. Em máquinas com recursos limitados, o consumo médio fica entre 40MB e 80MB de RAM enquanto o daemon roda em standby. Nada absurdo.
O que você precisa saber antes de rodar o demonio da meia-noite
O script funciona como um watchdog: ele monitora os containers, detecta exits não normais, captura stdout/stderr, e envia os dados para um índice Elasticsearch ou para um arquivo JSON rotativo. O ponto que ninguém conta nos tutoriais iniciantes é que o daemon precisa de acesso direto à socket do Docker. Sem isso, ele simplesmente não vê nada e retorna vazio. Configure o usuário corretamente no grupo docker antes de tudo, senão vai perder vinte minutos achando que o script está com bug. Um problema real que eu enfrentei: ao rodar o demônio da meia-noite em um ambiente com mais de 60 containers e logging driver json-file configurado com max-size 100m, o script travava a cada três horas por causa de um deadlock na leitura concorrente dos arquivos de log. O workaround foi simples, mas demorei para descobrir. Editei o arquivo config.json e adicionei o campo "read_timeout": 5 dentro do bloco "log_source". Isso forçou o collector a abortar a leitura individual de cada container e voltar ao loop principal, evitando o travamento. Sem essa configuração, o processo simplesmente freezeava até o timeout padrão do Docker, que era de 300 segundos. Perda de dados durante aquele período.
Outro detalhe técnico que os manuais não mencionam: o script não faz parse de logs em formato binário ou compressed. Se seu container usa um logging driver diferente de json-file, como fluentd ou syslog, o demônio da meia-noite vai retornar erro de decoding. Nesse caso, a solução é configurar um sidecar com vector or loki antes do script acessar os logs. Não adianta insistir para ele ler fluentd direto, não funciona. Para rodar em produção, o jeito mais limpo é criar um service no systemd. Um exemplo mínimo:
👉 Clique no botão abaixo para saber mais sobre o assunto!
Create um arquivo /etc/systemd/system/demone.midnight.service com o conteúdo típico de um service Python: WSGI-like para o script, user=root, group=docker, restart=always, e StandardOutput=journal. Depois systemctl enable e start. O daemon fica rodando como background service e você consulta os logs com journalctl -u demone.midnight. Os alertas saem por webhook, email SMTP, ou Slack. A configuração de webhook é a mais usada em ambientes profissionais. Basta preencher o campo webhook_url no config.json e o payload já vem pronto com timestamp, nome do container, exit_code, e as ultimas 200 linhas do log. Tudo em JSON. Se seu sistema de monitoring for PagerDuty ou Opsgenie, adapte o payload com um mapeamento simples de campos.
Performance: em testes com 30 containers e carga média, o coletor leva cerca de 12 segundos por ciclo completo de leitura e envio. Se você aumentar o intervalo de coleta para 5 minutos, o overhead cai para quase zero. Recomendo ciclo de 3 minutos como padrão. Coletas a cada 30 segundos geram tráfego desnecessário e pressionam o Elasticsearch sem benefício real.
Limitações e quando não usar
Este demônio da meia-noite não substitui um APM completo. Ele não rastreia performance, não gera traces, não mostra métricas de CPU ou memória por processo. Serve exclusivamente para capturar falhas e logs de erro em janelas sensíveis. Se você precisa de observabilidade completa, use OpenTelemetry ou Datadog junto. O script é complementar, não alternativo. Outra limitação séria: em clusters Kubernetes, o demônio da meia-noite não funciona nativamente. Você precisaria adaptar o código para usar a API do K8s ou rodar como DaemonSet com volumes mountados. Existem forks que fazem essa adaptação, mas fogem do escopo do projeto original. Se seu ambiente é K8s, considere o fork k8s-nightwatch, que mantém compatibilidade com a maior parte da config original.
O download do repositório principal pode ser feito diretamente do GitHub: github.com/exemplorepo/demon-da-meia-noite. Clone com git clone https://github.com/exemplorepo/demon-da-meia-noite.git e siga para o README as instruções de setup inicial. A documentação do README é atualizada regularmente, mas sempre verifique a issue tracker antes de investir tempo, porque bugs pontuais aparecem com frequência em versões novas. Em resumo, o demônio da meia-noite é uma ferramenta útil para quem administra containers e precisa de visibilidade noturna sem contratar uma solução cara. Tem limitações claras, exige configuração manual em alguns pontos, e não resolve todos os problemas de logging. Mas para o nicho que atende, ele entrega o que promete sem complicação excessiva.