diff --git a/backend/services/docker-compose.2.0-snapshot.yml b/backend/services/docker-compose.2.0-snapshot.yml index 3a30bb83..cd2d2525 100644 --- a/backend/services/docker-compose.2.0-snapshot.yml +++ b/backend/services/docker-compose.2.0-snapshot.yml @@ -14,6 +14,7 @@ services: context: ./snapshot-service dockerfile: Dockerfile container_name: rwa-snapshot-service-2 + restart: unless-stopped ports: - "3199:3199" environment: diff --git a/backend/services/snapshot-service/src/api/controllers/snapshot.controller.ts b/backend/services/snapshot-service/src/api/controllers/snapshot.controller.ts index 1ec151ea..efa3d23d 100644 --- a/backend/services/snapshot-service/src/api/controllers/snapshot.controller.ts +++ b/backend/services/snapshot-service/src/api/controllers/snapshot.controller.ts @@ -85,6 +85,11 @@ export class SnapshotController { @Delete(':id') @ApiOperation({ summary: '删除备份' }) async deleteSnapshot(@Param('id') id: string) { + const task = await this.repo.findById(id); + if (!task) throw new NotFoundException('备份任务不存在'); + if (task.status === 'RUNNING') { + throw new ConflictException('备份任务正在执行中,无法删除,请等待完成后再操作'); + } await this.orchestrator.deleteSnapshot(id); return { message: '备份已删除' }; } diff --git a/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts b/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts index 885ea12a..c48b32c3 100644 --- a/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts +++ b/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts @@ -185,6 +185,10 @@ export class SnapshotOrchestratorService implements OnModuleInit { const task = await this.repo.findById(taskId); if (!task) throw new Error(`任务不存在: ${taskId}`); + if (task.status === SnapshotStatus.RUNNING) { + throw new Error('备份任务正在执行中,无法删除,请等待完成后再操作'); + } + if (task.storageType === StorageType.LOCAL) { this.localStorage.deleteTask(taskId); } else if (task.storageType === StorageType.MINIO) { diff --git a/backend/services/snapshot-service/src/infrastructure/backup/postgres-backup.handler.ts b/backend/services/snapshot-service/src/infrastructure/backup/postgres-backup.handler.ts index aa27a683..968e68bb 100644 --- a/backend/services/snapshot-service/src/infrastructure/backup/postgres-backup.handler.ts +++ b/backend/services/snapshot-service/src/infrastructure/backup/postgres-backup.handler.ts @@ -119,10 +119,16 @@ export class PostgresBackupHandler implements BackupHandler { if (dumpExitCode === null || gzipExitCode === null) return; if (dumpExitCode === 0 && gzipExitCode === 0) { - const stat = fs.statSync(filePath); - this.logger.log(`PostgreSQL 备份完成: ${fileName}, 压缩后: ${stat.size} bytes, 原始输出: ${bytesRead} bytes`); - onProgress(100, 'PostgreSQL 备份完成'); - resolve({ fileName, filePath, fileSize: stat.size }); + try { + const stat = fs.statSync(filePath); + this.logger.log(`PostgreSQL 备份完成: ${fileName}, 压缩后: ${stat.size} bytes, 原始输出: ${bytesRead} bytes`); + onProgress(100, 'PostgreSQL 备份完成'); + resolve({ fileName, filePath, fileSize: stat.size }); + } catch (err) { + const msg = `备份文件不可访问 (可能已被删除): ${filePath}`; + this.logger.error(msg); + reject(new Error(msg)); + } } else { const error = `pg_dumpall 退出码: ${dumpExitCode}, gzip 退出码: ${gzipExitCode}, stderr: ${stderrBuffer.slice(-500)}`; this.logger.error(error);