备份与恢复

本页内容

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

要将站点的内容、设置与媒体复制到新的 EmDash 站点(包括不同数据库上的站点),请改用站点包。

若站点存储加密的插件设置,请将完整的 EMDASH_ENCRYPTION_KEY 轮换列表保存在单独的密钥管理器备份中。该密钥从不存入数据库、D1 Time Travel、SQL 转储或 JSON 导出。

备份包含什么

JSON 备份包括:

  • 所有内容条目,包括草稿、定时文章与回收站项目
  • 构成内容模型的集合与字段定义
  • 分类法定义、术语以及分配给每个条目的术语
  • 菜单与菜单项、分区、小部件区域与小部件、SEO 记录、修订历史、媒体 元数据以及数据库迁移历史
  • 站点设置,如标题、标语、URL、区域设置、徽标、显示偏好、社交资料 与 SEO 默认值。它们来自 site: 设置组以及 emdash:site_title、 emdash:site_tagline 与 emdash:locale 设置。

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

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

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

一键下载

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

该下载用于检查或自定义工具。在批量导入、模式更改或 重大升级之前,请用下面的选项之一创建可恢复的数据库备份。要将 站点移到另一个 EmDash 站点,请在 Settings → Transfer 下导出站点包。

自动备份到存储

若站点配置了存储后端(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 可按需创建一个。

自动备份依附于计划维护 tick(与定时发布相同的机制)——在 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 媒体对象或 EMDASH_ENCRYPTION_KEY。在测试插件集成之前,恢复已恢复的插件设置所引用的每一把加密密钥。命令完成后,部署与恢复数据库匹配的应用版本,重新开放流量,并验证登录、内容读取、模式更改、加密的插件设置与一次写入。

详情见 D1 Time Travel 文档。

创建异地 D1 转储

要完整 SQL 转储原始数据库(包括用户与认证表),使用 Wrangler:

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

将 SQL 文件与匹配的应用版本、同时创建的媒体备份,以及单独存储的 EMDASH_ENCRYPTION_KEY 轮换列表副本一起保存。通过将转储导入新开的空 D1 数据库、恢复运行时密钥、将非生产绑定更新到该数据库并验证站点来测试恢复。

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

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

SQLite 备份与恢复

对于离线 SQLite 备份,停止每个写入数据库的进程,并复制数据库文件及其旁边的任何 -wal 与 -shm 文件。-wal 文件可能包含尚未进入主文件的已提交更改。对于一致的在线备份,使用 SQLite 的备份命令:

sqlite3 emdash.db ".backup backup.db"

分别备份本地上传目录或 S3 兼容存储桶以及 EMDASH_ENCRYPTION_KEY 轮换列表。恢复时,停止每个服务器进程,保留损坏数据库的副本,用已验证的备份替换它,恢复运行时密钥与任何所需媒体对象,并启动匹配的应用版本。在重新开放流量前验证登录、公开内容、加密的插件设置、一次编辑与一次媒体读取。

JSON 导出无法恢复站点

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

要在新的空 EmDash 站点中重建站点内容,请在原站点仍可用时从其导出站点包,并导入到新站点。站点包 不恢复用户、API 令牌、插件数据或机密,因此不能替代用于灾难恢复的数据库 备份。