#!/bin/bash # X-Server Mobile 回滚脚本 # 使用方法: ./rollback.sh [backup_name] set -e # 配置 SERVER="your-server.com" DEPLOY_USER="root" DEPLOY_PATH="/opt/x-server-mobile" BACKUP_NAME=$1 # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 列出可用备份 list_backups() { log_info "可用备份列表:" ssh ${DEPLOY_USER}@${SERVER} << 'EOF' cd /opt/x-server-mobile/backup ls -1t | head -10 EOF } # 确认备份存在 check_backup() { log_info "检查备份 ${BACKUP_NAME}..." EXISTS=$(ssh ${DEPLOY_USER}@${SERVER} " if [ -d ${DEPLOY_PATH}/backup/${BACKUP_NAME} ]; then echo 'exists' else echo 'not_found' fi ") if [ "$EXISTS" != "exists" ]; then log_error "备份不存在: ${BACKUP_NAME}" list_backups exit 1 fi log_info "备份检查通过" } # 回滚前端 rollback_frontend() { log_info "回滚前端..." ssh ${DEPLOY_USER}@${SERVER} << EOF rm -rf ${DEPLOY_PATH}/frontend/* cp -r ${DEPLOY_PATH}/backup/${BACKUP_NAME}/frontend/* ${DEPLOY_PATH}/frontend/ EOF log_info "前端回滚完成" } # 回滚后端(可选) rollback_backend() { read -p "是否回滚后端代码? (y/N) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "跳过后端回滚" return fi log_info "回滚后端..." ssh ${DEPLOY_USER}@${SERVER} << EOF # 保留 vendor 目录 mv ${DEPLOY_PATH}/backend/vendor /tmp/backend_vendor_backup 2>/dev/null || true rm -rf ${DEPLOY_PATH}/backend/* cp -r ${DEPLOY_PATH}/backup/${BACKUP_NAME}/backend/* ${DEPLOY_PATH}/backend/ # 恢复 vendor 目录 mv /tmp/backend_vendor_backup ${DEPLOY_PATH}/backend/vendor 2>/dev/null || true EOF log_info "后端回滚完成" } # 重启服务 restart_services() { log_info "重启服务..." ssh ${DEPLOY_USER}@${SERVER} << 'EOF' cd /opt/x-server-mobile # 重启后端容器 docker-compose -f docker-compose.prod.yml restart backend # 等待后端启动 sleep 5 # 重载 OpenResty openresty -s reload || nginx -s reload echo "服务重启完成" EOF log_info "服务重启完成" } # 主流程 main() { echo "=========================================" echo " X-Server Mobile 回滚脚本" echo "=========================================" echo "服务器: ${SERVER}" if [ -z "$BACKUP_NAME" ]; then log_error "请指定备份名称" echo "" list_backups echo "" echo "使用方法: ./rollback.sh " exit 1 fi echo "备份名称: ${BACKUP_NAME}" echo "" # 确认回滚 read -p "确认回滚到 ${BACKUP_NAME}? (y/N) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "回滚已取消" exit 0 fi check_backup rollback_frontend rollback_backend restart_services echo "" log_info "回滚完成!" } # 执行主流程 main