字
字节笔记本
2026年2月16日
postgres-backup-r2:自动备份 PostgreSQL 到 Cloudflare R2
API中转
¥120
本文介绍 postgres-backup-r2,一个用于定期备份 PostgreSQL 数据库到 Cloudflare R2 的开源工具。该项目支持自动备份、GPG 加密、备份恢复和自动清理旧备份等功能。
项目简介
postgres-backup-r2 是一个基于 Docker 的 PostgreSQL 备份解决方案,专为 Cloudflare R2 对象存储设计。它通过简单的配置即可实现数据库的自动定期备份,并支持从备份中快速恢复数据。
核心特性
- 定期自动备份: 支持通过 cron 表达式配置备份计划
- Cloudflare R2 存储: 专为 R2 对象存储优化,支持自定义前缀路径
- GPG 加密: 支持使用密码短语对备份文件进行加密,保护数据安全
- 自动清理: 自动删除超过指定天数的旧备份,节省存储空间
- 一键恢复: 提供简单的恢复脚本,支持从备份快速恢复数据库
- 多版本支持: 支持 PostgreSQL 多个版本(通过构建参数指定)
技术栈
- Shell 脚本 (87.5%) - 核心备份和恢复逻辑
- Docker - 容器化部署
- PostgreSQL - 支持 pg_dump 和 pg_restore
- Cloudflare R2 - 对象存储后端(S3 兼容 API)
安装指南
使用预构建镜像
bash
docker pull dcalsky/postgres-backup-r2:17本地构建
bash
# 克隆仓库
git clone https://github.com/dcalsky/postgres-backup-r2.git
cd postgres-backup-r2
# 构建镜像(指定 PostgreSQL 版本)
DOCKER_BUILDKIT=1 docker build --build-arg POSTGRES_VERSION=17 .快速开始
1. 配置 docker-compose
创建 docker-compose.yml 文件:
yaml
version: '3.8'
services:
backup:
image: dcalsky/postgres-backup-r2:17
environment:
# 备份计划(cron 表达式,每天凌晨 2 点)
- SCHEDULE=@daily
- BACKUP_KEEP_DAYS=7
# PostgreSQL 连接信息
- POSTGRES_HOST=your-postgres-host
- POSTGRES_PORT=5432
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=your-password
- POSTGRES_DB=your-database
# Cloudflare R2 配置
- CLOUDFLARE_R2_ENDPOINT=https://your-account-id.r2.cloudflarestorage.com
- CLOUDFLARE_R2_BUCKET=your-bucket-name
- CLOUDFLARE_R2_ACCESS_KEY_ID=your-access-key
- CLOUDFLARE_R2_SECRET_ACCESS_KEY=your-secret-key
# 可选:GPG 加密密码
- PASSPHRASE=your-gpg-passphrase
# 可选:R2 存储路径前缀
- R2_PREFIX=backups/postgres/2. 启动备份服务
bash
docker-compose up -d3. 查看备份日志
bash
docker logs -f <container-name>使用示例
手动触发备份
bash
docker exec <container-name> sh backup.sh从备份恢复
bash
# 列出可用备份
docker exec <container-name> sh -c 'ls -la /tmp'
# 恢复指定备份
docker exec <container-name> sh restore.sh <backup-file-name>配置多个数据库备份
可以为每个数据库创建单独的备份服务:
yaml
services:
backup-db1:
image: dcalsky/postgres-backup-r2:17
environment:
- POSTGRES_DB=database1
- R2_PREFIX=backups/db1/
# ... 其他配置
backup-db2:
image: dcalsky/postgres-backup-r2:17
environment:
- POSTGRES_DB=database2
- R2_PREFIX=backups/db2/
# ... 其他配置环境变量参考
| 变量名 | 必填 | 说明 | 示例 |
|---|---|---|---|
SCHEDULE | 否 | 备份计划(cron 表达式) | @daily, 0 2 * * * |
BACKUP_KEEP_DAYS | 否 | 备份保留天数 | 7 |
PASSPHRASE | 否 | GPG 加密密码 | your-secret-passphrase |
POSTGRES_HOST | 是 | PostgreSQL 主机地址 | postgres |
POSTGRES_PORT | 否 | PostgreSQL 端口(默认 5432) | 5432 |
POSTGRES_USER | 是 | 数据库用户名 | postgres |
POSTGRES_PASSWORD | 是 | 数据库密码 | password |
POSTGRES_DB | 是 | 数据库名称 | mydb |
CLOUDFLARE_R2_ENDPOINT | 是 | R2 API 端点 | https://xxx.r2.cloudflarestorage.com |
CLOUDFLARE_R2_BUCKET | 是 | R2 存储桶名称 | my-backups |
CLOUDFLARE_R2_ACCESS_KEY_ID | 是 | R2 访问密钥 ID | xxx |
CLOUDFLARE_R2_SECRET_ACCESS_KEY | 是 | R2 访问密钥 | xxx |
R2_PREFIX | 否 | 备份文件路径前缀 | backups/postgres/ |
备份文件命名格式
备份文件使用以下命名格式:
text
<database>_<timestamp>.sql.gz
# 或启用了 GPG 加密:
<database>_<timestamp>.sql.gz.gpg示例:
text
mydb_20250115_020000.sql.gz
mydb_20250115_020000.sql.gz.gpg注意事项
- 备份时间: 建议在数据库负载较低的时间段执行备份
- 存储空间: 定期检查 R2 存储桶使用情况,合理设置
BACKUP_KEEP_DAYS - 加密安全: 如果使用 GPG 加密,请妥善保管密码短语
- 网络连接: 确保容器能够访问 PostgreSQL 服务器和 R2 端点
- 权限配置: R2 访问密钥需要具有写入存储桶的权限
项目链接
- GitHub 仓库: https://github.com/dcalsky/postgres-backup-r2
- Docker Hub: https://hub.docker.com/r/dcalsky/postgres-backup-r2
许可证
MIT License
分享: