5043 字
25 分钟

使用 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 R20.015美元0.00 美元10GB存储空间
AWS S30.023美元0.09美元5GB(12个月)
赫茨纳储物盒3.81美元(100GB)0.00 美元没有任何
Backblaze B20.005美元0.01美元10GB存储空间

3. 配置 Cloudflare R2 存储桶并连接到 Dokploy#

步骤 1:配置 Cloudflare R2 存储桶#

1.1 创建 R2 存储桶#

  1. 登录 Cloudflare 控制面板:https://dash.cloudflare.com

  2. 在左侧菜单中点击 R2

  3. 点击 创建存储桶 (Create Bucket)

  4. 输入存储桶名称,例如:

    • dokploy-backups
    • yourapp-backups
  5. 选择区域(尽量选择靠近你 VPS 的区域):

    • WNAM(北美西部)
    • ENAM(北美东部)
    • WEUR(西欧)
    • APAC(亚太地区)
  6. 点击 创建存储桶

存储桶命名规则:

- 长度 3–63 字符
- 只能包含小写字母、数字、连字符
- 必须以字母或数字开头和结尾
- 不允许空格或特殊字符

1.2 创建用于 Dokploy 的 API 令牌#

  1. 返回 R2 页面,找到 管理 R2 API 令牌 (Manage R2 API Tokens)

  2. 点击 创建 API 令牌

  3. 设置名称,例如:Dokploy Backup Access

  4. 权限选择:

    • Object Read & Write(对象读取和写入)
  5. 建议启用:

    • 仅应用于特定存储桶
    • 选择你的存储桶,例如 dokploy-backups
  6. 点击 创建 API 令牌

  7. 保存下面信息(非常重要,只会显示一次):

Access Key ID: f3811c6d27415a9s6cv943b6743ad784
Secret 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 目标#

  1. 打开你的 Dokploy 控制面板
  2. 左侧菜单进入 设置 → 目的地(Destinations)
  3. 点击 新建目的地
  4. 类型选择 S3 兼容(S3 Compatible)

2.2 填写 Cloudflare R2 连接信息#

以下为对应关系:

Dokploy 字段Cloudflare R2 信息示例
目的地名称自定义Cloudflare R2 Backups
Access Key IDAPI Keyf3811c6d27415a9s6cv943b6743ad784
Secret Access KeyAPI Secret一长串密钥
RegionR2 区域WNAM / ENAM / WEUR / APAC
EndpointR2 Endpoint URLhttps://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 测试连接#

  1. 点击 测试连接

  2. 若显示 “连接成功”,则说明一切正常

  3. 若失败,请检查:

    • 密钥无多余空格
    • Endpoint 是否完整
    • Region 是否正确
    • 是否启用了 Force Path Style
    • Token 是否拥有 Object Read & Write 权限

2.4 保存目标位置#

当测试成功后:

  • 点击 保存(Save)
  • 你的 Cloudflare R2 将显示在目的地列表中,可用于所有 Dokploy 备份任务

image-20251119164854683

4. 备份 Dokploy 系统#

Dokploy 提供全面的备份系统.

  1. Dokploy 系统备份 这些备份包含了您的整个 Dokploy 安装:

包含内容:

  • PostgreSQL 数据库 (dokploy-postgres) 包含所有应用程序配置

  • Dokploy 文件系统 (/etc/dokploy) 包含设置、证书和元数据

  • 应用程序定义、环境变量和部署历史记录

  • Traefik 配置和 SSL 证书

  • 何时使用:

  • 在 Dokploy 进行重大更新或迁移之前

  • 经过重大配置变更后

  • 灾难恢复场景

  • 迁移到新服务器时

  • 备份计划建议:每日自动备份,保留 7 天数据。

  1. 数据库备份 为您的应用程序提供单独的数据库备份:

支持的数据库:

  • PostgreSQL(使用 pg_dump)
  • MySQL(使用 mysqldump)
  • MariaDB(使用 mariadb-dump)
  • MongoDB(使用 mongodump)

包含内容:

  • 完整的数据库模式(表、索引、约束)
  • 所有数据均采用压缩格式
  • 用户权限和角色
  • 存储过程和函数

何时使用:

  • 在应用程序更新或架构迁移之前
  • 针对特定时间点的恢复
  • 测试重大数据变更时
  • 用于创建开发/测试环境
  • 建议的更新频率:生产数据库每天多次更新(每 6 小时一次),开发数据库每天更新。
  1. 卷备份 使用基于文件的存储的应用程序的 Docker 卷备份:

非常适合:

  • SQLite 数据库(n8n、Memos 等)
  • 文件上传和用户生成的内容
  • 存储在卷中的配置文件
  • 没有传统数据库的应用

包含内容:

  • 完整卷册内容
  • 文件权限和所有权
  • 目录结构

