使用 Cloudflare R2 配置 Dokploy 备份
Dokploy 备份与恢复指南
1. 为什么备份至关重要
当使用 Dokploy 在 VPS 上自托管应用程序时,拥有可靠的备份策略不仅重要,而且至关重要。
无论运行的是生产应用程序、数据库还是个人项目,数据丢失都可能造成毁灭性后果。
为什么备份对自托管应用程序至关重要
在深入探讨技术设置之前,让我们先了解一下为什么在自托管时备份应该是您的首要任务:
- 硬件故障——VPS服务器可能会出现磁盘故障、内存损坏或硬件完全损坏的情况。
- 人为错误——意外删除数据库、错误配置服务或运行破坏性命令,每个人都可能遇到。
- 安全事件——勒索软件、黑客攻击或凭证泄露都可能破坏您的数据。
- 服务提供商问题——云服务提供商可能会出现服务中断、数据中心故障,甚至账户暂停的情况。
- 软件漏洞——应用程序更新、迁移或配置更改可能会损坏您的数据。
最重要的教训:永远不要将备份文件与主数据存储在同一位置。如果您的VPS提供商暂停了您的帐户或其数据中心发生灾难性故障,您需要将备份文件存储在其他地方。
2. 为什么选择 Cloudflare R2?
虽然昨天遇到了史诗级的宕机故障,但他仍然是我们的唯一选择,毕竟其他真的太贵了!
Cloudflare R2 是一个高性能、低成本的对象存储解决方案,特别适合需要可靠备份的场景。其主要特点包括:
- 高可用性:R2 在全球范围内有多个数据中心,确保数据不会因单点故障而丢失。
- 低成本:与传统的云存储解决方案相比,R2 提供了更具竞争力的价格。
- 灵活性:R2 支持多种数据访问方式,包括 HTTP/HTTPS、API 和 CDN 加速。
- 10GB 存储空间- 永久免费,非常适合中小型部署
- 零出口费用- 与 AWS S3 不同,您无需为下载付费。
- 兼容 S3 - 可与任何兼容 S3 的工具或应用程序配合使用
- 全球分发- 数据自动分发到 Cloudflare 的网络
- 无隐藏费用- 价格透明,绝无隐性收费
成本比较
| 提供者 | 存储容量(每GB/月) | 出口流量(每GB) | 免费套餐 |
|---|---|---|---|
| Cloudflare R2 | 0.015美元 | 0.00 美元 | 10GB存储空间 |
| AWS S3 | 0.023美元 | 0.09美元 | 5GB(12个月) |
| 赫茨纳储物盒 | 3.81美元(100GB) | 0.00 美元 | 没有任何 |
| Backblaze B2 | 0.005美元 | 0.01美元 | 10GB存储空间 |
3. 配置 Cloudflare R2 存储桶并连接到 Dokploy
步骤 1:配置 Cloudflare R2 存储桶
1.1 创建 R2 存储桶
-
登录 Cloudflare 控制面板:
https://dash.cloudflare.com -
在左侧菜单中点击 R2
-
点击 创建存储桶 (Create Bucket)
-
输入存储桶名称,例如:
dokploy-backupsyourapp-backups
-
选择区域(尽量选择靠近你 VPS 的区域):
- WNAM(北美西部)
- ENAM(北美东部)
- WEUR(西欧)
- APAC(亚太地区)
-
点击 创建存储桶
存储桶命名规则:
- 长度 3–63 字符- 只能包含小写字母、数字、连字符- 必须以字母或数字开头和结尾- 不允许空格或特殊字符1.2 创建用于 Dokploy 的 API 令牌
-
返回 R2 页面,找到 管理 R2 API 令牌 (Manage R2 API Tokens)
-
点击 创建 API 令牌
-
设置名称,例如:
Dokploy Backup Access -
权限选择:
- Object Read & Write(对象读取和写入)
-
建议启用:
- 仅应用于特定存储桶
- 选择你的存储桶,例如
dokploy-backups
-
点击 创建 API 令牌
-
保存下面信息(非常重要,只会显示一次):
Access Key ID: f3811c6d27415a9s6cv943b6743ad784Secret Access Key: aa55ee40b4049e93b7252bf698408cc22a3c2856d2530s7c1cb7670e318f15e58建议存入密码管理器,关闭窗口后无法再次查看密钥。
1.3 获取 R2 Endpoint URL
在 R2 首页可以看到类似这样的端点:
https://2391372198321037123xdwewqe.r2.cloudflarestorage.com请复制完整的 Endpoint URL,用于后续 Dokploy 配置。
步骤 2:在 Dokploy 中配置 S3 目标(Cloudflare R2)
2.1 添加新的 S3 目标
- 打开你的 Dokploy 控制面板
- 左侧菜单进入 设置 → 目的地(Destinations)
- 点击 新建目的地
- 类型选择 S3 兼容(S3 Compatible)
2.2 填写 Cloudflare R2 连接信息
以下为对应关系:
| Dokploy 字段 | Cloudflare R2 信息 | 示例 |
|---|---|---|
| 目的地名称 | 自定义 | Cloudflare R2 Backups |
| Access Key ID | API Key | f3811c6d27415a9s6cv943b6743ad784 |
| Secret Access Key | API Secret | 一长串密钥 |
| Region | R2 区域 | WNAM / ENAM / WEUR / APAC |
| Endpoint | R2 Endpoint URL | https://12321309239213dbhwwqe.r2.cloudflarestorage.com |
| Bucket | 你的存储桶名称 | dokploy-backups |
| Force Path Style | 必须启用 | ✓ |
重要说明:
Region
必须与你创建存储桶时选择的区域一致:
WNAM – 北美西部ENAM – 北美东部WEUR – 西欧APAC – 亚太地区Endpoint URL
必须使用完整格式:
https://xxxxxxxxxxxxxxxxxxxx.r2.cloudflarestorage.com不要添加存储桶名称。
Force Path Style
Cloudflare R2 必须启用该选项。
2.3 测试连接
-
点击 测试连接
-
若显示 “连接成功”,则说明一切正常
-
若失败,请检查:
- 密钥无多余空格
- Endpoint 是否完整
- Region 是否正确
- 是否启用了 Force Path Style
- Token 是否拥有 Object Read & Write 权限
2.4 保存目标位置
当测试成功后:
- 点击 保存(Save)
- 你的 Cloudflare R2 将显示在目的地列表中,可用于所有 Dokploy 备份任务

