feat(flows): add /flows/server-backup page + ops-agent install script #1

Merged
janpeter merged 2 commits from feat/flows-server-backup-page into main 2026-05-15 21:27:35 +02:00
Owner

Tweede entry point voor de server-backup feature (naast /settings/backups), plus een idempotent installer voor het ops-agent gedeelte van de wiring.

Wat dit toevoegt

UI (f01bd55)

  • app/flows/server-backup/page.tsx — breadcrumb + FlowPanel
  • app/flows/server-backup/_components/flow-panel.tsx — één panel met twee acties (Backup now / Run restore test); description + step-lijst wisselen met de gekozen actie; SSE-stream + audit-link
  • app/flows/page.tsx — extra tile in de FLOWS-grid

Wording van confirm-dialogs overgenomen uit app/settings/backups/_components/server-backup-section.tsx zodat beide ingangen consistent blijven.

Install-script (2b03ee0)

  • deploy/server-backup/install-flows.sh — idempotent installer voor de ops-agent zijde:
    1. wrappers naar /srv/backups/scripts/wrappers/
    2. 2 flow-YAMLs naar /etc/ops-agent/flows/
    3. 8 backup-commands appended naar /etc/ops-agent/commands.yml (met .bak.ts backup)
    4. 6 NOPASSWD-regels in /etc/sudoers.d/ops-agent (visudo-validated tegen lockout)
    5. systemctl restart ops-agent
    6. systemctl enable --now server-backup.timer
  • deploy/server-backup/README.md — sectie Ops-agent wiring die naar het script verwijst

End-to-end getest

Na handmatige install op scrum4me-server (21:00 CEST vandaag) draaide een restore-test via curl POST /agent/v1/flow in 4 seconden — alle 4 critical-file assertions ok, exit 0. De vandaag-vroegere automatische backup (15:23) had alle 8 phases success (postgres + forgejo + restic NAS 4m12s + B2 10m17s + forget + check).

Out of scope

  • Restic env/password + repo init — al gedocumenteerd in README Snelle installatie
  • UI-deployment — gebeurt via redeploy_all of update_scrum4me_web na merge
Tweede entry point voor de server-backup feature (naast /settings/backups), plus een idempotent installer voor het ops-agent gedeelte van de wiring. ## Wat dit toevoegt ### UI (f01bd55) - app/flows/server-backup/page.tsx — breadcrumb + FlowPanel - app/flows/server-backup/_components/flow-panel.tsx — één panel met twee acties (Backup now / Run restore test); description + step-lijst wisselen met de gekozen actie; SSE-stream + audit-link - app/flows/page.tsx — extra tile in de FLOWS-grid Wording van confirm-dialogs overgenomen uit app/settings/backups/_components/server-backup-section.tsx zodat beide ingangen consistent blijven. ### Install-script (2b03ee0) - deploy/server-backup/install-flows.sh — idempotent installer voor de ops-agent zijde: 1. wrappers naar /srv/backups/scripts/wrappers/ 2. 2 flow-YAMLs naar /etc/ops-agent/flows/ 3. 8 backup-commands appended naar /etc/ops-agent/commands.yml (met .bak.ts backup) 4. 6 NOPASSWD-regels in /etc/sudoers.d/ops-agent (visudo-validated tegen lockout) 5. systemctl restart ops-agent 6. systemctl enable --now server-backup.timer - deploy/server-backup/README.md — sectie Ops-agent wiring die naar het script verwijst ## End-to-end getest Na handmatige install op scrum4me-server (21:00 CEST vandaag) draaide een restore-test via curl POST /agent/v1/flow in 4 seconden — alle 4 critical-file assertions ok, exit 0. De vandaag-vroegere automatische backup (15:23) had alle 8 phases success (postgres + forgejo + restic NAS 4m12s + B2 10m17s + forget + check). ## Out of scope - Restic env/password + repo init — al gedocumenteerd in README Snelle installatie - UI-deployment — gebeurt via redeploy_all of update_scrum4me_web na merge
Tweede entry point voor de server-backup feature die in ab87c0f + 20de584
is opgezet. Geeft de bestaande server_backup_full en server_backup_restore_test
flows een eigen plek in de /flows/-index, naast redeploy-all / update-caddy /
update-scrum4me-web.

Eén panel met twee knoppen ('Backup now' / 'Run restore test'); de
description- en step-lijst wisselen mee met de actief gekozen flow. Bevestig-
dialog en confirm-body hergebruiken de wording uit
app/settings/backups/_components/server-backup-section.tsx zodat beide
ingangen consistent blijven. SSE-stream via dezelfde useFlowRun hook;
audit-link na afloop net als redeploy-all.

De settings/backups-page (status + config) raakt niet aangepast — bewust
behouden als tweede ingang voor wie al op die pagina is.

Files:
- app/flows/server-backup/page.tsx                       (new, breadcrumb + panel)
- app/flows/server-backup/_components/flow-panel.tsx     (new, dual-action UI)
- app/flows/page.tsx                                     (+1 entry in FLOWS array)

Server-side commands.yml en /etc/ops-agent/flows/*.yml moeten nog
gedeployed worden — zonder die geeft ops-agent 'flow_key not found' terug.
Deployment-script komt los.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds deploy/server-backup/install-flows.sh — een idempotent installer die
de ops-agent-zijde van de server-backup feature aan elkaar plakt:

  1. wrappers/*.sh                 → /srv/backups/scripts/wrappers/
  2. flows.example/server_backup_* → /etc/ops-agent/flows/
  3. commands.yml.example commands → /etc/ops-agent/commands.yml (append, met backup)
  4. NOPASSWD-regels voor wrappers → /etc/sudoers.d/ops-agent (visudo-validated)
  5. systemctl restart ops-agent
  6. systemctl enable --now server-backup.timer

Wat het bewust *niet* doet (staat in scriptheader): restic env/password
aanmaken, repos initialiseren, base-scripts of systemd-units plaatsen —
die secrets-stappen blijven handwerk per README "Snelle installatie".

Re-run safe:
- cmp-check per file in stappen 1-2 (skip als identiek)
- grep-check op command-name in stap 3 (skip als al aanwezig)
- visudo-validatie in stap 4 voorkomt lockout bij syntax-fout
- backups van mutaties: commands.yml.bak.<ts> en sudoers.d/ops-agent.bak.<ts>

Regex-fix t.o.v. eerste handmatige run vandaag: command-block-extractie
gebruikt nu [a-z0-9_]+ ipv [a-z_]+, zodat namen met digits (restic_*_b2)
als losse blocks gezien worden. Het oude pattern miste ze maar sleepte
ze toevallig mee in het vorige block — eindresultaat correct, output
misleidend. Nieuwe versie faalt expliciet als een command echt ontbreekt.

README aangevuld met sectie "Ops-agent wiring (na stap 1-7)" die naar
het script verwijst.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Ops-dashboard!1
No description provided.