Files
parking_solution/packages/db/drizzle/meta/_journal.json
T
julian 84f00db48b
Build desktop / desktop (push) Successful in 4m17s
Build & push images / images (push) Failing after 39s
CI / check (push) Successful in 39s
feat(backup): admin-tunable retention + BACKUP_KEY as a Komodo secret
Retention (keep-last / keep-daily-days) is operational policy the on-site admin
should tune, not a server env var requiring a redeploy -- same reasoning that moved
the target directory to the UI.

- Migration 0017: site_config.backup_keep_last + backup_keep_daily_days (nullable;
  null = code default 7 / 30 per field).
- BackupService reads retention fresh each run; status() exposes keepLast +
  keepDailyDays. DEFAULT_BACKUP_RETENTION is now a pure code default (env reads gone).
- PUT /api/backup/config accepts keepLast / keepDailyDays (non-negative int, or null
  to reset to default; 400 on negative).
- UI: two retention fields on the Backup config card; one Save covers target +
  retention. i18n sq + en.

BACKUP_KEY wired into Komodo:
- komodo/resources.toml: BACKUP_KEY=[[park_buzi_backup_key]] (per-booth secret,
  alongside JWT / signing keys).
- komodo/.env.komodo.example: documents it as the ONLY backup env var -- escrow it
  offsite alongside EVENT_SIGNING_KEY (recovery needs both); target + retention are
  admin-chosen in the UI / DB, not env. Server .env.example trimmed to just BACKUP_KEY.

Also carries the small in-progress setup-intro i18n copy trim.

Tests: 218 server tests green, incl. retention persist / reset-to-default / reject-
negative and the updated status shape. Migration applies cleanly (needed a
statement-breakpoint between the two ALTERs). Wiki backup-recovery updated.

Claude-Session: https://claude.ai/code/session_01Xcm6ikLgGoCxxHrxtjkk5V
2026-06-29 12:52:18 +02:00

132 lines
2.6 KiB
JSON

{
"version": "7",
"dialect": "sqlite",
"entries": [
{
"idx": 0,
"version": "6",
"when": 1781632874398,
"tag": "0000_baseline",
"breakpoints": true
},
{
"idx": 1,
"version": "6",
"when": 1781682176094,
"tag": "0001_neat_slipstream",
"breakpoints": true
},
{
"idx": 2,
"version": "6",
"when": 1781713560438,
"tag": "0002_panoramic_tiger_shark",
"breakpoints": true
},
{
"idx": 3,
"version": "6",
"when": 1781774228086,
"tag": "0003_early_hawkeye",
"breakpoints": true
},
{
"idx": 4,
"version": "6",
"when": 1781800000000,
"tag": "0004_subscriptions_rename",
"breakpoints": true
},
{
"idx": 5,
"version": "6",
"when": 1781884800000,
"tag": "0005_site_timezone",
"breakpoints": true
},
{
"idx": 6,
"version": "6",
"when": 1781884900000,
"tag": "0006_site_default_category",
"breakpoints": true
},
{
"idx": 7,
"version": "6",
"when": 1781885000000,
"tag": "0007_rbac",
"breakpoints": true
},
{
"idx": 8,
"version": "6",
"when": 1781885100000,
"tag": "0008_user_profile_theme",
"breakpoints": true
},
{
"idx": 9,
"version": "6",
"when": 1781885200000,
"tag": "0009_app_logs",
"breakpoints": true
},
{
"idx": 10,
"version": "6",
"when": 1781885300000,
"tag": "0010_subscription_plans",
"breakpoints": true
},
{
"idx": 11,
"version": "6",
"when": 1781885400000,
"tag": "0011_subscription_plan_v2",
"breakpoints": true
},
{
"idx": 12,
"version": "6",
"when": 1781885500000,
"tag": "0012_soft_delete",
"breakpoints": true
},
{
"idx": 13,
"version": "6",
"when": 1781885600000,
"tag": "0013_anpr_entry_toggle",
"breakpoints": true
},
{
"idx": 14,
"version": "6",
"when": 1781885700000,
"tag": "0014_user_font_scale",
"breakpoints": true
},
{
"idx": 15,
"version": "6",
"when": 1781885800000,
"tag": "0015_dingtian_qr_reader_driverid",
"breakpoints": true
},
{
"idx": 16,
"version": "6",
"when": 1781885900000,
"tag": "0016_backup_target_dir",
"breakpoints": true
},
{
"idx": 17,
"version": "6",
"when": 1781886000000,
"tag": "0017_backup_retention",
"breakpoints": true
}
]
}