备份与恢复

本页内容

当你需要选定内容数据的离线副本时使用 JSON 备份。EmDash 无法导入该文件。恢复计划需要原始数据库备份或时间点恢复,以及媒体二进制文件的单独副本。

备份包含的内容

JSON 备份包括:

  • 所有内容条目,包括草稿、计划发布和已删除项目
  • 组成内容模型的集合和字段定义
  • 分类法定义、术语以及分配给每个条目的术语
  • 菜单和菜单项、区块、小部件区域和小部件、SEO 记录、修订历史、媒体元数据和数据库迁移历史
  • 站点设置,如标题、标语、URL、语言环境、徽标、显示偏好、社交资料和 SEO 默认值。这些来自 site:emdash:site_emdash:locale 设置组。

它省略所有其他数据库表,包括:

  • 用户账户、会话、passkey、OAuth 数据、API 令牌和其他身份验证数据
  • 插件存储和插件设置,包括插件密钥
  • 评论和反应、重定向和 404 日志、作者署名、内容关系和引用、审计日志、速率限制和计划任务状态
  • 媒体文件夹、媒体使用位置记录、不完整或进行中的上传,以及媒体文件本身
  • 其他站点选项,包括预览签名密钥和备份计划

备份是 JSON 文件,使用与 EmDash 预览系统相同的快照格式,以创建它们的 EmDash 版本进行版本控制。

一键下载

在管理面板的 Settings → Backups 中,Download backup 按钮会生成新的备份并下载为 JSON 文件。需要管理员角色。

下载用于检查或自定义迁移工具。在批量导入、架构更改或重大升级之前,使用以下选项之一创建可恢复的数据库备份。

自动备份到存储

如果你的站点配置了存储后端(Cloudflare 上的 R2、S3 或本地存储),你可以启用每日自动备份:

  1. 在管理面板中打开 Settings → Backups

  2. 开启 Daily automatic backups

  3. 选择保留多少个备份(1–30)。较旧的归档会自动清理。

  4. 保存。备份作为 EmDash 计划维护的一部分运行 — 无需额外的 cron 设置。

归档存储在存储桶的 backups/ 前缀下,格式为 emdash-backup-<timestamp>-<random>.json。管理面板中的 Stored Backups 列表允许你下载或删除单个归档,Back up now 可按需创建一个。

自动备份依托于计划维护触发(与预约发布相同的机制)— 在 Cloudflare 上是 Worker 的 cron 触发器,在 Node 上是内置调度程序。如果你的部署未配置 cron 触发器,请改用 Back up now 或下载按钮。

备份和恢复媒体对象

R2 和 S3 兼容存储桶除了数据库外还需要对象级别的备份。以下 AWS CLI 示例将所有对象(包括 EmDash 的 backups/ 归档)复制到本地备份目录。对于 AWS S3,省略 --endpoint-url

aws s3 sync s3://emdash-media ./emdash-media-backup \
  --endpoint-url https://<account-id>.r2.cloudflarestorage.com

日常备份作业使用只读存储桶凭据。将备份存储在生产账户或故障域之外,并记录同时创建的数据库备份或 Time Travel 点。

恢复到空的恢复存储桶,而不是在生产环境处理请求时覆盖它:

aws s3 sync ./emdash-media-backup s3://emdash-media-recovery \
  --endpoint-url https://<account-id>.r2.cloudflarestorage.com

仅授予恢复作业对恢复存储桶的写入权限。将非生产部署指向该存储桶,打开几个已知的媒体 URL,上传并删除一个一次性文件。仅在恢复的数据库和媒体集一起通过检查后才切换生产绑定或存储桶配置。

使用 Time Travel 恢复 D1 数据库

在风险操作之前,向 Time Travel 查询当前书签,并将其与部署或变更记录一起记录:

npx wrangler d1 time-travel info my-database

如果需要恢复,停止对站点的写入,并在运行破坏性恢复命令之前检查可用的恢复点:

npx wrangler d1 time-travel restore my-database --timestamp=2026-07-08T13:00:00Z

Time Travel 恢复整个数据库,包括内容、用户、设置、插件数据和迁移记录。它不恢复 R2 媒体对象。命令完成后,部署与恢复数据库匹配的应用程序版本,重新开放流量,并验证登录、内容读取、架构更改和写入。

详情请参阅 D1 Time Travel 文档

创建异地 D1 转储

对于原始数据库的完整 SQL 转储(包括用户和认证表),使用 Wrangler:

npx wrangler d1 export my-database --remote --output=backup.sql

将 SQL 文件与对应的应用程序版本和同时创建的媒体备份一起保管。通过将转储导入新配置的空 D1 数据库、更新非生产绑定到该数据库并验证站点来测试恢复。

使用以下命令导入到空的恢复数据库:

npx wrangler d1 execute my-recovery-database --remote --file=backup.sql

SQLite 备份和恢复

对于离线 SQLite 备份,停止所有写入数据库的进程并复制数据库文件。对于一致的在线备份,使用 SQLite 的备份命令:

sqlite3 emdash.db ".backup backup.db"

单独备份本地上传目录或 S3 兼容存储桶。要恢复,停止所有服务器进程,保留损坏数据库的副本,用经过验证的备份替换它,恢复所有需要的媒体对象,并启动对应的应用程序版本。在重新开放流量之前验证登录、公共内容、编辑和媒体读取。

JSON 导出无法恢复站点

EmDash 没有用于 JSON 恢复的管理操作、API 端点或 CLI 命令。请使用上述的 D1 Time Travel、原始 D1 SQL 转储或 SQLite 数据库副本。