kodama-watchdog — self-heal + alerta pra todos os projetos da VPS Hermes
O quê
Monitor genérico na VPS Hermes (187.127.24.217) que checa saúde de todos os
projetos de produto rodando lá, tenta self-heal e avisa no Discord só na
transição de estado (down↔up), pra não floodar o canal.
- Script:
/usr/local/bin/kodama-watchdog.sh(host-local, não versionado — segue
o mesmo padrão de/usr/local/bin/vault-sync.sh) - Config:
/etc/kodama-watchdog/projects.conf— um projeto por linha, formatoname|type|target|http_checks|env_file - Timer:
kodama-watchdog.timer(systemd, root, a cada 2min) - State:
/var/lib/kodama-watchdog/state/<name>.state(up/down) - Lock por projeto:
/var/lock/kodama-watchdog/<name>.lock(evita corrida se
rodar manual + timer ao mesmo tempo)
Como funciona
Pra cada linha do config, roda em paralelo:
- type=compose:
docker compose -f <target> ps— todo service (exceto*init*/*migrate*) tem que estarrunning. Depois, sehttp_checks!=-, curl em cada URL — qualquer código HTTP conta como vivo (só000
= recusou conexão/timeout é down). Não dá pra saber a rota de health de
cada app sem documentar por serviço, então checa só "o processo responde". - type=systemd / systemd-user:
systemctl [--user] is-active.openclaw-gatewayé--userdo root (linger habilitado, funciona sem
sessão interativa viaXDG_RUNTIME_DIR=/run/user/0). - Se down: self-heal (
docker compose up -dousystemctl restart), retry
5s×6 (30s). Se voltar → avisa "religado automaticamente". Se não → avisa
"FORA DO AR, olhar manual" (só uma vez por queda, não repete a cada 2min).
Alerta via DISCORD_WEBHOOK_URL (lido de /home/vault-site/.env — mesmo
webhook que já existia pro bot de summary de push do vault).
Escopo (21 alvos)
Só projetos de produto — pulou sidecars que sobem/descem junto (postgres,
redis, grafana/prometheus/cadvisor/dozzle/node-exporter da lunacrm,
minio-init one-shot da mimic). Lista completa em projects.conf no host.
Casos especiais no config:
- mimic: precisa
--env-file /home/mimic/src/.envexplícito — o.env
real fica 2 níveis acima do compose file (src/infra/compose/), compose
não acha sozinho. - lunacrm: usa
docker-compose.prod.yml(não o nome default). - swarm: cobre só
infra-swarm-db-1via compose +swarm-mcp-http
(systemd, system-level) +openclaw-gateway(systemd, --user). Não incluiswarm-worker.service, que ficainactive deadpor design (não é bug).
Histórico / por que existe
2026-07-07: vault.kodama.solutions caiu com bad gateway (containers comexitCode=137, causa não 100% identificada). Primeira versão foi um watchdog
só do vault-site (deploy/watchdog.sh no repo kodama1/vault) — removido
depois, superado por este. User pediu pra generalizar pra todos os projetos
da VPS no mesmo dia.
Durante o rollout, dois bugs pegos e corrigidos antes de virar produção:
- Race entre execução manual e timer: dois
docker compose up -d
concorrentes na mesma hora derrubaram um container no meio da troca
("container is marked for removal and cannot be started") → falso alarme
de "self-heal falhou" mesmo o site já tendo voltado. Fix:flockpor
projeto. - Falso-down em 5 projetos (agent-scraper, kodama-ai, lunacrm,
tinfoil-server, mimic) na primeira rodada real:curl -sftratava
401/403/404 (rotas de API sem handler em/) como "down". Fix: qualquer
HTTP code conta como vivo, só timeout/conexão-recusada é down. mimic
também precisou do--env-fileexplícito (bug real, não do watchdog).
Alterar
Editar /etc/kodama-watchdog/projects.conf direto no host (não é repo git).
Pra adicionar um projeto novo: uma linha name|compose|caminho/docker-compose.yml|checks|env_file.
Testar sozinho antes de confiar no timer: /usr/local/bin/kodama-watchdog.sh
e conferir /var/lib/kodama-watchdog/state/<name>.state.