Databasus:自托管 PostgreSQL 备份与 PITR,备份完还会真跑一次恢复
Databasus 是自托管、免费开源的 PostgreSQL 备份工具,Apache-2.0 许可,目标是低 RPO/RTO 的 Point-in-Time Recovery。
- GitHub:
- 官网:
备份类型
物理备份(Physical):走 PostgreSQL 原生增量备份机制,做整簇文件级拷贝。
- Full:完整自包含备份。
- Incremental:只存自上次 Full 以来的变化,体积更小、速度更快。
- WAL streaming:持续捕获写入流,支撑 PITR,面向灾难恢复与接近零数据丢失的场景。
逻辑备份(Logical):按引擎原生二进制格式 dump,带压缩,适合并行恢复。
支持的数据库版本与限制
| 数据库 | 版本 | 备份方式 |
|---|---|---|
| PostgreSQL | 14/15/16/17/18 | 物理 + 逻辑 |
| MySQL | 5.7/8.0/8.4/9/26 | 仅逻辑 |
| MariaDB | 5.5/10/11/12/13 | 仅逻辑 |
| MongoDB | 4.2+/5/6/7/8 | 仅逻辑 |
物理备份(Full/Incremental/WAL)只对 PostgreSQL 可用;MySQL、MariaDB、MongoDB 目前只能做逻辑 dump。
调度与保留策略
调度支持按小时/天/周/月,或直接写 cron,也可以指定具体时间点(例如低峰期 4 点)。启用压缩后大约能省 4–8x 空间,代价是约 20% 的额外开销。
保留策略有四种维度,可以组合:
- 时间周期:如保留 7 天 / 3 个月 / 1 年。
- 数量:保留最近 N 个备份。
- GFS 分层保留:hourly / daily / weekly / monthly / yearly。
- 存储上限:单次备份大小上限与总存储大小上限。
恢复验证:真的起库跑一遍
这是 Databasus 区别于「只校验文件完整性或 checksum」的地方——它执行真正的恢复。
触发方式可以设为每次备份之后,也可以按 hourly/daily/weekly/monthly/cron 的灵活计划执行。流程是:起一个数据库容器、跑恢复、把恢复后的数据大小与备份对比,报告里会列出每张表及其行数。通知可选:发送完整报告,或只在失败时告警。
存储、通知与安全
存储目的地:本地、S3、Cloudflare R2、Google Drive、NAS、Dropbox、SFTP、Rclone 等。
通知渠道:Email、Telegram、Slack、Discord、Teams、Mattermost、webhook。
安全方面:
- 备份文件使用 AES-256-GCM 加密,zero-trust 存储模型,加密后放到共享存储也安全。
- secrets 加密保存,日志与报错不泄露敏感信息。
- 默认使用只读用户执行备份,不保存任何能修改数据的东西。
- 双因素认证:登录可选 6 位邮件验证码;Google/GitHub 登录沿用各自平台的校验。
团队与界面
workspaces 用来分组数据库、通知和存储;权限基于角色划分:viewer / member / admin / owner。带审计日志,支持 OpenTelemetry 日志导出,默认同时写本地文件。界面上有明暗主题,移动端自适应。
安装
1)自动脚本(推荐,仅 Linux)
sudo apt-get install -y curl && sudo curl -sSL https://raw.githubusercontent.com/databasus/databasus/refs/heads/main/install-databasus.sh | sudo bash
2)docker run
docker run -d --name databasus -p 4005:4005 \
-v ./databasus-data:/databasus-data \
--restart unless-stopped databasus/databasus:latest
同一镜像也在 GHCR:ghcr.io/databasus/databasus:latest,Docker Hub 限流时可以换用。
3)docker-compose
services:
databasus:
image: databasus/databasus:latest
ports:
- 4005:4005
volumes:
- ./databasus-data:/databasus-data
restart: unless-stopped
healthcheck:
test: ["CMD", "databasus", "healthcheck"]
interval: 30s
timeout: 5s
retries: 3
start_period: 60s
4)Kubernetes + Helm
helm install databasus oci://ghcr.io/databasus/charts/databasus -n databasus --create-namespace
kubectl port-forward svc/databasus-service 4005:4005 -n databasus
也可以用 LoadBalancer 或 Ingress:
--set service.type=LoadBalancer
--set ingress.enabled=true --set ingress.hosts[0].host=backup.example.com
初始化与密码重置
访问 http://localhost:4005 注册第一个账号,第一个账号即管理员。新建数据库向导弹依次设置 schedule、连接、存储、保留策略、通知;保存后会先校验,然后开始排程。
密码重置:
docker exec -it databasus ./main --new-password="YourNewSecurePassword123" --email="owner@example.com"
忘记管理员邮箱时先列出账号:
docker exec -it databasus ./main --list-admins
该命令只列账号信息,不打印密码。
自托管要多做的一件事
安装后建议把 Databasus 自己也备份起来,至少复制用于加密的 secret key。否则服务器丢失或损坏后,加密备份将无法恢复——这是加密存储方案的固有代价,和工具本身无关。
项目工程侧的做法:CodeQL 静态扫描、CodeRabbit 配合 gitleaks/semgrep、Dependabot 跟踪 GitHub Advisory 的 CVE、Trivy 扫描镜像,并且每个 PR 都会针对真实数据库容器跑一遍完整的「备份 → 恢复」端到端验证。