Files
Mebbling/docs/OPERATIONS.md
T

69 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 維運:備份、還原與資料庫升級
## 備份
在專案根目錄執行:
```bash
./scripts/backup.sh
```
腳本會在 `data/backups/YYYYMMDD-HHMMSS/` 建立兩個檔案:
- `hub.db`:由正在執行的 SQLite 資料庫建立的一致性備份。
- `uploads.tar.gz`Hub 本機上傳的附件。
每次備份都會執行 SQLite `integrity_check`、驗證附件壓縮檔,並在 `SHA256SUMS` 記錄雜湊。`data/backups/` 已由 Git 排除。
可設定保留與異地複製(例如掛載的 NAS、加密磁碟或 rclone 掛載點):
```bash
BACKUP_RETENTION_DAYS=30 BACKUP_OFFSITE_DIR=/mnt/nas/mebbling ./scripts/backup.sh
```
在 WSL 主機安裝每日 03:15 排程:
```bash
./scripts/install-backup-cron.sh
```
## 還原
先在非正式環境執行還原演練;腳本會驗證雜湊、停止服務、保留原本資料庫副本、還原資料庫與附件後重新啟動:
```bash
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_DAYS``READING_HISTORY_RETENTION_DAYS``AUDIT_RETENTION_DAYS` 可設定保存天數;`0` 代表無限期保存。Worker 每日清理一次。到期或已使用的邀請連結會自動移除。
使用者可在「帳號設定」以目前密碼與 `DELETE` 文字確認刪除帳號及個人資料。若帳號仍擁有來源,必須先轉移或刪除來源,避免誤刪共享內容。
## 外部告警
設定 `ALERT_WEBHOOK_URL` 後,Worker 會在同步重試耗盡、或簽章 Webhook 超過 7 天未收到事件時發送告警。支援 Discord incoming webhook 或 ntfy topic URL;同一事件每小時最多通知一次。
## 監控指標與健康檢查
`GET /api/health?probe=live` 只確認程序存活;預設的 `GET /api/health` 是 readiness 檢查,會確認 SQLite 可讀取。Prometheus 格式的 `GET /api/metrics` 提供來源、公開貼文、同步佇列、Webhook 與附件快取的聚合指標。若設定 `METRICS_TOKEN`,請以 `Authorization: Bearer <token>` 抓取。