#!/bin/bash set -e PROJECT_NAME="xlcp" REMOTE_SERVER="${1:-root@192.168.10.150}" REMOTE_DEPLOY_DIR="${REMOTE_DEPLOY_DIR:-/projects/data/xlcp}" LOCAL_DIR="$(cd "$(dirname "$0")" && pwd)/.." log_info() { echo "[INFO] $1"; } log_success() { echo "[SUCCESS] $1"; } log_error() { echo "[ERROR] $1"; exit 1; } check_files() { log_info "检查必要文件..." local files=( "$LOCAL_DIR/backend/yudao-server/target/yudao-server.jar" "$LOCAL_DIR/frontend/dist/index.html" "$LOCAL_DIR/deploy/docker-compose.yml" "$LOCAL_DIR/deploy/config/application-prod.yaml" "$LOCAL_DIR/deploy/docker/frontend/nginx.conf" "$LOCAL_DIR/deploy/sql/prison_schema.sql" ) for file in "${files[@]}"; do [ -f "$file" ] || log_error "文件不存在: $file" done log_success "所有必要文件存在" } upload_files() { log_info "上传文件到 $REMOTE_SERVER..." ssh "$REMOTE_SERVER" "mkdir -p $REMOTE_DEPLOY_DIR/{config,docker/frontend,sql,data,logs,backend/yudao-server/target}" rsync -avz --delete --exclude '*.tar.gz' --exclude '.git' \ --exclude 'node_modules' --exclude 'target' \ "$LOCAL_DIR/deploy/" "$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/deploy/" rsync -avz --progress "$LOCAL_DIR/backend/yudao-server/target/yudao-server.jar" \ "$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/backend/yudao-server/target/" rsync -avz --delete --progress --exclude 'node_modules' \ "$LOCAL_DIR/frontend/dist/" "$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/frontend/dist/" log_success "文件上传完成" } init_remote_dirs() { log_info "初始化远程目录..." ssh "$REMOTE_SERVER" "cd $REMOTE_DEPLOY_DIR && mkdir -p data/{mysql,redis,upload} logs/{backend,nginx} ssl && chmod -R 777 data/ logs/" log_success "远程目录初始化完成" } start_services() { log_info "启动服务..." ssh "$REMOTE_SERVER" "cd $REMOTE_DEPLOY_DIR/deploy && docker compose down -v 2>/dev/null; docker compose up -d" log_success "服务启动命令已执行" } health_check() { log_info "进行健康检查..." local server_ip=$(echo "$REMOTE_SERVER" | cut -d'@' -f2) for i in {1..30}; do curl -f -s "http://$server_ip:48080/actuator/health" > /dev/null 2>&1 && { log_success "后端服务正常"; break; } echo -n "." sleep 2 done log_info "检查前端..." curl -f -s "http://$server_ip/" > /dev/null 2>&1 && log_success "前端服务正常" || log_warn "前端可能未启动" } show_access_info() { local server_ip=$(echo "$REMOTE_SERVER" | cut -d'@' -f2) echo "" echo "=========================================" echo "部署成功!" echo "=========================================" echo "" echo "访问地址:" echo " 前端: http://$server_ip/" echo " 后端 API: http://$server_ip:48080/admin-api/" echo " 健康检查: http://$server_ip:48080/actuator/health" echo "" echo "管理命令:" echo " SSH: ssh $REMOTE_SERVER" echo " 查看日志: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose logs -f'" echo " 重启服务: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose restart'" echo " 停止服务: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose down'" echo "" echo "数据目录: $REMOTE_DEPLOY_DIR/data" echo "日志目录: $REMOTE_DEPLOY_DIR/logs" } show_help() { echo "用法: $0 [remote_server]" echo "" echo "参数:" echo " remote_server 远程服务器地址 (默认: root@192.168.10.150)" echo "" echo "环境变量:" echo " REMOTE_DEPLOY_DIR 远程部署目录 (默认: /projects/data/xlcp)" echo "" echo "示例:" echo " $0 # 部署到默认服务器" echo " $0 root@192.168.10.150 # 部署到指定服务器" echo " REMOTE_DEPLOY_DIR=/opt/xlcp $0 # 自定义部署目录" echo "" echo "检查文件:" echo " backend/yudao-server/target/yudao-server.jar" echo " frontend/dist/" echo " deploy/docker-compose.yml" echo " deploy/config/application-prod.yaml" echo " deploy/docker/frontend/nginx.conf" echo "" } main() { echo "=========================================" echo "XL监狱综合管理平台 - 部署脚本" echo "=========================================" [[ "$1" == "--help" || "$1" == "-h" ]] && { show_help; exit 0; } log_info "项目: $PROJECT_NAME, 服务器: $REMOTE_SERVER" log_info "部署目录: $REMOTE_DEPLOY_DIR" echo "" check_files upload_files init_remote_dirs start_services health_check show_access_info } main "$@"