feat(backup): 备份/恢复异步化,解决 504 超时

POST /backups 和 POST /backups/:id/restore 改为异步:立即返回 HTTP 202,
后台 goroutine 独立执行 pg_dump → gzip → S3 上传,前端每 2s 轮询状态。

后端:
- 新增 StartBackup/StartRestore 方法,后台 goroutine 不依赖 HTTP 连接
- Graceful shutdown 等待活跃操作完成,启动时清理孤立 running 记录
- BackupRecord 新增 progress/restore_status 字段支持进度和恢复状态追踪

前端:
- 创建备份/恢复后轮询 GET /backups/:id 直到完成或失败
- 标签页切换暂停/恢复轮询,组件卸载清理定时器
- 正确处理 409(备份进行中)和轮询超时

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
QTom
2026-03-16 20:03:08 +08:00
parent f42c8f2abe
commit c1fab7f8d8
9 changed files with 780 additions and 68 deletions

View File

@@ -1025,7 +1025,12 @@ export default {
createBackup: 'Create Backup',
backing: 'Backing up...',
backupCreated: 'Backup created successfully',
expireDays: 'Expire Days'
expireDays: 'Expire Days',
alreadyInProgress: 'A backup is already in progress',
backupRunning: 'Backup in progress...',
backupFailed: 'Backup failed',
restoreRunning: 'Restore in progress...',
restoreFailed: 'Restore failed',
},
columns: {
status: 'Status',
@@ -1042,6 +1047,11 @@ export default {
completed: 'Completed',
failed: 'Failed'
},
progress: {
pending: 'Preparing',
dumping: 'Dumping database',
uploading: 'Uploading',
},
trigger: {
manual: 'Manual',
scheduled: 'Scheduled'

View File

@@ -1047,7 +1047,12 @@ export default {
createBackup: '创建备份',
backing: '备份中...',
backupCreated: '备份创建成功',
expireDays: '过期天数'
expireDays: '过期天数',
alreadyInProgress: '已有备份正在进行中',
backupRunning: '备份进行中...',
backupFailed: '备份失败',
restoreRunning: '恢复进行中...',
restoreFailed: '恢复失败',
},
columns: {
status: '状态',
@@ -1064,6 +1069,11 @@ export default {
completed: '已完成',
failed: '失败'
},
progress: {
pending: '准备中',
dumping: '导出数据库',
uploading: '上传中',
},
trigger: {
manual: '手动',
scheduled: '定时'