Il tuo 200 OK mente. Dadaguard diventa giallo quando un servizio è su ma non coerente —
versione, runtime, secret, Terraform. Watchdog DevOps · local-first · read-only · no-LLM.

▶ video completo · girato con demowright
Provalo in 10 secondi, senza AWS — immagine pubblica, dati finti, zero config:
docker run -p 3001:3001 -e DADAGUARD_DEMO=1 ghcr.io/matte97p/dadaguard:latest
# → http://localhost:3001Un uptime monitor ti dice se un endpoint risponde 200. Dadaguard va oltre: la versione deployata è quella attesa? il runtime reale (task running vs desired) è a posto? i secret che il servizio usa esistono? lo stato combacia con Terraform? Un servizio "verde" altrove qui può diventare giallo.
- Liveness + latenza
- Versione deployata vs attesa
- Runtime AWS reale: ECS · ASG · Lambda (con dead-man switch per le cron) · RDS/Aurora · ALB · EC2
- Secret presenti (SSM / Doppler) — solo per nome, mai i valori
- Drift vs Terraform: leggero (state ↔ AWS) e completo (
terragrunt plan, on-demand) - Risorse non gestite da Terraform
- Sprechi (EIP / NAT / EBS orfani) + Costi per servizio (AWS Cost Explorer)
- Topologia delle dipendenze tra servizi, dedotta da AWS (env Lambda · event source · security group) — niente da dichiarare a mano
- No LLM — deterministico: niente costi, latenza o non-determinismo.
- Read-only sull'infra — non crea/modifica/distrugge nulla; l'infrastruttura si cambia solo via Terraform.
- Fetch-on-load, zero storage — la config (
services.yaml) è riletta a ogni richiesta.
npm install --legacy-peer-deps
npm run dev # → http://localhost:5173Auth AWS in locale: profilo SSO/CLI o credenziali di default dell'ambiente. services.yaml è opzionale: senza, Dadaguard auto-scopre i servizi che girano nell'account (read-only). Copialo (cp services.example.yaml services.yaml) solo per fissare watchlist, versioni attese, account multipli e Terraform.
Provalo senza AWS — dati finti, zero credenziali:
DADAGUARD_DEMO=1 npm run devIn modalità local-first services.yaml è anche editabile dalla dashboard (aggiungere/togliere servizi dalla watchlist riscrive il file). In cloud la config è read-only e arriva da SSM.
Self-host in un comando — gira ovunque (VM, NAS, mini-PC, PaaS), UI in italiano e inglese:
cp services.example.yaml services.yaml # cosa monitorare + account
cp .env.example .env # accesso AWS read-only (profilo o chiavi)
docker compose up -d # → http://localhost:3001In alternativa al build locale c'è l'immagine pubblicata: togli il commento image: nel compose, o docker run -p 3001:3001 -v $PWD/services.yaml:/app/services.yaml -v $HOME/.aws:/root/.aws:ro ghcr.io/matte97p/dadaguard:latest.
Accesso AWS, a scelta: profili ~/.aws (montati) + AWS_PROFILE, chiavi in .env, o il ruolo dell'istanza se giri dentro AWS (EC2/ECS). Cross-account: gli account in services.yaml usano roleArn (AssumeRole). Read-only by design: zero scritture sull'infra.
Ogni account monitorato concede a Dadaguard un ruolo IAM di sola lettura — esempio Terraform o la stessa policy in JSON se non usi Terraform (niente kms:Decrypt: i valori dei secret restano inaccessibili).
Fargate dietro Cloudflare Access (Zero Trust, zero porte pubbliche), con la config iniettata da SSM: vedi deploy/README.md. È una delle ricette di hosting possibili — per la maggior parte dei casi docker compose basta.
Oltre alla dashboard, due interfacce per il flusso DevOps (read-only, on-demand):
npm run check # esegue tutti i check; exit ≠0 se un servizio è giù
npm run check -- --json # output machine-readable
npm run check -- --fail-on degraded # soglia più severa (gating di pipeline)/metrics— formato Prometheus (severità per servizio/check + latenza + running/desired): aggancialo a Grafana/Alertmanager per dashboard, alert e storico, senza che Dadaguard diventi un servizio stateful./healthz— liveness dell'app (non chiama AWS).
server/— Express.GET /api/statusrileggeservices.yamled esegue i check in parallelo (server/checks/). Aggiungere un segnale = un file inchecks/+ una riga inserver/status.js.web/— React + Ant Design. Una card per servizio; il semaforo è il check messo peggio.- In cloud Express serve anche il frontend buildato (
dist/) sulla stessa porta.
MIT © 2026 Matteo Perino
