2
0
Эх сурвалжийг харах

Merge remote-tracking branch 'upstream/monorepo' into monorepo

yourname 3 сар өмнө
parent
commit
462e575d14

+ 4 - 5
.claude/settings.local.json

@@ -37,11 +37,10 @@
       "Bash(xargs sed:*)",
       "Bash(git diff:*)",
       "Bash(pnpm build)",
-      "Bash(pnpm run typecheck:*)",
-      "Bash(curl:*)",
-      "Bash(pnpm run build:weapp:*)",
-      "SlashCommand(/BMad:agents:pm create-brownfield-epic)",
-      "SlashCommand(/BMad:agents:pm:*)"
+      "Bash(pnpm db:backup:*)",
+      "Bash(pnpm db:backup:list:*)",
+      "Bash(pnpm db:backup:cleanup:*)",
+      "Bash(pnpm db:restore)"
     ],
     "deny": [],
     "ask": []

+ 3 - 3
web/package.json

@@ -29,9 +29,9 @@
     "db:seed": "tsx scripts/seed.ts",
     "db:reset": "tsx scripts/reset-db.ts",
     "db:backup": "tsx src/server/utils/backup.ts backup",
-    "db:restore": "tsx src/server/utils/restore.ts restore",
-    "db:backup:list": "tsx src/server/utils/restore.ts list",
-    "db:backup:latest": "tsx src/server/utils/restore.ts latest",
+    "db:restore": "tsx src/server/utils/backup.ts restore",
+    "db:backup:list": "tsx src/server/utils/backup.ts list",
+    "db:backup:latest": "tsx src/server/utils/backup.ts latest",
     "db:backup:cleanup": "tsx src/server/utils/backup.ts cleanup",
     "test:analyze": "node scripts/analyze-test-results.js",
     "lint": "eslint . --ext .ts,.tsx",

+ 49 - 0
web/src/server/utils/backup.ts

@@ -0,0 +1,49 @@
+import { databaseBackup } from '@d8d/server/utils/backup'
+import { promises as fs } from 'fs'
+import path from 'path'
+import process from 'node:process'
+
+const BACKUP_DIR = process.env.BACKUP_DIR || './backups'
+
+async function main() {
+  const command = process.argv[2]
+
+  switch (command) {
+    case 'backup':
+      await databaseBackup.createBackup()
+      break
+    case 'restore':
+      const backupFile = process.argv[3]
+      if (!backupFile) {
+        console.error('请指定要恢复的备份文件')
+        process.exit(1)
+      }
+      // 如果备份文件不包含路径,则在备份目录中查找
+      const fullBackupPath = backupFile.includes('/') ? backupFile : path.join(BACKUP_DIR, backupFile)
+      await databaseBackup.restoreBackup(fullBackupPath)
+      break
+    case 'cleanup':
+      await databaseBackup.cleanupOldBackups()
+      break
+    case 'list':
+      const files = await fs.readdir(BACKUP_DIR)
+      const backupFiles = files.filter(f => f.endsWith('.dump'))
+      console.log('可用备份文件:')
+      backupFiles.forEach(file => console.log(`  - ${file}`))
+      break
+    case 'latest':
+      const latestFiles = await fs.readdir(BACKUP_DIR)
+      const latestBackupFiles = latestFiles.filter(f => f.endsWith('.dump')).sort().reverse()
+      if (latestBackupFiles.length > 0) {
+        console.log(latestBackupFiles[0])
+      } else {
+        console.log('没有找到备份文件')
+      }
+      break
+    default:
+      console.log('用法: node backup.ts [backup|restore <file>|cleanup|list]')
+      process.exit(1)
+  }
+}
+
+main().catch(console.error)