部署指南-手动部署.md 10 KB

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

# 解压即用,无需安装
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

# 解压
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

# 编译安装(需要 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

# 编译安装(需要 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):

mysqldump -h localhost -P 3307 -u root -proot forge_admin > D:\forge_admin.sql

3.2 上传到服务器

scp D:\forge_admin.sql root@<服务器IP>:/tmp/

3.3 在服务器上导入

mysql -u root -proot --socket=/tmp/mysql.sock forge_admin < /tmp/forge_admin.sql

四、后端构建与部署

4.1 Windows 本地构建

# 后端
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 上传到服务器

# 后端 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 上传到服务器:

scp D:\java_project\forge-admin\forge-start.sh root@<服务器IP>:/mnt/project/forge-admin/

在服务器上赋予执行权限:

chmod +x /mnt/project/forge-admin/forge-start.sh

5.2 常用命令

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 查看日志

# 实时查看主服务日志
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 检查服务状态

# 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 改为实际域名。