備份與復原

本頁內容

需要選定內容資料的離線副本時,使用 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 權杖、外掛資料或機密,因此不能替代用於災難復原的資料庫 備份。