#!/bin/bash # ============================================ # LinkShare Blog - 数据库备份脚本 # ============================================ # 用途: 自动备份 PostgreSQL 数据库 # 用法: ./scripts/backup.sh [backup_name] # 示例: ./scripts/backup.sh daily set -e # 配置 BACKUP_DIR="/backups" DB_CONTAINER="blog-postgres" DB_NAME="linkshare" DB_USER="blog" RETENTION_DAYS=7 # 参数处理 BACKUP_NAME=${1:-"auto_$(date +%Y%m%d_%H%M%S)"} BACKUP_FILE="$BACKUP_DIR/${BACKUP_NAME}.sql.gz" # 颜色定义 GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 创建备份目录 mkdir -p "$BACKUP_DIR" # 检查数据库容器 if ! docker ps | grep -q "$DB_CONTAINER"; then log_error "数据库容器 '$DB_CONTAINER' 未运行" exit 1 fi # 执行备份 log_info "开始备份数据库: $DB_NAME" log_info "备份文件: $BACKUP_FILE" if docker exec "$DB_CONTAINER" pg_dump -U "$DB_USER" "$DB_NAME" 2>/dev/null | gzip > "$BACKUP_FILE"; then BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1) log_info "备份成功: $BACKUP_SIZE" # 记录备份信息 echo "Backup: $BACKUP_NAME" >> "$BACKUP_DIR/backup.log" echo "Date: $(date '+%Y-%m-%d %H:%M:%S')" >> "$BACKUP_DIR/backup.log" echo "Size: $BACKUP_SIZE" >> "$BACKUP_DIR/backup.log" echo "File: $BACKUP_FILE" >> "$BACKUP_DIR/backup.log" echo "---" >> "$BACKUP_DIR/backup.log" # 清理旧备份 log_info "清理 $RETENTION_DAYS 天前的旧备份..." find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete 2>/dev/null || true log_info "备份完成!" # 输出备份文件列表 echo "" echo "可用的备份:" ls -lh "$BACKUP_DIR"/*.sql.gz 2>/dev/null || echo "无备份文件" exit 0 else log_error "备份失败" rm -f "$BACKUP_FILE" exit 1 fi