4. 备份 Dokploy 系统
Dokploy 提供全面的备份系统.
- Dokploy 系统备份 这些备份包含了您的整个 Dokploy 安装:
包含内容:
-
PostgreSQL 数据库 (dokploy-postgres) 包含所有应用程序配置
-
Dokploy 文件系统 (/etc/dokploy) 包含设置、证书和元数据
-
应用程序定义、环境变量和部署历史记录
-
Traefik 配置和 SSL 证书
-
何时使用:
-
在 Dokploy 进行重大更新或迁移之前
-
经过重大配置变更后
-
灾难恢复场景
-
迁移到新服务器时
-
备份计划建议:每日自动备份,保留 7 天数据。
- 数据库备份 为您的应用程序提供单独的数据库备份:
支持的数据库:
- PostgreSQL(使用 pg_dump)
- MySQL(使用 mysqldump)
- MariaDB(使用 mariadb-dump)
- MongoDB(使用 mongodump)
包含内容:
- 完整的数据库模式(表、索引、约束)
- 所有数据均采用压缩格式
- 用户权限和角色
- 存储过程和函数
何时使用:
- 在应用程序更新或架构迁移之前
- 针对特定时间点的恢复
- 测试重大数据变更时
- 用于创建开发/测试环境
- 建议的更新频率:生产数据库每天多次更新(每 6 小时一次),开发数据库每天更新。
- 卷备份 使用基于文件的存储的应用程序的 Docker 卷备份:
非常适合:
- SQLite 数据库(n8n、Memos 等)
- 文件上传和用户生成的内容
- 存储在卷中的配置文件
- 没有传统数据库的应用
包含内容:
- 完整卷册内容
- 文件权限和所有权
- 目录结构
何时使用:
- 使用 SQLite 或嵌入式数据库的应用程序
- 以卷形式存储重要文件的服务
- 内容管理系统
- 容器更新之前
- 排期建议:高产量内容每日排期,静态内容每周排期

