docs(backup): 備份審計完整盤點 + 新增 AWOOOI DB 與 Gitea DB 備份腳本
首席架構師備份審計結論: - awoooi_prod PostgreSQL:❌ 無備份 (P0 缺口) - Gitea SQLite DB:❌ 無備份 (今日已損壞,人工修復耗時 2h+) 新增: - scripts/backup/backup-awoooi-db.sh (188 部署,02:00 daily) - scripts/backup/backup-gitea-db.sh (110 部署,01:00 daily) - docs/runbooks/BACKUP-STATUS.md (全景表 + 部署步驟 + SOP) - LOGBOOK.md 備份審計段落 待手動部署:統帥需 scp 腳本至 188/110 並設定 crontab Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
39
scripts/backup/backup-awoooi-db.sh
Normal file
39
scripts/backup/backup-awoooi-db.sh
Normal file
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# AWOOOI PostgreSQL 每日備份腳本
|
||||
# 2026-04-05 Claude Code: 盤點後發現 awoooi DB 無備份,依循 backup-momo-db.sh 規範建立
|
||||
# 部署位置: /home/ollama/scripts/backup-awoooi-db.sh (on 192.168.0.188)
|
||||
# cron: 0 2 * * * /home/ollama/scripts/backup-awoooi-db.sh >> /home/ollama/logs/backup-awoooi.log 2>&1
|
||||
# =============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
BACKUP_DIR="/home/ollama/backups/awoooi"
|
||||
DATE=$(date +%Y-%m-%d_%H-%M)
|
||||
RETENTION_DAYS=30
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
echo "[$(date)] 開始 AWOOOI DB 備份..."
|
||||
|
||||
# awoooi_prod — 主要生產資料庫(知識庫、事故、AutoRepair 決策等)
|
||||
sudo -u postgres pg_dump awoooi_prod | gzip > "$BACKUP_DIR/awoooi_prod_${DATE}.sql.gz"
|
||||
echo "[$(date)] ✅ awoooi_prod 備份完成"
|
||||
|
||||
# awoooi_dev — 開發資料庫
|
||||
sudo -u postgres pg_dump awoooi_dev 2>/dev/null | gzip > "$BACKUP_DIR/awoooi_dev_${DATE}.sql.gz" || \
|
||||
echo "[$(date)] ⚠️ awoooi_dev 備份跳過(可能不存在)"
|
||||
|
||||
# k3s_datastore — K3s Kine 資料庫
|
||||
sudo -u postgres pg_dump k3s_datastore 2>/dev/null | gzip > "$BACKUP_DIR/k3s_datastore_${DATE}.sql.gz" || \
|
||||
echo "[$(date)] ⚠️ k3s_datastore 備份跳過"
|
||||
|
||||
# 清理舊備份(保留 30 天)
|
||||
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +"$RETENTION_DAYS" -delete
|
||||
echo "[$(date)] 清理超過 ${RETENTION_DAYS} 天的舊備份完成"
|
||||
|
||||
# 列出最新備份
|
||||
echo "[$(date)] 目前備份清單:"
|
||||
ls -lh "$BACKUP_DIR"/*.sql.gz 2>/dev/null | tail -10
|
||||
|
||||
echo "[$(date)] AWOOOI DB 備份完成!"
|
||||
42
scripts/backup/backup-gitea-db.sh
Normal file
42
scripts/backup/backup-gitea-db.sh
Normal file
@@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# Gitea SQLite 每日備份腳本
|
||||
# 2026-04-05 Claude Code: 盤點後發現 Gitea DB 無備份,今日已發生損壞事故
|
||||
# 部署位置: /home/wooo/scripts/backup-gitea-db.sh (on 192.168.0.110)
|
||||
# cron (wooo@110): 0 1 * * * /home/wooo/scripts/backup-gitea-db.sh >> /home/wooo/logs/backup-gitea.log 2>&1
|
||||
# 教訓: 2026-04-05 Gitea DB 損壞,靠 sqlite3 .recover 才救回 — 人工修復耗時 2+ 小時
|
||||
# =============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
GITEA_DB="/home/wooo/gitea/gitea_data/gitea/gitea.db"
|
||||
BACKUP_DIR="/home/wooo/backups/gitea"
|
||||
DATE=$(date +%Y-%m-%d_%H-%M)
|
||||
RETENTION_DAYS=30
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
echo "[$(date)] 開始 Gitea DB 備份..."
|
||||
|
||||
if [ ! -f "$GITEA_DB" ]; then
|
||||
echo "[$(date)] ❌ Gitea DB 不存在: $GITEA_DB"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# SQLite online backup(不需要停止 Gitea)
|
||||
sqlite3 "$GITEA_DB" ".backup '$BACKUP_DIR/gitea_${DATE}.db'"
|
||||
echo "[$(date)] ✅ Gitea DB 備份完成"
|
||||
|
||||
# 壓縮備份
|
||||
gzip "$BACKUP_DIR/gitea_${DATE}.db"
|
||||
echo "[$(date)] ✅ 壓縮完成: gitea_${DATE}.db.gz"
|
||||
|
||||
# 清理舊備份(保留 30 天)
|
||||
find "$BACKUP_DIR" -name "gitea_*.db.gz" -mtime +"$RETENTION_DAYS" -delete
|
||||
echo "[$(date)] 清理超過 ${RETENTION_DAYS} 天的舊備份完成"
|
||||
|
||||
# 列出最新備份
|
||||
echo "[$(date)] 目前備份清單:"
|
||||
ls -lh "$BACKUP_DIR"/gitea_*.db.gz 2>/dev/null | tail -5
|
||||
|
||||
echo "[$(date)] Gitea DB 備份完成!"
|
||||
Reference in New Issue
Block a user