feat(backup): replace JSON import/export with SQLite database backup system

Replace the JSON-based import/export with a proper backup system that copies
the SQLite database file directly. Supports manual on-demand backups, periodic
scheduled backups via node-cron, configurable retention, file download, and
full database restore.

- Add backupService with VACUUM INTO for safe DB copies
- Add backupScheduler following healthcheckScheduler pattern
- Add 6 admin API endpoints (create, list, download, restore, delete, schedule)
- Add BackupPanel UI with backup table, confirmation dialogs, schedule config
- Add backup fields to SystemSettings schema
- Remove old ImportExportPanel, exportService, importService, and related code
This commit is contained in:
2026-04-02 23:16:18 +03:00
parent d479726fe3
commit b0439e39c4
24 changed files with 1079 additions and 1183 deletions
+31 -16
View File
@@ -235,22 +235,37 @@
"admin.discovery_traefik_url": "Traefik API URL",
"admin.discovery_traefik_url_hint": "Traefik dashboard API base URL (e.g. http://traefik:8080). Set via TRAEFIK_API_URL env var.",
"admin.import_export_title": "Import / Export",
"admin.import_export_description": "Export all data (apps, boards, groups, settings) as JSON, or import from a previously exported file.",
"admin.export_section": "Export Data",
"admin.export_button": "Export JSON",
"admin.export_exporting": "Exporting...",
"admin.export_success": "Export downloaded successfully.",
"admin.import_section": "Import Data",
"admin.import_select_file": "Select a JSON export file",
"admin.import_preview": "Preview",
"admin.import_mode_label": "Conflict Resolution",
"admin.import_mode_skip": "Skip existing (keep current data)",
"admin.import_mode_overwrite": "Overwrite existing (replace with imported data)",
"admin.import_button": "Import",
"admin.import_importing": "Importing...",
"admin.import_success": "Import completed.",
"admin.import_invalid_json": "Selected file is not valid JSON.",
"admin.backup_title": "Database Backup",
"admin.backup_description": "Create, restore, and schedule backups of your database. Backups are full copies of the SQLite database file.",
"admin.backup_create": "Create Backup",
"admin.backup_creating": "Creating...",
"admin.backup_create_success": "Backup created successfully.",
"admin.backup_list_title": "Backups",
"admin.backup_list_empty": "No backups yet. Create your first backup above.",
"admin.backup_filename": "Filename",
"admin.backup_size": "Size",
"admin.backup_date": "Created",
"admin.backup_actions": "Actions",
"admin.backup_download": "Download",
"admin.backup_restore": "Restore",
"admin.backup_delete": "Delete",
"admin.backup_restore_confirm_title": "Restore Backup",
"admin.backup_restore_confirm": "Are you sure you want to restore from this backup? This will replace all current data with the backup contents. This action cannot be undone.",
"admin.backup_restore_success": "Database restored successfully. Please reload the page.",
"admin.backup_delete_confirm_title": "Delete Backup",
"admin.backup_delete_confirm": "Are you sure you want to delete this backup? This action cannot be undone.",
"admin.backup_delete_success": "Backup deleted.",
"admin.backup_schedule_title": "Scheduled Backups",
"admin.backup_schedule_enabled": "Enable periodic backups",
"admin.backup_schedule_cron": "Schedule",
"admin.backup_schedule_max_count": "Max backups to keep",
"admin.backup_schedule_preset_daily": "Daily at 3 AM",
"admin.backup_schedule_preset_twice_daily": "Every 12 hours",
"admin.backup_schedule_preset_weekly": "Weekly (Sunday 3 AM)",
"admin.backup_schedule_preset_custom": "Custom cron",
"admin.backup_schedule_save": "Save Schedule",
"admin.backup_schedule_saving": "Saving...",
"admin.backup_schedule_saved": "Backup schedule updated.",
"search.placeholder": "Search apps and boards...",
"search.trigger": "Search...",