#!/bin/bash # ========================================== # CodiMD 一鍵完整還原腳本 (DB + Uploads) # ========================================== # 1. 自動偵測最新的備份檔案 LATEST_DB=$(ls -t ./backup/codimd-db-*.sql.gz 2>/dev/null | head -1) LATEST_IMG=$(ls -t ./backup/codimd-uploads-*.tar.gz 2>/dev/null | head -1) if [ -z "$LATEST_DB" ] || [ -z "$LATEST_IMG" ]; then echo "❌ 錯誤: 在 ./backup 找不到完整的備份檔 (需要 .sql.gz 和 .tar.gz)" exit 1 fi echo "--- 📋 準備還原以下備份 ---" echo "📅 資料庫: $LATEST_DB" echo "🖼️ 圖片檔: $LATEST_IMG" echo "------------------------------------------" read -p "⚠️ 警告:這將會覆蓋目前容器內的所有資料!確定要執行嗎?(y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "操作已取消。" exit 1 fi # 2. 取得 Pod 名稱 DB_POD=$(kubectl get pod -l app=codimd-db -o jsonpath="{.items[0].metadata.name}" 2>/dev/null) APP_POD=$(kubectl get pod -l app=codimd -o jsonpath="{.items[0].metadata.name}" 2>/dev/null) if [ -z "$DB_POD" ] || [ -z "$APP_POD" ]; then echo "❌ 錯誤: 找不到運作中的 CodiMD Pod,請確認 K8s 資源狀態。" exit 1 fi # --- A. 還原資料庫 (含清空邏輯) --- echo "--- 🗄️ 正在還原資料庫結構與內容... ---" # 先清空 Schema 以避免重複匯入導致的鍵值衝突 kubectl exec -i $DB_POD -- psql -U codimd -d codimd -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;" > /dev/null zcat "$LATEST_DB" | kubectl exec -i $DB_POD -- psql -U codimd -d codimd > /dev/null if [ $? -eq 0 ]; then echo "✅ 資料庫還原成功。" else echo "❌ 資料庫還原發生錯誤。" exit 1 fi # --- B. 還原圖片檔案 --- echo "--- 🖼️ 正在同步圖片檔案 (Uploads)... ---" # 清空目前目錄避免新舊檔案混雜 kubectl exec $APP_POD -- sh -c "rm -rf /home/hackmd/app/public/uploads/*" # 解壓縮並傳入 Pod cat "$LATEST_IMG" | kubectl exec -i $APP_POD -- tar zxf - -C /home/hackmd/app/public/ # 修正權限確保 CodiMD 服務 (UID 1500) 擁有存取權 kubectl exec $APP_POD -- chown -R 1500:1500 /home/hackmd/app/public/uploads echo "✅ 圖片還原與權限修正完成。" # 3. 重啟服務以套用變更 echo "--- 🔄 正在重啟應用程式容器... ---" kubectl rollout restart deployment codimd-app kubectl rollout status deployment codimd-app echo "------------------------------------------" echo "✨ 還原程序已執行完畢。" echo "目前資料已同步至備份檔日期:$(echo $LATEST_DB | grep -oE '[0-9]{8}-[0-9]{4}')"