Skip to content

Backup credentials (5): operator UI — onboarding, escrow, scheduling, stats#227

Open
passcod wants to merge 2 commits into
component-jobs-maintfrom
component-operator-ui
Open

Backup credentials (5): operator UI — onboarding, escrow, scheduling, stats#227
passcod wants to merge 2 commits into
component-jobs-maintfrom
component-operator-ui

Conversation

@passcod

@passcod passcod commented Jun 16, 2026

Copy link
Copy Markdown
Member

🤖 Component 5 — operator UI for backup-credentials onboarding/escrow/scheduling/stats. Stacked on the component-4 detection PR (base component-jobs-detect); a sibling of #226. Review #223/#224/#225 first.

private-server /api/backups/* (TailscaleAdmin-gated except read endpoints)

get / list / create / update / set_schedule / create_repo / reveal_escrow / ack_escrow / request_now / cancel_request / stats / delete. Reconciled to the real (group, type) model — expected_interval/retention live on server_group_backup_schedule per type (added backups_set_schedule + BackupConfigView.schedules); request_now is type-aware. No new AppError variants.

DB

New migration backup_config_lifecycle_columns adds mode (from_birth|import, CHECK), last_init_error, escrow_acked_at, escrow_acked_by to server_group_backup_config; BackupRepoMode enum + a typed RetentionPolicy (floor-validated) in database::backups.

private-web

New routes BackupConfig / BackupEscrow / BackupPanel, wired into GroupDetail; e2e/backups.spec.ts (9 tests, all pass) + seed helpers.

Cross-cutting fixes (flagged for reconciliation)

Verification

cargo check --workspace --tests ✅; just typecheck ✅; private-server + database backups tests 24/24; e2e 9/9; just gen-openapi run + committed.

Stubbed pending component 3 (#226)

create_repo only records intent (provisioning, clears last_init_error) — it does not spawn the init Job; the UI observes the status/last_init_error fields. reveal_escrow reads the k8s Secret (502 when kube unavailable, e.g. tests). Reconciliation note: RetentionPolicy now exists both here (database::backups) and in #226 (commons-servers::backup_jobs) — consolidate to one on final integration.

Part of TAM-6877.

🤖 Generated with Claude Code

@passcod passcod force-pushed the component-operator-ui branch from 7673056 to de58aca Compare June 16, 2026 02:31
@passcod passcod force-pushed the component-jobs-detect branch from faa4831 to a1f8ef3 Compare June 16, 2026 02:31
@passcod passcod force-pushed the component-operator-ui branch from de58aca to 5295890 Compare June 16, 2026 03:41
@passcod passcod force-pushed the component-jobs-detect branch from a1f8ef3 to 3ffa45a Compare June 16, 2026 03:41
@passcod passcod force-pushed the component-operator-ui branch from 5295890 to fc3c8ab Compare June 16, 2026 04:35
@passcod passcod force-pushed the component-jobs-detect branch from 3ffa45a to af66062 Compare June 16, 2026 04:35
@passcod passcod force-pushed the component-operator-ui branch from fc3c8ab to 7150963 Compare June 16, 2026 06:03
@passcod passcod force-pushed the component-jobs-detect branch 2 times, most recently from 6303de4 to ea05619 Compare June 16, 2026 06:32
@passcod passcod force-pushed the component-operator-ui branch from 7150963 to ca6360c Compare June 16, 2026 06:32
@passcod passcod force-pushed the component-jobs-detect branch from ea05619 to e61e0d9 Compare June 16, 2026 09:38
@passcod passcod force-pushed the component-operator-ui branch 2 times, most recently from 682a275 to 9813603 Compare June 16, 2026 13:29
@passcod passcod force-pushed the component-jobs-detect branch 2 times, most recently from f0ca99b to 8af4282 Compare June 16, 2026 15:58
@passcod passcod force-pushed the component-operator-ui branch 2 times, most recently from f2b3d2e to b572238 Compare June 18, 2026 04:04
@passcod passcod force-pushed the component-jobs-detect branch 2 times, most recently from 3ebbb7d to dfc7b2e Compare June 18, 2026 05:11
@passcod passcod force-pushed the component-operator-ui branch from b572238 to a89532e Compare June 18, 2026 05:11
@passcod passcod force-pushed the component-jobs-detect branch from dfc7b2e to 1105e20 Compare June 18, 2026 06:05
@passcod passcod force-pushed the component-operator-ui branch 2 times, most recently from 21c7b8a to 8e6541f Compare June 18, 2026 07:03
@passcod passcod force-pushed the component-jobs-detect branch from 1105e20 to 1c6c756 Compare June 18, 2026 07:03
@passcod passcod changed the base branch from component-jobs-detect to component-jobs-maint June 18, 2026 09:11
@passcod passcod force-pushed the component-operator-ui branch from 8e6541f to 05a10fe Compare June 18, 2026 09:47
@passcod passcod force-pushed the component-jobs-maint branch 2 times, most recently from e42e9b5 to d894c58 Compare June 18, 2026 10:40
@passcod passcod force-pushed the component-operator-ui branch from 05a10fe to 7c61348 Compare June 18, 2026 10:40
@passcod passcod force-pushed the component-jobs-maint branch from d894c58 to 13b32fc Compare June 18, 2026 12:56
@passcod passcod force-pushed the component-operator-ui branch from 7c61348 to 8fa07dd Compare June 18, 2026 12:56
@passcod passcod force-pushed the component-jobs-maint branch from 13b32fc to f2641ab Compare June 18, 2026 14:39
@passcod passcod force-pushed the component-operator-ui branch from 8fa07dd to d3f7c02 Compare June 18, 2026 14:39
passcod and others added 2 commits June 19, 2026 02:44
…& stats (component 5)

Private-server /api/backups/* TailscaleAdmin-gated fns + the private-web
React screens that drive the group backup lifecycle:

- backups_{get,list,create,update,set_schedule,create_repo,reveal_escrow,
  ack_escrow,request_now,cancel_request,stats,delete}
- BackupPanel (status/stats/runs/backup-now), BackupConfig (onboarding +
  edit, retention-floor validation, manual-only toggle), BackupEscrow
  (reveal-once + Bitwarden ack), GroupDetail backups card.

DB: adds server_group_backup_config lifecycle columns (mode, last_init_error,
escrow_acked_at/by) via migration; RetentionPolicy typed struct + floor
validation; BackupRepoMode enum. private-server gains a kube Secret reader
(reuses public-server BackupSecrets) for escrow reveal.

Fixes the text_enum! ToSchema to emit serde-renamed wire strings so the
generated TS unions match the lowercase JSON.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ed issue (nullable server_id) handling + spec refresh
@passcod passcod force-pushed the component-operator-ui branch from d3f7c02 to fec1b78 Compare June 18, 2026 14:44
@passcod passcod force-pushed the component-jobs-maint branch from f2641ab to 86a6024 Compare June 18, 2026 14:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant