BrandPilot — Ops Playbooks
Production URL: https://p24-brandpilot.zintegrowana.online
Health endpoint: https://p24-brandpilot.zintegrowana.online/api/health
Grafana dashboard: BrandPilot — Service Health (uid: brandpilot-health)
Components
| Component | Health signal | Playbook |
|---|---|---|
| Next.js app (Vercel) | probe_success{instance=~".*brandpilot.*"} = 0 OR /api/health → non-200 | app-down.md |
n8n AI campaign workflow (bms-4 SvcDlrMxBMN9aTUJ) | Campaign generation returns “N8N webhook failed” error | n8n-ai-webhook-down.md |
| Supabase (dedicated free-tier) | /api/health returns supabase.ok: false | supabase-connection-failed.md |
| LinkedIn OAuth | Posts fail with “LinkedIn token expired” | linkedin-token-expired.md |
Automated monitoring
- Prometheus blackbox probe:
https://p24-brandpilot.zintegrowana.online/api/health(every 30s) - SSL probe:
https://p24-brandpilot.zintegrowana.online(every 5m) - n8n hourly check: workflow
BrandPilot — Hourly Health Checkon bms-4 — fires Discord + GitHub issue on failure - Alert rules:
EndpointDown,BrandPilotSupabaseDegradedinmonitoring/prometheus/rules/
Secrets location
All credentials: p24-infra/secrets/brandpilot.env.sops (SOPS+age).
Synced to Vercel on merge via secrets-sync.yml.
Architecture
Cloudflare DNS
└─ Vercel (Next.js 14 App Router)
├─ Supabase (auth + database, dedicated free-tier)
├─ Resend (transactional email)
├─ n8n bms-4 webhook → SvcDlrMxBMN9aTUJ → claude-proxy:9999 → Anthropic API
└─ LinkedIn OAuth (per-user tokens in social_accounts table)