Files
root 4ceb5eac7e chore: 重组项目文件结构,文档和部署文件归档
文件结构优化:
- docs/ 归档所有项目文档(PROJECT.md, PROJECT_ISSUES.md 等)
- deploy/ 归档所有部署相关文件(docker-compose.prod.yml, nginx 配置等)
- scripts/ 归档脚本文件(deploy.sh, rollback.sh)
- tests/ 归档测试文件(test_data.php)

更新引用路径:
- CLAUDE.md 更新文档路径引用
- 部署文档更新配置文件路径引用

清理文件:
- 移除非必要的测试文件(TestController, 测试脚本等)
- 移除重复/错误的目录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:01:17 +08:00

160 lines
3.2 KiB
Bash
Executable File

#!/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