部署JeecgBoot3.8.3实战经验总结)
信创环境openEuler24.03部署JeecgBoot3.8.3实战经验总结本文续前节讲述零基础零成本部署JeecgBoot3.8.3全程实战踩坑点为了让大家少踩坑将总结干货拿出来与大家分享。结论先行经过多轮测视X86架构能够兼容部署欧拉/麒麟JeecgBoot但在部署过程中前后端联调通过POST出现问题最终决定仅改动源码中的YML文件再进行调试后面测试结果会不定期更新。1. 背景与环境服务器OpenEuler 24.03后端Java 进程jeecg-system-start-3.8.3.jar运行于宿主机监听8080数据库 PostgreSQL 已启动。前端源码位于/tmp/jeecg-src/JeecgBoot-v3.8.3/jeecgboot-vue3需构建并部署到 Nginx。目标通过 Nginx 托管前端静态文件并反向代理/jeecg-boot至后端。2. 部署流程与排障记录2.1 环境准备与配置修改检查源码位置ls-la/tmp/jeecg-src/JeecgBoot-v3.8.3/存在 jeecgboot-vue3 目录修改生产环境 API 地址避免跨域cd/tmp/jeecg-src/JeecgBoot-v3.8.3/jeecgboot-vue3cp.env.production .env.production.baksed-is#^VITE_GLOB_API_URL.*#VITE_GLOB_API_URL/jeecg-boot#.env.productiongrepVITE_GLOB_API_URL .env.production输出VITE_GLOB_API_URL/jeecg-boot2.2 构建前端依赖冲突与解决执行构建npminstallnpmrun build报错npm ERR! ERESOLVE unable to resolve dependency tree peer stylelint 11.x 15 from stylelint-config-prettier9.0.5原因stylelint版本过高16.x不满足stylelint-config-prettier的 peer 依赖。解决使用--legacy-peer-deps忽略依赖冲突。npminstall--legacy-peer-depsnpmrun build结果构建成功生成dist目录及_app.config.js等文件。2.3 部署静态文件至 Nginx初始部署有交互提示cp-rdist/* /usr/share/nginx/html/# 提示“是否覆盖 index.html”问题未输入y导致index.html未被覆盖浏览器仍显示 Nginx 默认欢迎页。解决强制覆盖\cp绕过别名-f强制。\cp-rfdist/* /usr/share/nginx/html/chown-Rnginx:nginx /usr/share/nginx/html/验证文件ls-l/usr/share/nginx/html/index.html# 大小应为 5KB非默认的 3.5KB2.4 Nginx 反向代理配置检查现有配置grep-rlocation /jeecg-boot/etc/nginx/# 发现 /etc/nginx/conf.d/jeecg.conf 已含 location /jeecg-boot/配置不完整问题原jeecg.conf仅有代理部分缺少root和location /SPA 路由支持。浏览器能访问页面是因为主配置或其他conf.d文件有默认root但配置分散不利于管理。最终统一配置建议替换jeecg.conf内容server { listen 80 default_server; server_name _; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } location /jeecg-boot/ { proxy_pass http://127.0.0.1:8080/jeecg-boot/; 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; } }重载 Nginxnginx-tnginx-sreload2.5 验证前端服务命令行验证curl-I-o/dev/null-s-w%{http_code}\nhttp://127.0.0.1/# 返回 200curl-I-o/dev/null-s-w%{http_code}\nhttp://127.0.0.1/jeecg-boot/doc.html# 返回 200浏览器访问http://服务器IP/显示 JEECGBoot 登录页。3、关键问题与解决方案3.1 数据库连接失败容器内 127.0.0.1 不可达报错Connection to 127.0.0.1:5432 refused原因容器使用--net host模式下127.0.0.1仍指向容器自身或解析问题应使用localhost。解决修改配置文件中的数据库 URL将127.0.0.1替换为localhost。sed-is/127.0.0.1/localhost/gapplication-dev.yml3.2 YAML 配置文件重复键DuplicateKeyException报错org.yaml.snakeyaml.constructor.DuplicateKeyException: found duplicate key server原因配置文件中存在多个server:或jeecg:顶级键Spring Boot 加载时报错。解决使用yq安全删除重复键或手动编辑保留第一个。# 删除重复的 server: 块保留第一个yqevaldel(select(di 1).server)-iapplication-dev.yml# 需谨慎# 或用 sed 脚本删除第二个出现3.3 LiteFlow 初始化失败ClassNotFoundException / 表缺失3.3.1 错误ClassNotFoundException: sql原因配置了liteflow.rule-source: sql但未引入 SQL 解析依赖。尝试方案引入liteflow-rule-db-sql或liteflow-rule-db-postgresql但发现liteflow-rule-db-sql仅支持 MySQL/MariaDB/H2liteflow-rule-db-postgresql仅在 2.16.1 版本可用解决升级 LiteFlow 版本至 2.16.1并添加 PostgreSQL 专属依赖。dependencygroupIdcom.yomahub/groupIdartifactIdliteflow-rule-db-postgresql/artifactIdversion${liteflow.version}/version/dependency3.3.2 错误表 lf_chain 不存在或字段 node_id 不存在原因手动创建的表结构与 LiteFlow 期望的字段不一致。解决使用 LiteFlow 2.16.1 官方的 PostgreSQL DDL 建表注意字段名和类型。最终正确的 DDL部分CREATETABLElf_script(id BIGSERIALPRIMARYKEY,application_nameVARCHAR(64)NOTNULL,node_idVARCHAR(128)NOTNULL,-- 关键字段script_nameVARCHAR(128)NOTNULL,script_typeVARCHAR(32)NOTNULL,script_languageVARCHAR(32)NOTNULL,script_dataTEXTNOTNULL,versionINTDEFAULT1,content_md5VARCHAR(32),enableSMALLINTDEFAULT1,gmt_createTIMESTAMPDEFAULTNOW(),gmt_modifiedTIMESTAMPDEFAULTNOW());3.4 LiteFlow 配置方式选择最终采用 Rule-DB推荐配置生产环境liteflow:rule-db:postgresql:datasource-bean-name:master# 指定项目中主数据源名称# auto-init-table: true # 如开启需注意权限和版本不推荐使用liteflow.rule-source: liteflow-flow.xml与 DB 模式混用。不推荐使用排除自动配置SpringBootApplication(exclude {...})应正确配置。3.5 源码编译与容器部署编译命令跳过测试mvn clean package-DskipTests-Dmaven.test.skiptrue-U运行容器挂载新 jar 和外部配置dockerrun-d--namejeecg-app\--nethost\-v/path/to/new/app.jar:/app/app.jar\-v/path/to/application-dev.yml:/app/application-dev.yml\jeecg-boot:prod\java-jarapp.jar--spring.config.locationfile:/app/application-dev.yml4、常见报错汇总报错信息原因解决方案Connection refused数据库地址配置错误改为localhost或实际 IPDuplicateKeyExceptionYAML 重复键使用yq删除冗余ClassNotFoundException: sql缺少 SQL 解析依赖引入liteflow-rule-db-postgresqltable lf_chain does not exist未建表或 schema 不对执行官方 DDL或添加currentSchemapubliccolumn node_id does not exist表结构不匹配更新表结构匹配官方 2.16.1database [PostgreSQL] is unsupported使用了不支持 PostgreSQL 的模块改用liteflow-rule-db-postgresql5、经验与建议优先使用官方推荐方式对于 LiteFlow 此类框架严格遵循官方文档尤其是版本对应的配置。注意依赖版本LiteFlow 2.15.0 与 2.16.1 的 Rule-DB 模块有较大差异务必对齐。YAML 处理工具使用yq代替sed处理 YAML避免破坏结构。日志过滤使用grep -E ERROR|WARN|Exception快速定位问题。备份与回滚操作前备份数据库、配置文件、源码确保可回退。前端构建遇到 peer 依赖冲突时可使用--legacy-peer-deps快速绕过。部署务必使用\cp -rf避免交互式覆盖提示导致文件未更新。Nginx 配置将root和代理放在同一个server块并添加try_files支持 SPA 路由避免配置分散。验证始终通过curl确认后端代理连通性再使用浏览器测试。数据库新环境务必初始化表结构否则登录会因表不存在而失败。6、总结与教训验证结果curl前端后端均返回200理应正常启动并能登录系统但是一直返回用户名密码错误。失败原因因为了快速验证核心模块是否正常运行改动了pom和Quartz导致LiteFlow经常报错并且部署前期未正确执行所需的sql脚本导致提示各种表缺失或表字段类型报错。教训总结之前所有部署均拉取的是3.8.3版本仓仓中无PostgreSQL的sql建表脚本浏览仓发现最终版本是3.8.3last并且存在PostgreSQL的sql建表脚本因此周一开始全部推到重来先执行sql建表脚本再进行编译和docker镜像部署过程中仅修改yml文件。