feat: SQLite 定期备份内置进二进制
SQLite 是单文件、没有外部主从,坏一份就是全丢,而 data/ 一直被 gitignore、 此前没有任何备份。备份做进二进制,不依赖外部 cron / systemd timer。 - 快照用 VACUUM INTO,不用 cp 主库:服务边跑边写时 cp 可能拷到写了一半的页 - 启动时补一次,之后每小时醒一次看是否到期;默认间隔 24h、保留最近 7 份 - 产出自检 SQLite 文件头,不合格即删并报错,不留「看着像备份的废物」 - 新增 -backup 子命令,供升级 / 迁移 / 交付前手工备一份 - 落 data/backups/ —— systemd 单元是 ProtectSystem=strict,只放开了 data/ 可写 - 边界写进文档:只防误删 / 误改 / 写坏,不防整盘损坏,跨机保存仍需人工 配套: - deploy/DELIVERY.md 新增第 7 节「数据备份与恢复」+ 红线条目 - clonezilla-cleanup.sh 提示克隆前清空 data/backups/,避免原型机测试数据被带走 - deploy/eaisalestrain.env 补 4 个备份环境变量 - PROJECT_STATE.md 记 D24 另:清理 worker_task 中 17 条没聊过天的历史空任务(id 1-11、13-18), 删前先备份、清单经确认,删除程序带「命中数与白名单不一致即中止」保险。 该项为一次性数据操作,不产生代码改动。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@ package main
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
@@ -20,6 +21,9 @@ func main() {
|
||||
case "-reset-admin":
|
||||
resetAdmin(os.Args[2:])
|
||||
return
|
||||
case "-backup":
|
||||
backupOnce()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +36,12 @@ func main() {
|
||||
log.Fatalf("种子数据初始化失败: %v", err)
|
||||
}
|
||||
|
||||
// 定期备份:SQLite 是单文件且无外部副本,坏一份就是全丢。
|
||||
// 失败只在日志里报,绝不因此拦下服务。
|
||||
if cfg.BackupEnabled {
|
||||
store.StartBackupLoop(store.DB, cfg.DBPath, cfg.BackupDir, cfg.BackupKeep, cfg.BackupIntervalHours)
|
||||
}
|
||||
|
||||
r := gin.Default()
|
||||
|
||||
api.RegisterRoutes(r, cfg)
|
||||
@@ -42,6 +52,20 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
// backupOnce 手工备份一次后退出:eai_agentplatform-server -backup
|
||||
// 用于升级/迁移/交付前留一份手边的副本,比等定期那份更让人放心。
|
||||
func backupOnce() {
|
||||
cfg := config.Load()
|
||||
if _, err := store.Init(cfg.DBPath); err != nil {
|
||||
log.Fatalf("数据库初始化失败: %v", err)
|
||||
}
|
||||
path, err := store.Backup(store.DB, cfg.BackupDir, cfg.BackupKeep, time.Now())
|
||||
if err != nil {
|
||||
log.Fatalf("备份失败: %v", err)
|
||||
}
|
||||
log.Printf("[OK] 已备份到 %s", path)
|
||||
}
|
||||
|
||||
// resetAdmin 交付前重置管理员密码:eai_agentplatform-server -reset-admin <新密码>
|
||||
func resetAdmin(args []string) {
|
||||
if len(args) < 1 || args[0] == "" {
|
||||
|
||||
Reference in New Issue
Block a user