步骤 3:备份 Dokploy 系统
Dokploy 系统备份是最关键的备份,它包含所有应用程序的配置、环境变量、部署记录以及系统元数据。
3.1 备份内容包含哪些?
创建 Dokploy 系统备份时,以下内容会被完整保存:
1. PostgreSQL 数据库(dokploy-postgres)
包含:
- 所有应用程序定义
- 配置与环境变量
- 部署历史记录
2. 文件系统 /etc/dokploy
包含:
- SSL 证书
- Traefik 配置
- 系统元数据
3. 用户账户与身份认证信息
4. Git 提供商连接与部署密钥
5. 所有目标配置
包括:
- S3 存储(如 Cloudflare R2)
- Git Providers 等系统级配置
3.2 创建自动备份
步骤 ①:打开备份页面
在 Dokploy 控制面板中,进入:
Web Servers → Backups步骤 ②:创建新备份
点击 “创建备份”
步骤 ③:配置备份参数
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 目的地 | Cloudflare R2 备份 | 使用前面步骤创建的 S3 目标位置 |
| 定时任务(Cron) | 0 2 * * * | 每天凌晨 2:00 自动运行 |
| 已启用 | ✓ | 开启定期备份 |
| 保留策略 | 7 天 | 仅保留最近 7 个备份(可选) |



