
Doubletake是一款简单易用的PostgreSQL数据库备份工具,支持按计划将数据库备份到S3兼容存储,并能从S3存储恢复数据。它主要实现两项核心功能:按cron计划自动执行PostgreSQL数据库的转储、验证、加密和压缩;以及从S3下载备份文件,执行解压缩、解密、验证后恢复到PostgreSQL数据库。
需通过Docker的-e参数、docker-compose的environment配置或环境变量文件设置以下参数。目前设计用于采用"trust"认证模式的数据库,若使用其他认证模式,可通过DB_PASSWORD或Docker Secret配置密码。
yamlenvironment: - S3_HOST_BASE=s3.amazonaws.com # S3存储主机地址 - S3_REGION=us-east-2 # S3区域 - S3_BUCKET=yourbucketname # S3桶名称(仅允许小写字母、数字、连字符和句点) - S3_FOLDER=subfoldername # S3桶内子文件夹名称 - S3_ACCESS_KEY_ID=youraccesskey # S3访问密钥ID - S3_SECRET_ACCESS_KEY=yoursecretkey # S3秘密访问密钥 - CRON_SCHEDULE='0 */6 * * *' # 可选,默认每6小时执行一次 - DB_BACKUP_VERIFY=1 # 可选,默认1(启用备份验证) - DB_BACKUP_COMPRESS=0 # 可选,默认0(禁用压缩) - DB_BACKUP_COMPRESS_LEVEL= # 可选,压缩级别(默认4) - DB_USER=postgres # 数据库用户名 - DB_NAME=hudu_production # 数据库名称 - DB_HOST=db # 数据库主机地址(localhost、unix socket、tcp socket或远程主机等) - DB_BACKUP_ENCRYPT_KEY=dddddddddddeeeeeeeeeaaaaaaaaddddddddbbbbbbbbeeeeeeeeeeffffffffff # 可选,加密密钥(需使用openssl rand -hex 32生成) - DB_BACKUP_ENCRYPT_IV=dddddeeeeeaaaaadddddbbbbeeeeffff # 可选,加密向量(需使用openssl rand -hex 16生成) - NO_ENCRYPT=0 # 可选,默认0(不禁用加密,若设为1则不解密现有文件但新备份不加密) - S3_REQUEST_HEADERS="x-amz-object-lock-retain-until-date:2027-12-31T00:00:00Z\x-amz-object-lock-mode:GOVERNANCE" # 可选,自定义S3请求头 - S3_MD5_REQUIRED= # 可选,默认0(启用后为S3提供文件版本和验证信息,版本化或文件锁定的桶需设为1) - PG_DUMP_USER_ARGS= # 可选,自定义pg_dump参数(特殊场景使用) - AUTO_LIFECYCLE_POLICY_TAGS=0 # 可选,默认0(禁用自动生命周期标签,设为1则添加daily/weekly/monthly标签)
CRON_SCHEDULE
'包裹,如'0 */6 * * *'CRON_SCHEDULE=0 */6 * * *或CRON_SCHEDULE='0 */6 * * *'S3_REQUEST_HEADERS
"包裹\\(两个反斜杠)分隔,格式为"key:value\\key:value\\key:value"S3_REQUEST_HEADERS="x-amz-object-lock-retain-until-date:2027-12-31T00:00:00Z\\x-amz-object-lock-mode:GOVERNANCE"AUTO_LIFECYCLE_POLICY_TAGS
S3_MD5_REQUIRED
1DB_BACKUP_VERIFY
DB_BACKUP_ENCRYPT_KEY和DB_BACKUP_ENCRYPT_IV
S3_HOST_BASE(多提供商支持)
S3_HOST_BASE=s3.amazonaws.comS3_HOST_BASE=s3.wasabisys.comS3_HOST_BASE=nyc3.digitaloceanspaces.com使用Docker Compose:
bash$ docker-compose exec -T backups /bin/bash -c "/backup.sh"
使用Docker:
bash$ docker exec -it {container_id} /bin/bash -c "/backup.sh"
预期输出:
appending folder s3://examplepgbackups/yourfolder s3://examplepgbackups/yourfolder/backup.sql s3://examplepgbackups/yourfolder/backup.meta upload: '/dump/backup.meta' -> 's3://examplepgbackups/yourfolder/backup.meta' (147 bytes in 0.4 seconds, 338.52 B/s) [1 of 1] calculated metadata uploaded to s3://examplepgbackups/yourfolder/backup.meta compressed backup file to /dump/backup.sql.xz upload: '/dump/backup.sql.xz' -> 's3://examplepgbackups/yourfolder/backup.sql.xz' (58552 bytes in 0.7 seconds, 84.10 KB/s) [1 of 1] compressed backup uploaded to s3://examplepgbackups/yourfolder/backup.sql.xz Upload successful.
使用Docker Compose:
bash$ docker-compose exec -T backups /bin/bash -c "/restore.sh"
使用Docker:
bash$ docker exec -it {container_id} /bin/bash -c "/restore.sh"
预期输出:
appending folder s3://examplepgbackups/yourfolder s3://examplepgbackups/yourfolder/backup.sql s3://examplepgbackups/yourfolder/backup.meta attempting download of s3://examplepgbackups/yourfolder/backup.sql.xz to /dump/restore.sql.xz... download: 's3://examplepgbackups/yourfolder/backup.sql.xz' -> '/dump/restore.sql.xz' (58552 bytes in 0.2 seconds, 265.58 KB/s) decompressing /dump/restore.sql.xz decompressed backup file to /dump/restore.sql download: 's3://examplepgbackups/yourfolder/backup.meta' -> '/dump/backup.meta' (147 bytes in 0.1 seconds, 1224.40 B/s) metadata downloaded to /dump/backup.meta Metadata is the same. Metadata is identical. Download successful. (postgres restore jargon)
使用Docker Compose:
bash$ docker-compose exec -T backups /bin/sh -c "cat /doubletake.log"
使用Docker:
bash$ docker exec -it {container_id} /bin/sh -c "cat /doubletake.log"
如需获取特定备份文件(如修改列名后恢复),可通过以下命令下载或上传文件:
使用Docker Compose:
bash# 下载 $ docker-compose exec -T backups /bin/bash -c "/download.sh" # 上传 $ docker-compose exec -T backups /bin/bash -c "/upload.sh"
使用Docker:
bash# 下载 $ docker exec -it {container_id} /bin/bash -c "/download.sh" # 上传 $ docker exec -it {container_id} /bin/bash -c "/upload.sh"
在多实例环境中使用时,建议为每个实例配置独立的S3文件夹访问策略,防止跨文件夹访问。可通过AWS CLI(或其他S3提供商的等效工具)或API动态创建/授予文件夹访问权限,并在实例销毁时及时撤销权限,确保数据安全。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务