|
| 1 | +const { query, get, transaction } = require('./database'); |
| 2 | +const fs = require('fs'); |
| 3 | +const path = require('path'); |
| 4 | +const { execSync } = require('child_process'); |
| 5 | + |
1 | 6 | /** |
2 | | - * 数据库自动迁移与核查模块 |
3 | | - * 负责在系统启动时确保数据库健康,并在受保护的情况下修复结构 |
| 7 | + * 创建数据库备份 |
4 | 8 | */ |
| 9 | +async function createBackup() { |
| 10 | + const DB_TYPE = process.env.DB_TYPE || 'sqlite'; |
| 11 | + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); |
| 12 | + const backupDir = path.resolve(process.cwd(), './data/backups'); |
5 | 13 |
|
6 | | -const { query, get, transaction } = require('./database'); |
| 14 | + try { |
| 15 | + if (!fs.existsSync(backupDir)) { |
| 16 | + fs.mkdirSync(backupDir, { recursive: true }); |
| 17 | + } |
| 18 | + |
| 19 | + if (DB_TYPE === 'sqlite') { |
| 20 | + const dbPath = process.env.SQLITE_PATH || './data/carnote.db'; |
| 21 | + const sourcePath = path.resolve(process.cwd(), dbPath); |
| 22 | + const backupPath = path.join(backupDir, `carnote_backup_${timestamp}.db`); |
| 23 | + |
| 24 | + if (fs.existsSync(sourcePath)) { |
| 25 | + fs.copyFileSync(sourcePath, backupPath); |
| 26 | + console.log(`[备份] SQLite 数据库已备份至: ${backupPath}`); |
| 27 | + } |
| 28 | + } else if (DB_TYPE === 'postgresql') { |
| 29 | + const host = process.env.PG_HOST || 'localhost'; |
| 30 | + const port = process.env.PG_PORT || 5432; |
| 31 | + const database = process.env.PG_DATABASE || 'carnote'; |
| 32 | + const user = process.env.PG_USER || 'postgres'; |
| 33 | + const password = process.env.PG_PASSWORD; |
| 34 | + |
| 35 | + const backupPath = path.join(backupDir, `carnote_backup_${timestamp}.sql`); |
| 36 | + |
| 37 | + // 构建 pg_dump 命令 |
| 38 | + // 注意:这要求运行环境安装了 postgresql-client |
| 39 | + const env = { ...process.env, PGPASSWORD: password }; |
| 40 | + try { |
| 41 | + execSync(`pg_dump -h ${host} -p ${port} -U ${user} -f "${backupPath}" ${database}`, { env }); |
| 42 | + console.log(`[备份] PostgreSQL 数据库已备份至: ${backupPath}`); |
| 43 | + } catch (err) { |
| 44 | + console.warn(`[备份] PostgreSQL 自动备份失败 (可能未安装 pg_dump): ${err.message}`); |
| 45 | + // 仅警告,不中断启动 |
| 46 | + } |
| 47 | + } |
| 48 | + } catch (error) { |
| 49 | + console.error(`[备份] 数据库备份过程中出错:`, error); |
| 50 | + } |
| 51 | +} |
7 | 52 |
|
8 | 53 | async function autoMigrate() { |
9 | 54 | console.log('开始检测数据库迁移...'); |
| 55 | + |
| 56 | + // 迁移前强制执行备份 |
| 57 | + await createBackup(); |
| 58 | + |
10 | 59 | const DB_TYPE = process.env.DB_TYPE || 'sqlite'; |
11 | 60 |
|
12 | 61 | try { |
|
0 commit comments