何时使用:

  • 使用 SQLite 或嵌入式数据库的应用程序
  • 以卷形式存储重要文件的服务
  • 内容管理系统
  • 容器更新之前
  • 排期建议:高产量内容每日排期,静态内容每周排期

image-20251119164132393

步骤 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 个备份(可选)

image-20251119165538222

image-20251119165636346

image-20251119165715014


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. 点击 “立即运行备份”“测试备份”
  2. 等待约 1–3 分钟
  3. 打开 Cloudflare R2 存储桶,确认文件已上传
  4. 下载备份,确认可正常解压且无损坏

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 中的文件夹名称
已启用启用自动备份

按环境推荐的备份频率#

Terminal window
# Production database(关键业务)
0 */6 * * * # 每 6 小时
# Staging(中等重要)
0 2 * * * # 每天凌晨 2 点
# Development(低重要)
0 2 * * 0 # 每周日凌晨 2 点
# 高频业务(电商 / 实时系统)
0 */3 * * * # 每 3 小时

4.2 测试数据库备份#

在依赖自动任务前,一定要先测试一次手动备份。

步骤如下:

  1. 点击 “测试备份”
  2. 观察实时日志,确保任务成功完成
  3. 打开 Cloudflare R2 存储桶检查备份文件是否已上传
  4. 下载备份文件,手动确认文件可正常解压、无损坏

备份文件示例结构#

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.gz

4.3 Dokploy 备份所使用的命令解析#

Dokploy 根据数据库类型执行原生备份命令,并以 .gz 压缩格式上传到 R2。


PostgreSQL:使用 pg_dump#

Terminal window
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#

Terminal window
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#

Terminal window
mariadb-dump --user='${databaseUser}' \
--password='${databasePassword}' \
--databases ${database} | gzip

MongoDB:使用 mongodump#

Terminal window
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-data
uploads
config

Dokploy(Docker Compose 应用)命名规则#

卷名称格式:

{appName}_{volumeName}

示例:

  • App: n8n-kqlble Volume: n8n_data 完整卷名:

    n8n-kqlble_n8n_data
  • App: memos-prod Volume: memos_data 完整卷名:

    memos-prod_memos_data
  • App: plausible-analytics Volume: 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 备份损坏
  • 避免部分写入的文件
  • 保证文件系统快照完整

流程:

  1. Dokploy 停止容器
  2. 执行卷备份(没有写入操作)
  3. 上传至 R2
  4. 自动重启容器

停机时间:通常 30 秒–2 分钟

建议安排在流量最低时期(如凌晨 03:00)。

适用于:

  • SQLite 或嵌入式数据库应用
  • 活跃写入系统
  • 重要生产环境

不推荐:保持容器运行进行备份(零停机,但有风险)#

优势:

  • 无停机
  • 更快

风险:

  • 文件可能处于写入状态 → 备份损坏
  • SQLite 数据库几乎可以确定会损坏
  • 部分大文件可能只备份了一半
  • 恢复可能失败

适用于:

  • 测试环境
  • 静态内容很少变更
  • 具备安全 WAL 的应用

SQLite:绝对不要在运行中备份。


5.6 如何查找正确的卷名#

方法 1:Dokploy UI#

应用 → 高级 → 挂载

方法 2:查看 docker-compose.yml#

示例:

volumes:
n8n_data:

方法 3:服务器终端检查 Docker 卷#

Terminal window
docker volume ls

过滤某个应用:

Terminal window
docker volume ls | grep n8n

确认卷名存在:

Terminal window
docker volume inspect xxxx

7. 恢复备份#

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.gz

3. 执行恢复#

恢复过程将:

  • 删除整个数据库
  • 下载并导入备份
  • 恢复权限
  • 自动重启数据库连接

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}

验证方法:

Terminal window
docker volume ls | grep n8n

6.4.3 卷恢复关键限制#

卷恢复前必须:

条件必须满足
容器已停止卷不能被使用
卷已删除存在则无法覆盖
磁盘空间足够卷恢复可能较大
备份当前卷(如重要数据)防止错误覆盖

6.4.4 完整恢复流程(推荐)#

Terminal window
# 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 -d

6.4.5 恢复后检查#

  • 查看容器日志无错误
  • 验证应用成功启动
  • 检查恢复的数据是否正确
  • 测试完整功能

6.5 兼容性说明#

Dokploy 仅保证恢复通过 Dokploy 备份系统创建的备份文件

其他来源的备份(手动 .sql / cp -r / 自定义脚本等)可能不兼容,恢复时可能失败。


使用 Cloudflare R2 配置 Dokploy 备份
https://catcat.blog/dokploy-backups-cloudflare-r2.html
作者
猫猫博客
发布于
2025-11-19
许可协议
CC BY-NC-SA 4.0