Files

4.2 KiB
Raw Permalink Blame History

維運:備份、還原與資料庫升級

備份

在專案根目錄執行:

./scripts/backup.sh

腳本會在 data/backups/YYYYMMDD-HHMMSS/ 建立兩個檔案:

  • hub.db:由正在執行的 SQLite 資料庫建立的一致性備份。
  • uploads.tar.gzHub 本機上傳的附件。

每次備份都會執行 SQLite integrity_check、驗證附件壓縮檔,並在 SHA256SUMS 記錄雜湊。data/backups/ 已由 Git 排除。也可隨時執行不改動正式資料的驗證:

./scripts/verify-backup.sh data/backups/<時間>

可設定保留與異地複製(例如掛載的 NAS、加密磁碟或 rclone 掛載點):

BACKUP_RETENTION_DAYS=30 BACKUP_OFFSITE_DIR=/mnt/nas/mebbling ./scripts/backup.sh

若異地目的地可能由他人讀取,使用 age 加密。設定加密後,異地只會收到 backup.tar.gz.age,本機仍保留可供快速還原的已驗證備份:

BACKUP_AGE_RECIPIENT=age1你的收件人公鑰 \
BACKUP_RCLONE_REMOTE='remote:bucket/mebbling' \
BACKUP_RETENTION_DAYS=30 ./scripts/backup.sh

BACKUP_RCLONE_REMOTE 可使用已在主機設定好的 rclone S3、B2、SFTP 等 remote;腳本會在缺少 agerclone 時安全失敗,不會假裝已完成異地備份。加密檔要還原時,先以持有的 age identity 解密並解壓為原本的備份目錄,再使用下列還原命令。請把 verify-backup.sh 的成功輸出保留在 cron log 中,作為每日可用性驗證報告;完整還原演練仍應定期在隔離環境執行。

在 WSL 主機安裝每日 03:15 排程:

./scripts/install-backup-cron.sh

還原

先在非正式環境執行還原演練;腳本會驗證雜湊、停止服務、保留原本資料庫副本、還原資料庫與附件後重新啟動:

CONFIRM_RESTORE=YES ./scripts/restore.sh data/backups/<時間>

請始終一起還原資料庫與附件,否則貼文中的附件連結可能失效。

健康檢查與日誌

反向代理或監控服務可呼叫 GET /api/health。收到 200 且 JSON 的 ok: true 表示 Web 與 SQLite 可用;failedJobs 可用於設定同步異常告警。

容器日誌為 JSON 事件。管理員頁會保留最近的同步錯誤;請定期備份 SQLite,因為錯誤事件和限流狀態同樣位於資料庫。

附件掃毒

Hub 原生附件預設只接受圖片、PDF、純文字與 Markdown。若要串接掃毒服務,設定 VIRUS_SCAN_URL;服務應接受檔案內容的 HTTP POST,並回覆 JSON { "clean": true }。設為 VIRUS_SCAN_REQUIRED=1 後,掃毒服務逾時或不可用時會拒絕上傳。

Schema migration

資料庫 schema 由 lib/db.ts 管理。每個欄位 migration 在 schema_migrations 表中記錄版本與套用時間,啟動 Web 或 Worker 時會自動執行尚未套用的安全 migration。

升級 Mebbling 前請先執行備份。若新版本在測試環境正常運作,再升級正式資料;不支援直接以舊程式碼讀取已升級 schema 的保證。

資料保存與刪除

NOTIFICATION_RETENTION_DAYSREADING_HISTORY_RETENTION_DAYSAUDIT_RETENTION_DAYS 可設定保存天數;0 代表無限期保存。Worker 每日清理一次。到期或已使用的邀請連結會自動移除。

使用者可在「帳號設定」以目前密碼與 DELETE 文字確認刪除帳號及個人資料。若帳號仍擁有來源,必須先轉移或刪除來源,避免誤刪共享內容。

外部告警

設定 ALERT_WEBHOOK_URL 後,Worker 會在同步重試耗盡、或簽章 Webhook 超過 7 天未收到事件時發送告警。支援 HTTPS Discord incoming webhook 或 ntfy topic URL;同一事件每小時最多通知一次。告警會保存於 SQLite,失敗時以指數退避重試、最多五次;/api/metricsmebbling_alert_deliveries 可監看最終失敗。

監控指標與健康檢查

GET /api/health?probe=live 只確認程序存活;預設的 GET /api/health 是 readiness 檢查,會確認 SQLite 可讀取。Prometheus 格式的 GET /api/metrics 提供來源、公開貼文、同步佇列、Webhook 與附件快取的聚合指標。若設定 METRICS_TOKEN,請以 Authorization: Bearer <token> 抓取。