#!/bin/bash # 情绪博物馆后端服务部署脚本 # 部署到远程服务器 101.200.208.45 set -e # 配置变量 APP_NAME="emotion-museum-single" JAR_NAME="backend-single-1.0.0.jar" JAR_PATH="./target/${JAR_NAME}" # 远程服务器配置 REMOTE_HOST="101.200.208.45" REMOTE_USER="root" REMOTE_DIR="/data/programs/emotion-museum" REMOTE_LOG_DIR="/data/logs/emotion-museum" REMOTE_JAR_NAME="emotion-single-1.0.0.jar" SPRING_PROFILE="test" # 颜色输出 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" } # 构建项目 build_project() { log_info "开始构建项目..." if ! command -v mvn > /dev/null 2>&1; then log_error "未找到Maven命令,请确保已安装Maven" exit 1 fi log_info "执行: mvn clean package -DskipTests" if ! mvn clean package -DskipTests; then log_error "项目构建失败" exit 1 fi if [ ! -f "$JAR_PATH" ]; then log_error "项目构建失败,未找到JAR文件: $JAR_PATH" exit 1 fi log_info "✅ 项目构建成功: $JAR_PATH" log_info "文件大小: $(ls -lh $JAR_PATH | awk '{print $5}')" } # 检查JAR文件 check_jar() { if [ ! -f "$JAR_PATH" ]; then log_error "JAR文件不存在: $JAR_PATH" log_info "请先执行打包命令: mvn clean package" exit 1 fi log_info "JAR文件检查通过: $JAR_PATH" } # 显示服务状态 show_status() { log_info "=== 服务信息 ===" log_info "服务器地址: $REMOTE_HOST" log_info "部署目录: $REMOTE_DIR" log_info "日志目录: $REMOTE_LOG_DIR" log_info "Spring Profile: $SPRING_PROFILE" log_info "检查服务状态..." ssh $REMOTE_USER@$REMOTE_HOST "ps aux | grep $REMOTE_JAR_NAME | grep -v grep" || log_info "服务未运行" } # 部署到远程服务器 # 参数: $1 - 可选,指定要上传的额外文件 deploy() { UPLOAD_SCRIPT="$1" log_info "开始部署到 $REMOTE_HOST..." build_project check_jar # 创建远程目录 log_info "创建远程目录..." ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_DIR" || { log_error "创建远程目录失败"; exit 1; } ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_LOG_DIR" || { log_error "创建远程日志目录失败"; exit 1; } # 上传JAR文件 log_info "上传JAR文件到远程服务器..." log_info "本地文件: $JAR_PATH" log_info "远程路径: $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$REMOTE_JAR_NAME" if ! scp "$JAR_PATH" $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$REMOTE_JAR_NAME; then log_error "上传JAR文件失败" exit 1 fi log_info "✅ JAR文件上传成功" # 验证远程文件 log_info "验证远程文件..." ssh $REMOTE_USER@$REMOTE_HOST "ls -lh $REMOTE_DIR/$REMOTE_JAR_NAME" || { log_error "远程文件验证失败"; exit 1; } # 上传额外文件 if [ -n "$UPLOAD_SCRIPT" ] && [ -f "$UPLOAD_SCRIPT" ]; then log_info "上传文件到远程服务器: $UPLOAD_SCRIPT" if ! scp "$UPLOAD_SCRIPT" $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/; then log_error "上传文件失败: $UPLOAD_SCRIPT" exit 1 fi log_info "✅ 文件上传成功: $UPLOAD_SCRIPT" REMOTE_FILENAME=$(basename "$UPLOAD_SCRIPT") if [[ "$REMOTE_FILENAME" == *.sh ]]; then ssh $REMOTE_USER@$REMOTE_HOST "chmod +x $REMOTE_DIR/$REMOTE_FILENAME" fi fi # 执行远程部署 log_info "在远程服务器上执行部署..." if ! ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_DIR && ./deploy-server.sh $SPRING_PROFILE"; then log_error "远程部署脚本执行失败" exit 1 fi log_info "✅ 部署完成!" show_status } # 打印使用说明 print_usage() { echo "用法: $0 [命令] [参数]" echo "" echo "命令:" echo " (无参数) - 部署到远程服务器(默认)" echo " [文件名] - 部署并上传指定文件(如 deploy-server.sh)" echo " build - 仅构建项目" echo " status - 查看远程服务状态" echo "" echo "示例:" echo " $0 # 部署到远程服务器" echo " $0 deploy-server.sh # 同时上传部署脚本" echo " $0 build # 仅构建项目" echo " $0 status # 查看服务状态" } # 主逻辑 case "${1:-}" in "") deploy ;; "build") build_project ;; "status") show_status ;; "help"|"-h"|"--help") print_usage ;; *) # 如果参数是文件,则上传该文件 if [ -f "$1" ]; then deploy "$1" else deploy "$1" fi ;; esac