deploy-manual.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. #!/bin/bash
  2. # ============================================
  3. # Forge Admin 手动部署脚本(16GB+ 内存优化版)
  4. # 适用系统: CentOS 7/8 / Anolis OS / RHEL
  5. # ============================================
  6. set -e
  7. # ========================
  8. # 配置变量(按需修改)
  9. # ========================
  10. MYSQL_PASSWORD="root"
  11. REDIS_PASSWORD="root"
  12. PROJECT_DIR="/mnt/project/forge_admin"
  13. DEPLOY_DIR="/opt/forge"
  14. GIT_REPO="http://3081089em4.wicp.vip/user5/forge_admin.git"
  15. echo "=========================================="
  16. echo " Forge Admin 手动部署 - 开始"
  17. echo " 目标目录: ${DEPLOY_DIR}"
  18. echo "=========================================="
  19. # ========================
  20. # 1. 安装基础工具
  21. # ========================
  22. echo "[1/9] 安装基础工具..."
  23. sudo yum install -y wget curl git vim
  24. # ========================
  25. # 2. 安装 JDK 17 + Maven
  26. # ========================
  27. echo "[2/10] 安装 JDK 17 + Maven..."
  28. if java -version 2>&1 | grep -q "17"; then
  29. echo " ✓ JDK 17 已安装"
  30. else
  31. sudo yum install -y java-17-openjdk java-17-openjdk-devel
  32. echo " ✓ JDK 17 安装完成"
  33. fi
  34. java -version
  35. # 安装 Maven
  36. if ! command -v mvn &> /dev/null; then
  37. echo " 安装 Maven..."
  38. # 方案1: yum 直接安装(Anolis/CentOS 自带)
  39. set +e
  40. sudo yum install -y maven 2>/dev/null
  41. MAVEN_YUM=$?
  42. set -e
  43. if [ $MAVEN_YUM -eq 0 ] && command -v mvn &> /dev/null; then
  44. echo " ✓ Maven 通过 yum 安装完成: $(mvn -version | head -1)"
  45. else
  46. # 方案2: 从国内镜像下载
  47. echo " yum 安装不可用,从镜像下载..."
  48. set +e
  49. curl -L --retry 3 --connect-timeout 30 \
  50. https://mirrors.aliyun.com/apache/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz \
  51. -o /tmp/maven.tar.gz
  52. if [ ! -s /tmp/maven.tar.gz ]; then
  53. curl -L --retry 3 --connect-timeout 30 \
  54. https://mirrors.huaweicloud.com/apache/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz \
  55. -o /tmp/maven.tar.gz
  56. fi
  57. set -e
  58. if [ -s /tmp/maven.tar.gz ]; then
  59. sudo tar -xzf /tmp/maven.tar.gz -C /opt/
  60. sudo ln -sf /opt/apache-maven-3.9.9/bin/mvn /usr/local/bin/mvn
  61. rm -f /tmp/maven.tar.gz
  62. echo " ✓ Maven 安装完成: $(mvn -version | head -1)"
  63. else
  64. echo " ✗ Maven 安装失败,请手动执行:"
  65. echo " sudo yum install -y maven"
  66. exit 1
  67. fi
  68. fi
  69. else
  70. echo " ✓ Maven 已安装: $(mvn -version | head -1)"
  71. fi
  72. # ========================
  73. # 3. 安装 Node.js 20 + pnpm
  74. # ========================
  75. echo "[3/10] 安装 Node.js 20..."
  76. if command -v node &> /dev/null && node -v | grep -q "v20"; then
  77. echo " ✓ Node.js 20 已安装: $(node -v)"
  78. else
  79. curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
  80. sudo yum install -y nodejs
  81. echo " ✓ Node.js 安装完成: $(node -v)"
  82. fi
  83. if ! command -v pnpm &> /dev/null; then
  84. npm install -g pnpm@8
  85. echo " ✓ pnpm 安装完成: $(pnpm -v)"
  86. else
  87. echo " ✓ pnpm 已安装: $(pnpm -v)"
  88. fi
  89. # ========================
  90. # 4. 安装 MySQL 8.0
  91. # ========================
  92. echo "[4/10] 安装 MySQL 8.0..."
  93. if command -v mysql &> /dev/null; then
  94. echo " ✓ MySQL 已安装: $(mysql --version)"
  95. else
  96. sudo yum install -y mysql-server
  97. echo " ✓ MySQL 安装完成"
  98. fi
  99. sudo systemctl start mysqld
  100. sudo systemctl enable mysqld
  101. # 初始化 MySQL(设置 root 密码 + 创建数据库)
  102. echo " 配置 MySQL..."
  103. sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${MYSQL_PASSWORD}'; FLUSH PRIVILEGES;" 2>/dev/null || true
  104. 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 || \
  105. sudo mysql -e "CREATE DATABASE IF NOT EXISTS forge_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
  106. echo " ✓ 数据库 forge_admin 就绪"
  107. # ========================
  108. # 5. 安装 Redis
  109. # ========================
  110. echo "[5/10] 安装 Redis..."
  111. if command -v redis-server &> /dev/null; then
  112. echo " ✓ Redis 已安装"
  113. else
  114. sudo yum install -y redis
  115. echo " ✓ Redis 安装完成"
  116. fi
  117. sudo systemctl start redis
  118. sudo systemctl enable redis
  119. # 设置 Redis 密码
  120. if ! grep -q "^requirepass" /etc/redis.conf 2>/dev/null; then
  121. echo "requirepass ${REDIS_PASSWORD}" | sudo tee -a /etc/redis.conf
  122. sudo systemctl restart redis
  123. fi
  124. echo " ✓ Redis 启动完成"
  125. # ========================
  126. # 6. 安装 Nginx
  127. # ========================
  128. echo "[6/10] 安装 Nginx..."
  129. if command -v nginx &> /dev/null; then
  130. echo " ✓ Nginx 已安装"
  131. else
  132. sudo yum install -y nginx
  133. echo " ✓ Nginx 安装完成"
  134. fi
  135. sudo systemctl start nginx
  136. sudo systemctl enable nginx
  137. echo " ✓ Nginx 启动完成"
  138. # ========================
  139. # 7. 克隆代码
  140. # ========================
  141. echo "[7/10] 克隆项目代码..."
  142. sudo mkdir -p $(dirname ${PROJECT_DIR})
  143. cd $(dirname ${PROJECT_DIR})
  144. if [ -d "forge_admin" ]; then
  145. echo " 项目目录已存在,更新代码..."
  146. cd forge_admin
  147. git pull
  148. else
  149. git clone ${GIT_REPO}
  150. cd forge_admin
  151. fi
  152. echo " ✓ 代码就绪"
  153. # ========================
  154. # 8. 构建后端
  155. # ========================
  156. echo "[8/10] 构建后端(约 3-5 分钟)..."
  157. cd ${PROJECT_DIR}/forge-server
  158. # 创建生产配置文件
  159. mkdir -p ${PROJECT_DIR}/forge-server/forge-admin-server/src/main/resources
  160. cat > ${PROJECT_DIR}/forge-server/forge-admin-server/src/main/resources/application-prod.yml << EOF
  161. spring:
  162. datasource:
  163. type: com.zaxxer.hikari.HikariDataSource
  164. dynamic:
  165. primary: master
  166. strict: true
  167. datasource:
  168. master:
  169. type: \${spring.datasource.type}
  170. driverClassName: com.mysql.cj.jdbc.Driver
  171. 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
  172. username: root
  173. password: ${MYSQL_PASSWORD}
  174. hikari:
  175. maxPoolSize: 20
  176. minIdle: 10
  177. connectionTimeout: 30000
  178. validationTimeout: 5000
  179. idleTimeout: 600000
  180. maxLifetime: 1800000
  181. keepaliveTime: 30000
  182. spring.data:
  183. redis:
  184. host: localhost
  185. port: 6379
  186. database: 0
  187. password: ${REDIS_PASSWORD}
  188. timeout: 10s
  189. ssl.enabled: false
  190. redisson:
  191. config: |
  192. singleServerConfig:
  193. address: "redis://localhost:6379"
  194. database: 0
  195. password: ${REDIS_PASSWORD}
  196. connectTimeout: 10000
  197. timeout: 3000
  198. retryAttempts: 3
  199. retryInterval: 1500
  200. connectionPoolSize: 64
  201. connectionMinimumIdleSize: 10
  202. threads: 16
  203. nettyThreads: 32
  204. hotel:
  205. qr:
  206. base-url: http://localhost
  207. path: "/#/pages/hotel/scan-bind"
  208. pay:
  209. mock-enabled: true
  210. EOF
  211. # 构建
  212. mvn clean package -DskipTests -Pprod
  213. echo " ✓ 后端构建完成"
  214. # ========================
  215. # 9. 构建前端
  216. # ========================
  217. echo "[9/10] 构建前端(约 2-3 分钟)..."
  218. cd ${PROJECT_DIR}/forge-admin-ui
  219. pnpm install
  220. pnpm build
  221. echo " ✓ 前端构建完成"
  222. # ========================
  223. # 部署文件
  224. # ========================
  225. echo ""
  226. echo "=========================================="
  227. echo " 部署文件到 ${DEPLOY_DIR}"
  228. echo "=========================================="
  229. sudo mkdir -p ${DEPLOY_DIR}
  230. # 复制后端 jar
  231. sudo cp ${PROJECT_DIR}/forge-server/forge-admin-server/target/forge-admin-server.jar ${DEPLOY_DIR}/
  232. sudo cp ${PROJECT_DIR}/forge-server/forge-flow/forge-flow-server/target/forge-flow-server.jar ${DEPLOY_DIR}/
  233. # 复制前端
  234. sudo mkdir -p ${DEPLOY_DIR}/frontend
  235. sudo cp -r ${PROJECT_DIR}/forge-admin-ui/dist/* ${DEPLOY_DIR}/frontend/
  236. # 配置 Nginx
  237. sudo cat > /etc/nginx/conf.d/forge.conf << 'NGINXEOF'
  238. server {
  239. listen 80;
  240. server_name _;
  241. # 前端静态文件
  242. location /forge {
  243. alias /opt/forge/frontend;
  244. try_files $uri $uri/ /forge/index.html;
  245. }
  246. # 根路径重定向到 /forge
  247. location = / {
  248. return 302 /forge;
  249. }
  250. # 后端 API 代理
  251. location /api {
  252. proxy_pass http://localhost:8580;
  253. proxy_set_header Host $host;
  254. proxy_set_header X-Real-IP $remote_addr;
  255. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  256. proxy_set_header X-Forwarded-Proto $scheme;
  257. }
  258. # 流程服务 API 代理
  259. location /flow {
  260. proxy_pass http://localhost:8081;
  261. proxy_set_header Host $host;
  262. proxy_set_header X-Real-IP $remote_addr;
  263. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  264. }
  265. }
  266. NGINXEOF
  267. sudo nginx -t
  268. sudo systemctl reload nginx
  269. echo " ✓ Nginx 配置完成"
  270. # 创建启动脚本
  271. sudo cat > ${DEPLOY_DIR}/start.sh << STARTEOF
  272. #!/bin/bash
  273. echo "启动 Forge Admin 服务..."
  274. # 启动 forge-admin(16GB 内存给 1GB)
  275. nohup java -Xms512m -Xmx1024m \
  276. -Dspring.profiles.active=prod \
  277. -jar ${DEPLOY_DIR}/forge-admin-server.jar > /var/log/forge-admin.log 2>&1 &
  278. echo " forge-admin 启动中... PID: \$!"
  279. # 启动 forge-flow
  280. nohup java -Xms256m -Xmx512m \
  281. -Dspring.profiles.active=prod \
  282. -jar ${DEPLOY_DIR}/forge-flow-server.jar > /var/log/forge-flow.log 2>&1 &
  283. echo " forge-flow 启动中... PID: \$!"
  284. echo ""
  285. echo "等待服务启动..."
  286. sleep 15
  287. echo "查看日志: tail -f /var/log/forge-admin.log"
  288. echo "访问地址: http://localhost/forge"
  289. STARTEOF
  290. sudo chmod +x ${DEPLOY_DIR}/start.sh
  291. # 创建停止脚本
  292. sudo cat > ${DEPLOY_DIR}/stop.sh << 'STOPEOF'
  293. #!/bin/bash
  294. echo "停止 Forge Admin 服务..."
  295. pkill -f forge-admin-server.jar && echo " forge-admin 已停止" || echo " forge-admin 未运行"
  296. pkill -f forge-flow-server.jar && echo " forge-flow 已停止" || echo " forge-flow 未运行"
  297. STOPEOF
  298. sudo chmod +x ${DEPLOY_DIR}/stop.sh
  299. # 创建重启脚本
  300. sudo cat > ${DEPLOY_DIR}/restart.sh << 'RESTARTEOF'
  301. #!/bin/bash
  302. bash /opt/forge/stop.sh
  303. sleep 3
  304. bash /opt/forge/start.sh
  305. RESTARTEOF
  306. sudo chmod +x ${DEPLOY_DIR}/restart.sh
  307. echo ""
  308. echo "=========================================="
  309. echo " ✅ 部署完成!"
  310. echo "=========================================="
  311. echo ""
  312. echo " 启动服务: sudo ${DEPLOY_DIR}/start.sh"
  313. echo " 停止服务: sudo ${DEPLOY_DIR}/stop.sh"
  314. echo " 重启服务: sudo ${DEPLOY_DIR}/restart.sh"
  315. echo ""
  316. echo " 查看日志:"
  317. echo " tail -f /var/log/forge-admin.log"
  318. echo " tail -f /var/log/forge-flow.log"
  319. echo ""
  320. echo " 访问地址: http://localhost/forge"
  321. echo " 账号: admin"
  322. echo " 密码: 123456"
  323. echo ""
  324. echo "=========================================="