Expand description
备份/恢复(双模式 + 任务进度)。 备份与恢复(读写,最高风险)。
备份:探测 pg_dump 可用性——可用则子进程生成完整、角色无关的 .sql
(--clean --if-exists --no-owner --no-privileges),不可用则回退纯 SQL(仅数据)。
备份文件含签名头。每次备份按设置附带 uploads 素材打包(_uploads.tar.gz,
排除可重建的 .cache/),与 .sql 成对展示/下载/删除。
来源标记:手动备份文件名前缀 backup_,定时任务自动备份前缀 auto_;
自动备份按 backup_retention_count 轮转(只删自动,手动永不自动删)。
恢复:仅接受本系统生成的备份(签名校验)+ 二次确认 + 路径穿越防护;
旧备份的 pg_dump 属主语句会在 COPY 感知的预处理阶段移除,再由
psql --single-transaction -v ON_ERROR_STOP=1 原子重放,失败时完整回滚;
仅恢复数据库——uploads 需从配对 tar.gz 手动还原;成功后全量失效缓存。
长耗时操作走后台任务 + 进度轮询(见 crate::api::database::tasks)。
导入:POST /api/database/backups/import(纯 Axum 路由,multipart 流式落盘)
把本机备份回灌进 backups/。两步式——导入只入库,恢复仍走上述管线。
导入时即强制签名校验(外来 SQL 拒收不留盘);保留原始文件名、同名冲突拒绝;
.tmp 落盘 + 原子 rename,半截文件永不出现在列表。上限 BACKUP_IMPORT_MAX_MB
(默认 512MB),路由层 DefaultBodyLimit + 流式计数双保险。
兼容性提示:--clean --if-exists 是后加的备份参数。本修复之前生成的备份
文件不含 DROP,对其执行恢复会在第一条「relation already exists」处中止并报
失败(行为正确,但无法恢复数据)——需重新创建备份才能恢复。
Structs§
- Backup
Info - 备份文件元信息(列表展示用)。
- Backup
RunOutcome 🔒 - 一次备份运行的结果(调度任务据此落库 last_run)。
- Prepared
Restore 🔒Sql
Enums§
- Backup
Origin 🔒 - 备份来源:决定文件名前缀与是否参与自动轮转。
Constants§
- BACKUP_
DIR 🔒 - 备份目录(项目根,与 uploads/ 平级,gitignored)。
- BACKUP_
SIGNATURE 🔒 - 备份文件签名头(恢复时校验,拒绝非本系统文件)。
- DEFAULT_
IMPORT_ 🔒MAX_ MB - 导入单文件上限默认值(MB),env
BACKUP_IMPORT_MAX_MB覆盖。 - FILENAME_
RE 🔒 - 文件名白名单正则:仅字母数字下划线点连字符(防路径穿越)。
- MULTIPART_
FRAME_ 🔒SLACK - multipart 框架开销宽限(boundary/头部),加在路由 body limit 上, 避免恰好等于上限的文件被框架字节误杀(流式计数只计载荷字节,才是权威)。
Functions§
- backup_
partition_ 🔒free_ space - 查询 backups/ 所在文件系统的可用空间(取最长挂载点前缀的磁盘)。 预检用途:探测失败返回 None,降级为跳过预检(写入失败仍会清理并报错)。
- backup_
path 🔒 - 构造 backups/ 下的安全路径(额外防御:校验规范化后仍在 BACKUP_DIR 内)。
- create_
backup - 发起备份,立即返回 task_id,后台任务执行。
- create_
uploads_ 🔒tarball - 把 uploads 目录打成 tar.gz(排除可重建的 .cache/ 与 VCS 占位 .gitkeep)。 阻塞 IO + CPU(gzip),调用方须放 spawn_blocking。 uploads_dir 显式传入(而非写死相对路径)便于测试注入临时目录。
- delete_
backup - 删除备份文件(连同配对的 uploads 打包;配对缺失不视为错误)。
- download_
backup - Axum 处理器:下载备份文件(admin 鉴权 + 路径白名单)。 仅 server 构建:纯 Axum 路由(在 main.rs 注册),无 WASM 消费者。
- has_
valid_ 🔒signature - 校验备份文件首行是否含本系统签名头。 提取为纯函数:把首行(或全文)作为参数传入,便于单测。
- import_
backup - Axum 处理器:导入备份(multipart 流式落盘,admin 鉴权 + 签名校验 + 同名拒绝)。
- import_
max_ 🔒bytes - 导入单文件上限(字节):env
BACKUP_IMPORT_MAX_MB(MB 为单位),默认 512MB。 main.rs 路由 DefaultBodyLimit 与 handler 流式计数共用此值。 - is_
legacy_ 🔒pg_ dump_ owner_ statement - is_
valid_ 🔒backup_ filename - 校验备份文件名是否符合白名单(仅字母数字下划线点连字符)。 返回 true 表示安全可用。提取为纯函数便于单测覆盖路径穿越边界。
- list_
backups - 列出 backups/ 目录下的备份文件元信息。
- parse_
backup_ 🔒mode - 从备份文件全文提取
-- mode: <value>行的值(如 “pg_dump”/“sql-fallback”)。 提取为纯函数:把文件内容作为参数传入,便于单测。 缺失或格式不符返回 “unknown”。 - pg_
dump_ 🔒command - pg_dump 模式:子进程生成完整备份(含 schema),前置签名头。
- psql_
restore_ 🔒command - read_
first_ 🔒line - 仅读取文件首行(用于签名校验,避免把整个备份文件读入内存)。
- read_
first_ 🔒lines - 读取文件前
n行(用于解析-- mode:等头部元信息,避免整文件读入内存)。 不足n行时返回实际读到的行;任一行读取失败则整体返回该错误。 - restore_
backup - 发起恢复:校验签名 + 路径穿越防护 + 二次确认,立即返回 task_id。
- rotate_
auto_ 🔒backups - 执行自动备份轮转:删除超龄自动备份的 .sql 与配对 tar.gz。 单个删除失败只记日志,不中断其余。
- run_
auto_ 🔒backup - 定时任务入口:注册任务后执行自动备份,返回结果供调度器落库 last_run。
- run_
backup 🔒 - 后台执行备份:pg_dump 优先,不可用回退纯 SQL;成功后按设置打包 uploads, 自动备份再做轮转。Ok/Err 均已同步进任务进度表(供前端轮询),返回值供 调度器落库 last_run。
- run_
pg_ 🔒dump_ backup - run_
restore 🔒 - run_
sql_ 🔒fallback_ backup - 纯 SQL 回退:仅备份数据(不含 schema),按表计数精确进度。
- sanitize_
import_ 🔒filename - 校验并清洗导入文件名:剥离路径分量(旧浏览器可能带
C:\fakepath\前缀), 要求.sql后缀 + 非隐藏文件 + 备份文件名白名单。纯函数便于单测。 - select_
expired_ 🔒auto_ backups - 从自动备份 SQL 文件名列表挑出超出保留份数、应删除的最旧者。 文件名内嵌定宽时间戳,字典序即时间序。纯函数便于单测。
- sql_
line_ 🔒without_ eol - 后台执行恢复:探测 psql,可用则原子恢复,不可用则报告。
- uploads_
archive_ 🔒name - SQL 文件名 → 配对 uploads 打包文件名(
X.sql→X_uploads.tar.gz)。 - write_
owner_ 🔒neutral_ restore_ sql