#!/bin/bash # CodiMD 備份腳本 set -e # 備份目錄 BACKUP_DIR="./backups" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") # 建立備份目錄 mkdir -p "$BACKUP_DIR" echo "💾 開始備份 CodiMD..." echo "📅 備份時間: $(date)" echo "" # 1. 備份資料庫 echo "📦 備份 PostgreSQL 資料庫..." docker-compose exec -T database pg_dump -U codimd codimd > "$BACKUP_DIR/database_$TIMESTAMP.sql" if [ $? -eq 0 ]; then DB_SIZE=$(du -h "$BACKUP_DIR/database_$TIMESTAMP.sql" | cut -f1) echo "✅ 資料庫備份完成 ($DB_SIZE)" else echo "❌ 資料庫備份失敗" exit 1 fi # 2. 備份上傳檔案 echo "📁 備份上傳檔案..." UPLOAD_BACKUP="$BACKUP_DIR/uploads_$TIMESTAMP.tar.gz" if [ -d "upload-data" ] && [ "$(ls -A upload-data)" ]; then tar -czf "$UPLOAD_BACKUP" upload-data/ UPLOAD_SIZE=$(du -h "$UPLOAD_BACKUP" | cut -f1) echo "✅ 上傳檔案備份完成 ($UPLOAD_SIZE)" else echo "⚠️ 沒有上傳檔案需要備份" fi # 3. 備份環境設定 echo "📝 備份環境設定..." cp .env "$BACKUP_DIR/env_$TIMESTAMP.env" echo "✅ 環境設定備份完成" # 4. 建立備份資訊文件 cat > "$BACKUP_DIR/backup_$TIMESTAMP.txt" << EOF CodiMD 備份資訊 ================ 備份時間: $(date) 備份類型: 完整備份 檔案清單: - 資料庫: database_$TIMESTAMP.sql - 上傳檔案: uploads_$TIMESTAMP.tar.gz - 環境設定: env_$TIMESTAMP.env 還原方式: 1. 資料庫: cat database_$TIMESTAMP.sql | docker-compose exec -T database psql -U codimd codimd 2. 上傳檔案: tar -xzf uploads_$TIMESTAMP.tar.gz 3. 環境設定: cp env_$TIMESTAMP.env .env EOF echo "" echo "✅ 備份完成!" echo "" echo "📂 備份位置: $BACKUP_DIR/" ls -lh "$BACKUP_DIR" | grep "$TIMESTAMP" echo "" echo "💡 還原備份請查看: $BACKUP_DIR/backup_$TIMESTAMP.txt" # 清理超過 30 天的舊備份 echo "" echo "🧹 清理舊備份(超過 30 天)..." find "$BACKUP_DIR" -name "database_*.sql" -mtime +30 -delete 2>/dev/null || true find "$BACKUP_DIR" -name "uploads_*.tar.gz" -mtime +30 -delete 2>/dev/null || true find "$BACKUP_DIR" -name "env_*.env" -mtime +30 -delete 2>/dev/null || true echo "✅ 清理完成"