ByteNoteByteNote

字节笔记本

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 -d

3. 查看备份日志

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
PASSPHRASEGPG 加密密码your-secret-passphrase
POSTGRES_HOSTPostgreSQL 主机地址postgres
POSTGRES_PORTPostgreSQL 端口(默认 5432)5432
POSTGRES_USER数据库用户名postgres
POSTGRES_PASSWORD数据库密码password
POSTGRES_DB数据库名称mydb
CLOUDFLARE_R2_ENDPOINTR2 API 端点https://xxx.r2.cloudflarestorage.com
CLOUDFLARE_R2_BUCKETR2 存储桶名称my-backups
CLOUDFLARE_R2_ACCESS_KEY_IDR2 访问密钥 IDxxx
CLOUDFLARE_R2_SECRET_ACCESS_KEYR2 访问密钥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 访问密钥需要具有写入存储桶的权限

项目链接

许可证

MIT License

分享: