Adds a server-wide backup capability beyond the existing ops_dashboard
pg_dump flow:
- Daily systemd timer (03:30) runs pg_dumpall + Forgejo dump, then restic
to a local NAS repo and an offsite Backblaze B2 repo with Object Lock.
Phase-based script with single-instance flock, structured statusfile,
systemd hardening, and live-datadir excludes (Postgres / Forgejo) so
the dumps stay authoritative.
- Ops-agent gets nine new read-only/trigger commands (snapshots, stats,
status, logs, plus two triggers) backed by sudoers-whitelisted wrapper
scripts that source /etc/restic-backup.env so the agent never sees the
restic password or B2 keys.
- Two new flows (server_backup_full, server_backup_restore_test) drive
the dashboard's "Backup now" and "Restore test" buttons.
- /settings/backups gains a Server backup section with overall + per-phase
status, NAS / B2 snapshot tables, restore-size / raw-data / dedup-ratio
stats, and the last restore-test result. The existing pg_dump section
is preserved unchanged.
- Runbook docs/runbooks/server-backup.md follows the tailscale-setup
pattern (plan + addendum) and covers B2 Object Lock + scoped keys,
Forgejo subplan with isolated restore-test stack, the off-server
maintenance flow for B2 prune, and the integrity-check schedule.
Code-only change — installation on scrum4me-srv follows the runbook.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Legt de volledige stack-redeploy vast als één flow: scrum4me-web
(pull/migrate/build/restart) gevolgd door de MCP-worker.
Onderweg een echte bug gevonden en gefixt: update_mcp_worker.yml deed
`docker_compose_build worker-idea` zónder cache-bust. De worker-idea
Dockerfile clonet scrum4me-mcp van GitHub in een aparte laag; zolang
MCP_GIT_REF gelijk blijft ('main') hergebruikt Docker die laag, dus
nieuwe MCP-commits werden NIET opgepikt. Een schijnbaar geslaagde
rebuild draaide stilletjes op oude MCP-code.
Wijzigingen:
- commands.yml.example: nieuw command docker_compose_build_worker_fresh
dat via `sh -c` MCP_CACHE_BUST=$(date +%s) meegeeft — invalideert de
clone-laag zodat de laatste MCP-code wordt gepulld
- update_mcp_worker.yml: gebruikt nu de fresh-build; pullt ook
scrum4me-mcp lokaal (on_failure: continue, sync-only)
- redeploy_all.yml: nieuwe gecombineerde flow (16 stappen, web → worker)
- app/flows/redeploy-all/: UI-pagina + panel, zelfde patroon als de
bestaande flow-pagina's
- app/flows/page.tsx: Redeploy All bovenaan de flows-lijst
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds pg_dump_ops_db, list_ops_backups, and cleanup_ops_backups to the
agent command whitelist. Includes a backup_ops_db flow YAML (dump +
30-day retention), and a systemd service/timer for daily automated
backups at 02:00.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Update ops-agent/flows.example/update_scrum4me_web.yml with full
deployment steps: git_status, git_fetch, git_log_ahead, git_pull,
npm_ci, prisma_migrate_deploy, npm_run_build, systemctl_restart,
and smoke test against thuis.jp-visser.nl/api/products
- Add npm_ci, prisma_migrate_deploy, npm_run_build, and
curl_smoke_scrum4me_thuis to commands.yml.example
- Add /flows/update-scrum4me-web UI page with Run and Dry Run buttons,
streaming terminal output, and link to audit log on completion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ops-agent/src/lib/flow-runner.ts: loads YAML flows, validates all steps
against the command whitelist, executes sequentially; supports dry_run
(emits WOULD RUN lines) and on_failure: abort|continue per step
- ops-agent/src/routes/flow.ts: POST /agent/v1/flow { flow_key, dry_run }
streams step_start/stdout/stderr/step_done/done SSE events
- ops-agent/src/index.ts: register flow route, add FLOWS_PATH env var
- ops-agent/flows.example/: three flow definitions — update_scrum4me_web,
update_mcp_worker, update_caddy_config; deploy to /etc/ops-agent/flows/
- ops-agent/commands.yml.example: add curl_smoke_scrum4me_web and
docker_compose_ps_worker smoke-test commands
- app/api/flows/run/route.ts: Next.js proxy — creates FlowRun/FlowStep
DB records per step, forwards SSE stream to browser
- hooks/useFlowRun.ts: add startFlow(flowKey, dryRun) method; handle
step_start events to display step headers in the terminal
- components/StreamingTerminal.tsx: add 'info' line type (sky-400) for
step headers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>