160 lines
3.2 KiB
Bash
160 lines
3.2 KiB
Bash
|
|
#!/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 <backup_name>"
|
||
|
|
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
|