3.3 Cron 语法说明
Dokploy 使用标准 Linux Cron 格式:
minute hour day month weekday常用示例:
0 2 * * * # 每天凌晨 2 点0 */6 * * * # 每 6 小时执行一次0 2 * * 0 # 每周日凌晨 2 点0 3 1 * * # 每月 1 号凌晨 3 点*/30 * * * * # 每 30 分钟推荐凌晨 2 点执行:通常为业务低峰期,可减少对性能影响。
3.4 执行手动备份测试(强烈推荐)
在依赖自动备份前,应做一次验证:
- 点击 “立即运行备份” 或 “测试备份”
- 等待约 1–3 分钟
- 打开 Cloudflare R2 存储桶,确认文件已上传
- 下载备份,确认可正常解压且无损坏
5. 备份应用程序数据库
步骤 4:配置数据库备份
数据库通常是业务中最关键的数据资产,因此为其配置稳定、高频、安全的自动备份非常重要。Dokploy 提供针对 PostgreSQL、MySQL/MariaDB 和 MongoDB 的原生备份支持,并可将备份自动上传到 Cloudflare R2 或其他 S3 存储。
4.1 配置数据库备份
步骤 ①:打开数据库管理界面
在 Dokploy 控制台中进入:
Databases → 选择你的数据库步骤 ②:进入备份页面
点击上方的 “备份” 选项卡。
步骤 ③:创建备份配置
填写以下参数:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 目的地 | Cloudflare R2 备份 | 使用前面创建的 S3 目标 |
| 数据库名称 | 自动填充 | Dokploy 会自动识别该数据库 |
| 定时任务(Cron) | 0 */6 * * * | 每 6 小时备份一次 |
| 前缀 | prod-db 或项目名 | R2 中的文件夹名称 |
| 已启用 | ✓ | 启用自动备份 |
按环境推荐的备份频率
# Production database(关键业务)0 */6 * * * # 每 6 小时
# Staging(中等重要)0 2 * * * # 每天凌晨 2 点
# Development(低重要)0 2 * * 0 # 每周日凌晨 2 点
# 高频业务(电商 / 实时系统)0 */3 * * * # 每 3 小时4.2 测试数据库备份
在依赖自动任务前,一定要先测试一次手动备份。
步骤如下:
- 点击 “测试备份”
- 观察实时日志,确保任务成功完成
- 打开 Cloudflare R2 存储桶检查备份文件是否已上传
- 下载备份文件,手动确认文件可正常解压、无损坏
备份文件示例结构
dokploy-backups/ └── prod-db/ ├── postgres-backup-2025-11-12-00-00.sql.gz ├── postgres-backup-2025-11-12-06-00.sql.gz ├── postgres-backup-2025-11-12-12-00.sql.gz └── postgres-backup-2025-11-12-18-00.sql.gz4.3 Dokploy 备份所使用的命令解析
Dokploy 根据数据库类型执行原生备份命令,并以 .gz 压缩格式上传到 R2。
PostgreSQL:使用 pg_dump
pg_dump -Fc --no-acl --no-owner -h localhost -U ${databaseUser} \ --no-password '${database}' | gzip参数说明:
| 参数 | 说明 | |
|---|---|---|
-Fc | 生成自定义格式备份,恢复效率更高 | |
--no-acl | 不包含权限设置,避免恢复冲突 | |
--no-owner | 不包含所有者信息 | |
| ` | gzip` | 压缩输出,节省 70–90% 空间 |
MySQL / MariaDB:使用 mysqldump
mysqldump --default-character-set=utf8mb4 -u 'root' \ --password='${databaseRootPassword}' \ --single-transaction --no-tablespaces \ --quick '${database}' | gzip参数说明:
utf8mb4:支持 emoji 与国际字符--single-transaction:无需锁表即可获得一致快照--no-tablespaces:避免恢复环境权限问题--quick:流式读取,减少内存占用
MariaDB:使用 mariadb-dump
mariadb-dump --user='${databaseUser}' \ --password='${databasePassword}' \ --databases ${database} | gzipMongoDB:使用 mongodump
mongodump -d '${database}' -u '${databaseUser}' \ -p '${databasePassword}' \ --archive --authenticationDatabase=admin --gzip作用说明:
--archive:输出为单个文件,便于存储--authenticationDatabase=admin:使用管理员库验证--gzip:压缩归档
4.4 多重数据库备份(多项目最佳实践)
若你有多个数据库(微服务、多个应用、多个环境),请为每个数据库创建独立备份任务。
使用清晰的前缀
prod-web-app/prod-analytics/prod-auth/dev-testing/6. 卷备份
步骤 5:卷备份(Volume Backup)
卷备份适用于 基于文件的存储 场景,例如 SQLite 数据库、上传文件、配置文件、静态资源等。对于不使用外部数据库的应用(如 n8n、Memos、Plausible、Umami 等),卷备份是保持数据安全的关键步骤。
5.1 何时使用卷备份?
卷备份适用于以下数据类型:
| 使用场景 | 示例 |
|---|---|
| SQLite 数据库 | n8n、Memos、Plausible、Umami |
| 基于文件的内容 | 上传图片、用户文档、媒体 |
| 持久化配置文件 | 应用程序配置、用户设置 |
| 嵌入式数据库 | LevelDB、RocksDB、LMDB |
| 静态网站生成文件 | HTML、CSS、静态资源 |
如果你的应用把数据保存在 Docker 卷里 —— 你就需要卷备份。
5.2 理解 Docker 卷结构
在配置卷备份之前,你必须确认你的卷名称是什么。卷的名称通常与应用和 Docker Compose 的结构相关。
Dokploy 单应用场景
路径:
应用 → 高级 → 挂载卷名称示例:
app-datauploadsconfigDokploy(Docker Compose 应用)命名规则
卷名称格式:
{appName}_{volumeName}示例:
-
App:
n8n-kqlbleVolume:n8n_data完整卷名:n8n-kqlble_n8n_data -
App:
memos-prodVolume:memos_data完整卷名:memos-prod_memos_data -
App:
plausible-analyticsVolume:db-data完整卷名:plausible-analytics_db-data
5.3 示例:备份 n8n(SQLite)
n8n 使用 SQLite,并将数据存储在 Docker 卷中,因此必须使用 卷备份 而不是数据库备份。
示例 docker-compose:
version: "3.8"services: n8n: image: docker.n8n.io/n8nio/n8n:1.83.2 restart: always environment: - N8N_HOST=${N8N_HOST} - N8N_PORT=${N8N_PORT} volumes: - n8n_data:/home/node/.n8n
volumes: n8n_data:所有关键数据(工作流程、用户、历史记录、SQLite 数据库)都位于 n8n_data 卷中。
5.4 配置卷备份
步骤 ①:导航到卷备份
应用 → 卷备份步骤 ②:创建卷备份任务
填写:
| 字段 | 值 | 描述 |
|---|---|---|
| 名称 | n8n-daily-backup | 描述性名称 |
| 目的地 | Cloudflare R2 备份 | S3 目标 |
| 定时任务(Cron) | 0 3 * * * | 每天凌晨 3 点 |
| 服务名称 | n8n | 自动填充 |
| 卷名 | n8n_data | 自动识别 |
| 备份前缀 | n8n-volumes | 可选文件夹前缀 |
| 关闭容器 | ✓(强烈推荐) | 保证数据一致性 |
| 已启用 | ✓ | 启用备份任务 |
5.5 卷备份的安全注意事项:是否关闭容器?
推荐:备份期间关闭容器(最高安全性)
原因:
- 100% 数据一致性
- 避免 SQLite 备份损坏
- 避免部分写入的文件
- 保证文件系统快照完整
流程:
- Dokploy 停止容器
- 执行卷备份(没有写入操作)
- 上传至 R2
- 自动重启容器
停机时间:通常 30 秒–2 分钟
建议安排在流量最低时期(如凌晨 03:00)。
适用于:
- SQLite 或嵌入式数据库应用
- 活跃写入系统
- 重要生产环境
不推荐:保持容器运行进行备份(零停机,但有风险)
优势:
- 无停机
- 更快
风险:
- 文件可能处于写入状态 → 备份损坏
- SQLite 数据库几乎可以确定会损坏
- 部分大文件可能只备份了一半
- 恢复可能失败
适用于:
- 测试环境
- 静态内容很少变更
- 具备安全 WAL 的应用
SQLite:绝对不要在运行中备份。
5.6 如何查找正确的卷名
方法 1:Dokploy UI
应用 → 高级 → 挂载方法 2:查看 docker-compose.yml
示例:
volumes: n8n_data:方法 3:服务器终端检查 Docker 卷
docker volume ls过滤某个应用:
docker volume ls | grep n8n确认卷名存在:
docker volume inspect xxxx7. 恢复备份
6. 备份恢复:如何安全恢复 Dokploy 系统、数据库与卷
将军说过:备份只有在能够成功恢复时才真正有意义。
6.1 恢复 Dokploy 系统(灾难恢复/迁移)
系统恢复会替换当前安装的所有 Dokploy 核心数据,包括:
- PostgreSQL 数据库(应用配置、环境变量、部署历史)
/etc/dokploy文件(Traefik 配置、SSL 证书、元数据)- 用户帐户与身份验证设置
- Git 提供商连接、Webhook 密钥
- 所有部署目标配置(S3、Git 供应商等)
此操作会覆盖当前系统,请务必确保恢复的是正确的备份。
6.1.1 恢复步骤
1. 打开恢复界面
进入 Dokploy 控制台:
Web 服务器 → 备份 → 恢复备份
2. 配置恢复参数
| 参数 | 描述 |
|---|---|
| 源 S3 存储桶 | 选择你的 Cloudflare R2 目标位置 |
| 搜索备份 | 输入关键字以匹配备份文件 |
| 选择备份 | 选择你要恢复的时间点 |
| 恢复摘要 | 查看即将被替换的内容 |
3. 执行恢复
点击“恢复”,过程通常 2–5 分钟。
恢复中将发生:
- 删除并替换
/etc/dokploy - 删除并重建 PostgreSQL 数据库
- 断开所有数据库连接
- 重新应用 Traefik 配置
- 服务可能短暂停止
6.1.2 恢复后检查事项
- 你可能需要重新登录
- 所有应用应显示在仪表板中
- 环境变量完整性检查
- 测试至少 1 个应用运行是否正常
6.2 迁移到另一台服务器(跨 VPS 恢复)
系统恢复也用于迁移:从旧服务器备份 → 新服务器恢复。
完整迁移 checklist
1. 更新服务器 IP
Web 服务器 → 服务器 → 更新 IP 地址
2. 更新 DNS
将域名的 A 记录指向新 IP 等待传播 5–15 分钟
3. 重新创建 Traefik.me 域名(如使用)
Traefik.me 会自动绑定到新服务器 IP 需要在每个应用中重新创建
4. Git 提供商 webhook 修复
如果原先使用 IP,需要修改为新 IP 或改为域名
5. SSL 证书验证
Traefik 会自动申请新的 Let’s Encrypt 证书 首次颁发需 5–10 分钟
6. 数据库连接验证
确保所有应用都能连接内部/外部数据库
7. 应用健康检查
逐个访问应用 URL,检查功能与日志
6.3 恢复数据库备份(PostgreSQL、MySQL 等)
用于单独恢复某个数据库,不影响整个 Dokploy 系统。
适用于:
- 数据损坏
- 错误的迁移或更新
- 回滚数据
- 建立测试/暂存环境
- 意外删除表数据
6.3.1 恢复步骤
1. 打开数据库恢复:
数据库 → 选择数据库 → 备份 → 恢复
2. 配置恢复参数
| 参数 | 描述 |
|---|---|
| 源 S3 存储桶 | Cloudflare R2 |
| 搜索备份文件 | 可输入前缀(如 prod-db/) |
| 选择备份 | 指定 SQL.gz 或 SQL 文件 |
示例路径:
prod-db/postgres-backup-2025-11-12-06-00.sql.gz3. 执行恢复
恢复过程将:
- 删除整个数据库
- 下载并导入备份
- 恢复权限
- 自动重启数据库连接
6.3.2 验证恢复
- 查看数据库日志无错误
- 测试应用是否可以正常使用数据库
- 检查关键数据是否存在
- 查看应用日志是否有连接错误
6.4 恢复卷备份(文件卷:SQLite、uploads、配置文件等)
卷恢复用于恢复:
- SQLite 数据库
- 上传文件(images/documents)
- 应用配置文件
- 嵌入式 DB(LevelDB、RocksDB、LMDB)
- 静态网站资源
6.4.1 恢复步骤
1. 打开卷恢复
进入应用 → 卷备份 → 恢复卷
2. 配置恢复参数
| 参数 | 值 | 描述 |
|---|---|---|
| 源 S3 存储桶 | R2 | 你的备份目标 |
| 搜索备份 | 输入搜索字段 | 查找卷备份 |
| 目标卷名称 | 如 n8n-kqlble_n8n_data | 必须是完整卷名 |
6.4.2 正确理解卷名称
错误:(会失败)
n8n_data正确:
n8n-kqlble_n8n_data规则: 完整卷名 = {appName}_{volumeName}
验证方法:
docker volume ls | grep n8n6.4.3 卷恢复关键限制
卷恢复前必须:
| 条件 | 必须满足 |
|---|---|
| 容器已停止 | 卷不能被使用 |
| 卷已删除 | 存在则无法覆盖 |
| 磁盘空间足够 | 卷恢复可能较大 |
| 备份当前卷(如重要数据) | 防止错误覆盖 |
6.4.4 完整恢复流程(推荐)
# 1. 停止应用docker compose -f /opt/stacks/n8n-kqlble/docker-compose.yml down
# 2. 删除旧卷docker volume rm n8n-kqlble_n8n_data
# 3. 在 Dokploy UI 恢复卷备份
# 4. 启动应用docker compose -f /opt/stacks/n8n-kqlble/docker-compose.yml up -d6.4.5 恢复后检查
- 查看容器日志无错误
- 验证应用成功启动
- 检查恢复的数据是否正确
- 测试完整功能
6.5 兼容性说明
Dokploy 仅保证恢复通过 Dokploy 备份系统创建的备份文件。
其他来源的备份(手动 .sql / cp -r / 自定义脚本等)可能不兼容,恢复时可能失败。