# Forge Admin 手动部署指南 > 适用于阿里云 ECS / CentOS / Alibaba Cloud Linux 等环境,不依赖 Docker。 --- ## 一、服务器环境要求 | 项目 | 要求 | |------|------| | 操作系统 | Alibaba Cloud Linux 4 / CentOS 7+ / Ubuntu 20+ | | CPU | 2 核及以上 | | 内存 | 2GB 及以上(推荐 4GB) | | 磁盘 | 20GB 及以上 | | 开放端口 | 80(Nginx)、3306(MySQL,可选远程)、8580(后端,可选) | --- ## 二、环境组件安装 ### 2.1 JRE 17 ```bash # 解压即用,无需安装 tar -xzf OpenJDK17U-jre_x64_linux_hotspot_17.0.20.1_1.tar.gz -C /opt/forge-env/ mv /opt/forge-env/jdk-17.0.20.1+1-jre /opt/forge-env/jre-17 # 配置环境变量 cat >> /etc/profile << 'EOF' export JAVA_HOME=/opt/forge-env/jre-17 export PATH=$JAVA_HOME/bin:$PATH EOF source /etc/profile # 验证 java -version ``` ### 2.2 MySQL 8.0 ```bash # 解压 tar -xzf mysql-8.0.46-linux-glibc2.28-x86_64.tar.xz -C /opt/forge-env/ mv /opt/forge-env/mysql-8.0.46-linux-glibc2.28-x86_64 /opt/forge-env/mysql # 创建用户和数据目录 useradd -r -s /sbin/nologin mysql 2>/dev/null || true mkdir -p /opt/forge-env/mysql-data /var/run/mysqld /var/log chown -R mysql:mysql /opt/forge-env/mysql-data /var/run/mysqld touch /var/log/mysqld.log && chown mysql:mysql /var/log/mysqld.log # 写配置文件(lower_case_table_names=1 解决 Windows 导出表名大小写问题) cat > /etc/my.cnf << 'EOF' [mysqld] basedir=/opt/forge-env/mysql datadir=/opt/forge-env/mysql-data socket=/tmp/mysql.sock port=3306 user=mysql log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid lower_case_table_names=1 [client] socket=/tmp/mysql.sock EOF # 初始化(--lower-case-table-names=1 必须在初始化时指定,之后不可更改) /opt/forge-env/mysql/bin/mysqld --initialize-insecure \ --user=mysql \ --basedir=/opt/forge-env/mysql \ --datadir=/opt/forge-env/mysql-data \ --lower-case-table-names=1 # 启动 /opt/forge-env/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf & sleep 5 # 设密码 + 建库 + 远程访问 mysql -u root --socket=/tmp/mysql.sock -e " ALTER USER 'root'@'localhost' IDENTIFIED BY 'root'; CREATE DATABASE IF NOT EXISTS forge_admin DEFAULT CHARACTER SET utf8mb4; CREATE USER 'root'@'%' IDENTIFIED BY 'root'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; " # 验证 mysql -u root -proot --socket=/tmp/mysql.sock -e "SELECT 'MySQL OK';" ``` > **重要**:如果数据库是从 Windows 导出的,必须在初始化时加 `--lower-case-table-names=1`,否则 Linux 下大写表名(如 `QRTZ_TRIGGERS`)会找不到。 ### 2.3 Redis 7 ```bash # 编译安装(需要 gcc、make) tar -xzf redis-7.0.15.tar.gz cd redis-7.0.15 make && make install PREFIX=/opt/forge-env/redis # 创建配置目录 mkdir -p /opt/forge-env/redis/etc # 写配置文件(无密码) cat > /opt/forge-env/redis/etc/redis.conf << 'EOF' bind 0.0.0.0 port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile /var/log/redis.log dir /opt/forge-env/redis/data EOF mkdir -p /opt/forge-env/redis/data # 启动 /opt/forge-env/redis/bin/redis-server /opt/forge-env/redis/etc/redis.conf # 验证 /opt/forge-env/redis/bin/redis-cli ping # 应返回 PONG ``` ### 2.4 Nginx ```bash # 编译安装(需要 gcc、make、pcre-devel、zlib-devel、openssl-devel) tar -xzf nginx-1.25.4.tar.gz cd nginx-1.25.4 ./configure --prefix=/opt/forge-env/nginx --with-http_ssl_module --with-http_gzip_static_module make && make install # 写配置文件 cat > /opt/forge-env/nginx/conf/nginx.conf << 'EOF' worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; server { listen 80; server_name _; # 前端静态文件 location /forge/ { alias /opt/forge/frontend/; index index.html; try_files $uri $uri/ /forge/index.html; } # 后端 API 代理 location /forge-api/ { proxy_pass http://127.0.0.1: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_connect_timeout 60s; proxy_read_timeout 120s; } # 流程引擎 API 代理 location /forge-api/api/flow/ { proxy_pass http://127.0.0.1:8081/api/flow/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 根路径重定向到 /forge location = / { return 302 /forge; } } } EOF # 启动 /opt/forge-env/nginx/sbin/nginx # 验证配置 /opt/forge-env/nginx/sbin/nginx -t ``` --- ## 三、数据库导入 ### 3.1 从本地 Windows 导出 在 Windows 上执行(本地 MySQL 端口 3307): ```powershell mysqldump -h localhost -P 3307 -u root -proot forge_admin > D:\forge_admin.sql ``` ### 3.2 上传到服务器 ```powershell scp D:\forge_admin.sql root@<服务器IP>:/tmp/ ``` ### 3.3 在服务器上导入 ```bash mysql -u root -proot --socket=/tmp/mysql.sock forge_admin < /tmp/forge_admin.sql ``` --- ## 四、后端构建与部署 ### 4.1 Windows 本地构建 ```powershell # 后端 cd D:\java_project\forge-admin\forge-server mvn clean package -DskipTests # 前端 cd D:\java_project\forge-admin\forge-admin-ui pnpm.cmd build ``` ### 4.2 上传到服务器 ```powershell # 后端 jar 包 scp D:\java_project\forge-admin\forge-server\forge-admin-server\target\forge-admin-server.jar root@<服务器IP>:/mnt/project/forge-admin/ scp D:\java_project\forge-admin\forge-server\forge-flow\forge-flow-server\target\forge-flow-server.jar root@<服务器IP>:/mnt/project/forge-admin/ scp D:\java_project\forge-admin\forge-server\forge-app-server\target\forge-app-server.jar root@<服务器IP>:/mnt/project/forge-admin/ scp D:\java_project\forge-admin\forge-server\forge-report-server\target\forge-report-server.jar root@<服务器IP>:/mnt/project/forge-admin/ # 前端 dist(注意:内容直接放 frontend 目录,不要带 dist 子目录) scp -r D:\java_project\forge-admin\forge-admin-ui\dist\* root@<服务器IP>:/opt/forge/frontend/ ``` --- ## 五、服务启动与管理 ### 5.1 部署管理脚本 将 `forge-start.sh` 上传到服务器: ```powershell scp D:\java_project\forge-admin\forge-start.sh root@<服务器IP>:/mnt/project/forge-admin/ ``` 在服务器上赋予执行权限: ```bash chmod +x /mnt/project/forge-admin/forge-start.sh ``` ### 5.2 常用命令 ```bash cd /mnt/project/forge-admin # 查看所有服务状态 sh forge-start.sh -status # 启动所有服务 sh forge-start.sh -start # 停止所有服务 sh forge-start.sh -stop # 重启所有服务 sh forge-start.sh -restart # 单独重启某个服务 sh forge-start.sh -admin # 主后台 (8580) sh forge-start.sh -flow # 流程引擎 (8081) sh forge-start.sh -app # App 接口 (8583) sh forge-start.sh -report # 大屏报表 (8582) ``` ### 5.3 查看日志 ```bash # 实时查看主服务日志 tail -f /var/log/forge/log-forge-admin-server-$(date +%Y-%m-%d).txt # 查看流程服务日志 tail -f /var/log/forge/log-forge-flow-server-$(date +%Y-%m-%d).txt ``` --- ## 六、验证部署 ### 6.1 检查服务状态 ```bash # Java 服务 ps aux | grep forge- # 端口监听 ss -tlnp | grep -E '8580|8081|8583|8582|3306|6379|80' ``` ### 6.2 访问前端 浏览器打开:`http://<服务器IP>/forge` 默认登录账号:`admin` / `123456` ### 6.3 常见问题排查 | 问题 | 原因 | 解决 | |------|------|------| | 502 Bad Gateway | 后端服务未启动 | `sh forge-start.sh -start` | | 404 Not Found | 前端文件路径不对 | 确保文件在 `/opt/forge/frontend/` 下,不是 `/opt/forge/frontend/dist/` | | QRTZ_TRIGGERS 不存在 | MySQL 大小写敏感 | 重新初始化 MySQL 加 `--lower-case-table-names=1` | | Redis AUTH 错误 | Redis 有密码但应用没配 | 去掉 Redis 密码或配置密码 | | 数据库连接失败 | MySQL 端口不对 | dev 配置是 3307,服务器是 3306,已通过 JVM 参数覆盖 | | hotel.alipay.app-id 缺失 | 缺少酒店模块配置 | 已通过 JVM 参数补充 | --- ## 七、目录结构总览 ``` /opt/forge-env/ # 环境组件 ├── jre-17/ # JRE 17 ├── mysql/ # MySQL 8.0 ├── mysql-data/ # MySQL 数据目录 ├── redis/ # Redis 7 └── nginx/ # Nginx /opt/forge/ ├── frontend/ # 前端静态文件(dist 内容直接放这里) │ ├── index.html │ ├── assets/ │ └── ... /mnt/project/forge-admin/ # 后端 jar 包 + 管理脚本 ├── forge-admin-server.jar ├── forge-flow-server.jar ├── forge-app-server.jar ├── forge-report-server.jar └── forge-start.sh /var/log/forge/ # 应用日志 ├── log-forge-admin-server-2026-09-11.txt ├── log-forge-flow-server-2026-09-11.txt └── ... ``` --- ## 八、配置项说明 脚本 `forge-start.sh` 中的 JVM 参数覆盖了以下配置: | 参数 | 值 | 说明 | |------|-----|------| | `spring.profiles.active` | prod | 生产环境 profile | | `spring.flyway.enabled` | false | 关闭 Flyway 自动迁移 | | `spring.datasource...url` | localhost:3306 | MySQL 端口(dev 是 3307) | | `spring.datasource...username` | root | 数据库用户 | | `spring.datasource...password` | root | 数据库密码 | | `spring.data.redis.host` | localhost | Redis 地址 | | `spring.data.redis.port` | 6379 | Redis 端口 | | `spring.data.redis.password` | (无) | Redis 无密码 | | `forge.flow.client.url` | http://127.0.0.1:8081 | 流程引擎地址 | | `hotel.alipay.*` | 沙箱配置 | 支付宝沙箱环境 | | `hotel.qr.base-url` | http://101.133.130.202 | 二维码基础 URL(改为实际服务器 IP) | | `hotel.pay.mock-enabled` | true | Mock 支付(生产环境改为 false) | > **上线前检查**:将 `hotel.pay.mock-enabled` 改为 `false`,将 `hotel.alipay.*` 改为正式环境配置,将 `hotel.qr.base-url` 改为实际域名。