#!/bin/bash # ============================================ # Forge Admin 手动部署脚本(16GB+ 内存优化版) # 适用系统: CentOS 7/8 / Anolis OS / RHEL # ============================================ set -e # ======================== # 配置变量(按需修改) # ======================== MYSQL_PASSWORD="root" REDIS_PASSWORD="root" PROJECT_DIR="/mnt/project/forge_admin" DEPLOY_DIR="/opt/forge" GIT_REPO="http://3081089em4.wicp.vip/user5/forge_admin.git" echo "==========================================" echo " Forge Admin 手动部署 - 开始" echo " 目标目录: ${DEPLOY_DIR}" echo "==========================================" # ======================== # 1. 安装基础工具 # ======================== echo "[1/9] 安装基础工具..." sudo yum install -y wget curl git vim # ======================== # 2. 安装 JDK 17 + Maven # ======================== echo "[2/10] 安装 JDK 17 + Maven..." if java -version 2>&1 | grep -q "17"; then echo " ✓ JDK 17 已安装" else sudo yum install -y java-17-openjdk java-17-openjdk-devel echo " ✓ JDK 17 安装完成" fi java -version # 安装 Maven if ! command -v mvn &> /dev/null; then echo " 安装 Maven..." # 方案1: yum 直接安装(Anolis/CentOS 自带) set +e sudo yum install -y maven 2>/dev/null MAVEN_YUM=$? set -e if [ $MAVEN_YUM -eq 0 ] && command -v mvn &> /dev/null; then echo " ✓ Maven 通过 yum 安装完成: $(mvn -version | head -1)" else # 方案2: 从国内镜像下载 echo " yum 安装不可用,从镜像下载..." set +e curl -L --retry 3 --connect-timeout 30 \ https://mirrors.aliyun.com/apache/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz \ -o /tmp/maven.tar.gz if [ ! -s /tmp/maven.tar.gz ]; then curl -L --retry 3 --connect-timeout 30 \ https://mirrors.huaweicloud.com/apache/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz \ -o /tmp/maven.tar.gz fi set -e if [ -s /tmp/maven.tar.gz ]; then sudo tar -xzf /tmp/maven.tar.gz -C /opt/ sudo ln -sf /opt/apache-maven-3.9.9/bin/mvn /usr/local/bin/mvn rm -f /tmp/maven.tar.gz echo " ✓ Maven 安装完成: $(mvn -version | head -1)" else echo " ✗ Maven 安装失败,请手动执行:" echo " sudo yum install -y maven" exit 1 fi fi else echo " ✓ Maven 已安装: $(mvn -version | head -1)" fi # ======================== # 3. 安装 Node.js 20 + pnpm # ======================== echo "[3/10] 安装 Node.js 20..." if command -v node &> /dev/null && node -v | grep -q "v20"; then echo " ✓ Node.js 20 已安装: $(node -v)" else curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - sudo yum install -y nodejs echo " ✓ Node.js 安装完成: $(node -v)" fi if ! command -v pnpm &> /dev/null; then npm install -g pnpm@8 echo " ✓ pnpm 安装完成: $(pnpm -v)" else echo " ✓ pnpm 已安装: $(pnpm -v)" fi # ======================== # 4. 安装 MySQL 8.0 # ======================== echo "[4/10] 安装 MySQL 8.0..." if command -v mysql &> /dev/null; then echo " ✓ MySQL 已安装: $(mysql --version)" else sudo yum install -y mysql-server echo " ✓ MySQL 安装完成" fi sudo systemctl start mysqld sudo systemctl enable mysqld # 初始化 MySQL(设置 root 密码 + 创建数据库) echo " 配置 MySQL..." sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${MYSQL_PASSWORD}'; FLUSH PRIVILEGES;" 2>/dev/null || true sudo mysql -u root -p"${MYSQL_PASSWORD}" -e "CREATE DATABASE IF NOT EXISTS forge_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" 2>/dev/null || \ sudo mysql -e "CREATE DATABASE IF NOT EXISTS forge_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" echo " ✓ 数据库 forge_admin 就绪" # ======================== # 5. 安装 Redis # ======================== echo "[5/10] 安装 Redis..." if command -v redis-server &> /dev/null; then echo " ✓ Redis 已安装" else sudo yum install -y redis echo " ✓ Redis 安装完成" fi sudo systemctl start redis sudo systemctl enable redis # 设置 Redis 密码 if ! grep -q "^requirepass" /etc/redis.conf 2>/dev/null; then echo "requirepass ${REDIS_PASSWORD}" | sudo tee -a /etc/redis.conf sudo systemctl restart redis fi echo " ✓ Redis 启动完成" # ======================== # 6. 安装 Nginx # ======================== echo "[6/10] 安装 Nginx..." if command -v nginx &> /dev/null; then echo " ✓ Nginx 已安装" else sudo yum install -y nginx echo " ✓ Nginx 安装完成" fi sudo systemctl start nginx sudo systemctl enable nginx echo " ✓ Nginx 启动完成" # ======================== # 7. 克隆代码 # ======================== echo "[7/10] 克隆项目代码..." sudo mkdir -p $(dirname ${PROJECT_DIR}) cd $(dirname ${PROJECT_DIR}) if [ -d "forge_admin" ]; then echo " 项目目录已存在,更新代码..." cd forge_admin git pull else git clone ${GIT_REPO} cd forge_admin fi echo " ✓ 代码就绪" # ======================== # 8. 构建后端 # ======================== echo "[8/10] 构建后端(约 3-5 分钟)..." cd ${PROJECT_DIR}/forge-server # 创建生产配置文件 mkdir -p ${PROJECT_DIR}/forge-server/forge-admin-server/src/main/resources cat > ${PROJECT_DIR}/forge-server/forge-admin-server/src/main/resources/application-prod.yml << EOF spring: datasource: type: com.zaxxer.hikari.HikariDataSource dynamic: primary: master strict: true datasource: master: type: \${spring.datasource.type} driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/forge_admin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root password: ${MYSQL_PASSWORD} hikari: maxPoolSize: 20 minIdle: 10 connectionTimeout: 30000 validationTimeout: 5000 idleTimeout: 600000 maxLifetime: 1800000 keepaliveTime: 30000 spring.data: redis: host: localhost port: 6379 database: 0 password: ${REDIS_PASSWORD} timeout: 10s ssl.enabled: false redisson: config: | singleServerConfig: address: "redis://localhost:6379" database: 0 password: ${REDIS_PASSWORD} connectTimeout: 10000 timeout: 3000 retryAttempts: 3 retryInterval: 1500 connectionPoolSize: 64 connectionMinimumIdleSize: 10 threads: 16 nettyThreads: 32 hotel: qr: base-url: http://localhost path: "/#/pages/hotel/scan-bind" pay: mock-enabled: true EOF # 构建 mvn clean package -DskipTests -Pprod echo " ✓ 后端构建完成" # ======================== # 9. 构建前端 # ======================== echo "[9/10] 构建前端(约 2-3 分钟)..." cd ${PROJECT_DIR}/forge-admin-ui pnpm install pnpm build echo " ✓ 前端构建完成" # ======================== # 部署文件 # ======================== echo "" echo "==========================================" echo " 部署文件到 ${DEPLOY_DIR}" echo "==========================================" sudo mkdir -p ${DEPLOY_DIR} # 复制后端 jar sudo cp ${PROJECT_DIR}/forge-server/forge-admin-server/target/forge-admin-server.jar ${DEPLOY_DIR}/ sudo cp ${PROJECT_DIR}/forge-server/forge-flow/forge-flow-server/target/forge-flow-server.jar ${DEPLOY_DIR}/ # 复制前端 sudo mkdir -p ${DEPLOY_DIR}/frontend sudo cp -r ${PROJECT_DIR}/forge-admin-ui/dist/* ${DEPLOY_DIR}/frontend/ # 配置 Nginx sudo cat > /etc/nginx/conf.d/forge.conf << 'NGINXEOF' server { listen 80; server_name _; # 前端静态文件 location /forge { alias /opt/forge/frontend; try_files $uri $uri/ /forge/index.html; } # 根路径重定向到 /forge location = / { return 302 /forge; } # 后端 API 代理 location /api { proxy_pass http://localhost:8580; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 流程服务 API 代理 location /flow { proxy_pass http://localhost:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } NGINXEOF sudo nginx -t sudo systemctl reload nginx echo " ✓ Nginx 配置完成" # 创建启动脚本 sudo cat > ${DEPLOY_DIR}/start.sh << STARTEOF #!/bin/bash echo "启动 Forge Admin 服务..." # 启动 forge-admin(16GB 内存给 1GB) nohup java -Xms512m -Xmx1024m \ -Dspring.profiles.active=prod \ -jar ${DEPLOY_DIR}/forge-admin-server.jar > /var/log/forge-admin.log 2>&1 & echo " forge-admin 启动中... PID: \$!" # 启动 forge-flow nohup java -Xms256m -Xmx512m \ -Dspring.profiles.active=prod \ -jar ${DEPLOY_DIR}/forge-flow-server.jar > /var/log/forge-flow.log 2>&1 & echo " forge-flow 启动中... PID: \$!" echo "" echo "等待服务启动..." sleep 15 echo "查看日志: tail -f /var/log/forge-admin.log" echo "访问地址: http://localhost/forge" STARTEOF sudo chmod +x ${DEPLOY_DIR}/start.sh # 创建停止脚本 sudo cat > ${DEPLOY_DIR}/stop.sh << 'STOPEOF' #!/bin/bash echo "停止 Forge Admin 服务..." pkill -f forge-admin-server.jar && echo " forge-admin 已停止" || echo " forge-admin 未运行" pkill -f forge-flow-server.jar && echo " forge-flow 已停止" || echo " forge-flow 未运行" STOPEOF sudo chmod +x ${DEPLOY_DIR}/stop.sh # 创建重启脚本 sudo cat > ${DEPLOY_DIR}/restart.sh << 'RESTARTEOF' #!/bin/bash bash /opt/forge/stop.sh sleep 3 bash /opt/forge/start.sh RESTARTEOF sudo chmod +x ${DEPLOY_DIR}/restart.sh echo "" echo "==========================================" echo " ✅ 部署完成!" echo "==========================================" echo "" echo " 启动服务: sudo ${DEPLOY_DIR}/start.sh" echo " 停止服务: sudo ${DEPLOY_DIR}/stop.sh" echo " 重启服务: sudo ${DEPLOY_DIR}/restart.sh" echo "" echo " 查看日志:" echo " tail -f /var/log/forge-admin.log" echo " tail -f /var/log/forge-flow.log" echo "" echo " 访问地址: http://localhost/forge" echo " 账号: admin" echo " 密码: 123456" echo "" echo "=========================================="