feat(database): add managed backup and offline restore (#6359)

This commit is contained in:
InfinityPacer
2026-08-19 17:34:32 +08:00
committed by GitHub
parent f4a879b3de
commit f700db5ac8
27 changed files with 1576 additions and 80 deletions
+20
View File
@@ -189,6 +189,17 @@ class ConfigModel(BaseModel):
# 例如经 PgBouncer 事务模式接入时 asyncpg 需要 {"statement_cache_size": 0}
DB_CONNECT_ARGS: dict = Field(default_factory=dict)
# ==================== 数据库备份配置 ====================
# 是否启用主程序数据库自动备份
DB_BACKUP_ENABLE: bool = False
# 定时备份的 Cron 表达式,留空时不注册定时任务
DB_BACKUP_CRON: str = "0 3 * * *"
# 备份根目录;未配置时使用 CONFIG_PATH/database_backup
DB_BACKUP_PATH: Optional[str] = None
# 本地备份的保留天数,0 表示不按时间清理
DB_BACKUP_RETENTION_DAYS: int = 30
# 本地备份的最大保留份数,0 表示不按数量清理
DB_BACKUP_MAX_COUNT: int = 30
# ==================== 数据清理配置 ====================
# 是否启用数据表定时清理
DATA_CLEANUP_ENABLE: bool = False
@@ -1074,6 +1085,15 @@ class Settings(BaseSettings, ConfigModel, LogConfigModel):
"""返回插件持久化数据目录。"""
return self.CONFIG_PATH / "plugins"
@property
def DATABASE_BACKUP_PATH(self) -> Path:
"""返回数据库备份根目录,允许相对当前配置目录进行配置。"""
configured = str(self.DB_BACKUP_PATH or "").strip()
if not configured:
return self.CONFIG_PATH / "database_backup"
path = Path(configured).expanduser()
return path if path.is_absolute() else self.CONFIG_PATH / path
@property
def LOG_PATH(self):
"""返回应用日志目录。"""