openEuler + 毕昇 JDK + Tengine:RuoYi Office 国产化部署实战
🌐文档地址:https://ruoyioffice.com
👇 文章底部获取源码和演示地址 👇
💬 :17156169080(获取产品咨询)
一套企业管理平台迁入国产软件环境,员工仍然需要打开工作台、填写申请、处理待办。本文以 RuoYi Office 的 openEuler 实验环境为线索,把操作系统、Java 运行环境、Web 接入和国产数据库串成一条能验收的部署链路。
▲ 等距部署空间表达的是软件承载关系:openEuler 提供运行环境,Tengine 接入浏览器请求,毕昇 JDK 运行应用,达梦保存业务与流程数据。
引言:部署完成,为什么员工还打不开审批单?
企业采购提出国产化要求时,实施工作很容易被拆成几张互不关联的清单:操作系统装好了,JDK 安
装成功,数据库容器也启动了。每一项都有绿色状态,交付人员却仍可能面对一个白屏的管理端。
原因在于,用户访问的是完整产品链路。浏览器需要取得正确的 JavaScript 文件,请求要到达后端
,后端必须连接正确的 schema,登录后的菜单和权限还要匹配业务页面。
其中任何一段失配,都不能靠另一层“服务已启动”来证明交付完成。
| 局部成功 | 尚未回答的问题 | 用户看到的结果 |
|---|---|---|
| Java 命令可执行 | 版本与应用依赖是否匹配 | 服务可能起不来 |
| 首页返回 HTTP 200 | JavaScript 是否被当成 HTML 返回 | 页面白屏 |
| 数据库端口能连接 | schema、账号、初始化数据是否正确 | 登录或查询失败 |
| Actuator 返回 UP | 菜单、权限和流程资源是否齐全 | 工作台能开,单据打不开 |
| 管理员能登录 | 代表业务能否提交并回写状态 | 审批链路中断 |
本文采用的验收主线是:浏览器入口 → 企业工作台 → 用印申请 → 流程结果。安装动作服务于
这条主线,组件名称也能对应到具体职责。
一、先看员工在国产环境中使用什么
RuoYi Office 的 PC 管理端是 Vue3 Web 应用。员工从浏览器进入工作台,查看待办,打开 OA 业
务表单;审批人从待办详情查看申请内容和审批轨迹。
对用户来说,更换服务器操作系统和数据库不会产生另一套办公流程。菜单、表单、权限和审批模型
仍属于同一个产品。
1. 工作台是部署结果的第一个产品入口
▲ 既有开发环境工作台截图,用于展示产品入口;本图不是 openEuler 或达梦实测证据。国产环境结论见下文实验记录。
工作台能加载,至少说明浏览器资源、路由、后端认证和部分数据查询已经连通。它仍然只是第一层
产品验证,因为工作台不一定涉及流程引擎写入和业务回调。
接下来应选一张字段足够完整的业务单据,把日期、中文、关联数据和流程状态带进验收。
2. 表单比空白列表更能暴露部署问题
▲ 既有开发环境用印表单,展示印章、用章时间、文件信息和业务事由;用于说明部署后的字段检查点。
用印申请涉及基础资料、人员部门、日期时间和流程变量。页面是否能完整打开、字段是否显示正确
,比查看一张没有数据的列表更有判断价值。
这里应区分“打开表单”和“成功提交”。前者偏重查询与前端渲染,后者会触发主键生成、业务写入和
流程创建。
3. 详情与轨迹让验证走到业务结果
▲ 既有开发环境用车审批详情,展示单据与流程上下文;这是产品页面示例,历史国产库闭环结果来自 2026 年 9 月实验记录。
| 产品检查点 | 对应软件链路 | 建议观察内容 |
|---|---|---|
| 打开工作台 | Tengine → 后端 → 数据库 / Redis | 登录身份、菜单、待办 |
| 打开用印表单 | 管理端 → 业务接口 | 中文、时间、基础资料 |
| 发起流程 | 业务服务 → Flowable → 数据库 | 单号、实例关联、任务产生 |
| 查看已办详情 | 业务表与流程历史查询 | 审批结果、轨迹、回写状态 |
这些页面共同构成部署验收,不应只用首页截图代替。
二、openEuler 上的四层软件职责
实验室采用 VMware x86_64 虚拟机,实际安装 openEuler 24.03 LTS SP2。它提供的是可复建的软
件环境,不能延伸为某款国产 CPU 已完成适配的结论。
1. openEuler 承载应用运行条件
操作系统需要提供稳定的目录、权限、服务管理、网络和运行库。对 Java 应用而言,“Linux 都一
样”不能替代环境核对:数据库介质、JDK 架构和系统库都必须匹配。
实验目录把应用、静态文件、日志和数据库数据分开。这样更新应用包时,不会把数据库数据目录当
成待替换的程序文件。
| 资产 | 实验室路径或位置 | 生命周期 |
|---|---|---|
| 后端 JAR | /data/ruoyi-office/app/ | 随应用版本更新 |
| 前端静态资源 | /data/ruoyi-office/web/current/ | 与后端版本配套 |
| 环境参数 | /etc/ruoyi-office/*.env | 随目标环境管理 |
| 应用日志 | /data/ruoyi-office/logs/ | 按保留策略归档 |
| 数据库数据目录 | 独立数据库目录 | 随数据备份与恢复 |
2. 毕昇 JDK 负责运行应用
实验室验证的是 BiSheng JDK 17.0.19。应用由 Java 17 构建和运行,切换 JDK 发行版时还需要核
对堆配置、编码、证书以及第三方本地依赖。
已有安装脚本优先尝试系统软件包;包不可用时,从指定镜像源下载对应架构压缩包,并校验 SHA-2
56。下载成功与校验成功是两个动作,后者用于保证介质来源与内容一致。
也不能只看到/usr/bin/java存在就断言正在使用毕昇。原脚本在已有 Java 时会跳过安装,因
此现场应实际执行java -version,核对发行版和版本号。
3. Tengine 提供浏览器接入
Tengine 3.1.0 服务前端静态文件,并将/admin-api/请求反向代理到后端。前端页面与业务 AP
I 共用访问入口,员工无需知道后端监听端口。
JavaScript、CSS 和图片应命中静态资源位置;业务请求应命中 API 代理。两者都返回 200,也不
意味着内容正确。
一个常见错误是:不存在的 JavaScript 路径被 SPA 回退规则返回index.html。浏览器随后把 H
TML 当作脚本解析,表现为白屏或 MIME 类型错误。
因此验收应查看请求的内容类型,静态资源应返回对应类型,不能只统计响应码。
4. 达梦保存业务与流程数据
DM8 实验环境使用独立数据库运行时,业务 schema 为RUOYI_OFFICE。应用通过专用 JDBC 驱动
连接,数据库端口绑定本机回环地址。
Redis 保留为会话与缓存兼容基线。使用 openEuler、毕昇、Tengine 和达梦,不会自动把 Redis、
Spring Boot 内嵌容器或其他依赖变成国产替代产品。
| 层级 | 本次已验证组件 | 需要另行验证的替代方案 |
|---|---|---|
| 操作系统 | openEuler | 银河麒麟、统信 UOS 指定版本 |
| Java | 毕昇 JDK 17 | 其他指定 JDK 17 发行版 |
| Web 接入 | Tengine | TongWeb / BES 等目标形态 |
| 数据库 | 达梦 DM8、openGauss | 人大金仓等目标实库 |
| 缓存 | Redis 7.2.11 | 国产 Redis 协议兼容缓存 |
尤其要区分反向代理与 Java 应用服务器。把 Tengine 换成或增加某个接入组件,并不等于已经完
成 TongWeb / BES 的 WAR 部署。
三、把软件安装收束成可复用部署资产
1. 固定资产关系,减少“这台机器能跑”的偶然性
▲ 部署资产的逻辑关系图,不是平台新增数据库表:同一套应用包读取环境参数,连接目标数据库,并通过接入配置服务用户。
真正需要维护的不是一串安装命令,而是应用包、环境参数、数据库初始化包和服务单元之间的配套
关系。
同一后端包可以包含多个数据库驱动;最终连接哪个数据库,由启用的 Profile、JDBC URL、账号及
schema 共同决定。
| 决策点 | 当前方案 | 取舍 |
|---|---|---|
| 部署形态 | Spring Boot 单体 | 先降低组件组合与联调成本 |
| 应用与参数 | JAR 与环境文件分离 | 同包部署,参数随环境变化 |
| 服务管理 | systemd 实例单元 | 固定用户、工作目录和启动命令 |
| 数据库端口 | 回环监听 | 单机环境由应用间接提供访问 |
| 数据库建表 | 交付 SQL 初始化 | 避免引擎启动时隐式变更结构 |
2. 用 systemd 固定应用启动方式
下面是现有服务单元摘录。它把数据库环境名称同时映射到环境文件和 Spring Profile,减少“文件
改了,启动参数仍是旧库”的失配。
[Unit] Description=RuoYi Office (%i database) After=network-online.target tengine.service opengauss.service redis.service Wants=network-online.target [Service] Type=simple User=roadmin Group=roadmin WorkingDirectory=/data/ruoyi-office/app EnvironmentFile=/etc/ruoyi-office/%i.env ExecStart=/usr/bin/java -Xms${JAVA_XMS} -Xmx${JAVA_XMX} -Dfile.encoding=UTF-8 -jar /data/ruoyi-office/app/yudao-server.jar --spring.profiles.active=prod,xinchuang-%i SuccessExitStatus=143 Restart=on-failure RestartSec=10 LimitNOFILE=65535%i表示实例名称。例如启动ruoyi-office@dm8时,会读取dm8.env,并激活prod,xinchuang-dm8。
服务单元的After主要约束启动顺序,不能证明数据库已经接受连接。实际部署还要检查数据库
运行状态与应用健康。
Restart=on-failure适合处理异常退出,但它不会修复错误密码、缺表或错误 schema。遇到重复
启动失败,应定位首个异常,不应靠连续重启掩盖配置错误。
3. 把接入规则限定到真实请求类型
下面摘取现有 Tengine 配置中页面回退和 API 代理部分。静态资源还有独立前缀处理,部署时要与
前端构建产物的资源路径一起核对。
sendfile on; keepalive_timeout 65; client_max_body_size 100m; location / { try_files $uri $uri/ /index.html; } location /admin-api/ { proxy_pass http://127.0.0.1:48080/admin-api/; 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; proxy_connect_timeout 10s; proxy_read_timeout 120s; }页面路由刷新需要 SPA 回退,API 请求则必须转发到后端。规则顺序、前端base、资源前缀以及
代理路径共同决定用户能否顺利进入系统。
测试时可以依次打开首页、刷新深层单据路由,再查看一条 API 响应。三种请求都正确,才说明接
入层没有只照顾首页。
4. 用 Profile 固定数据库与流程建表策略
DM8 Profile 的关键配置包括 JDBC、Quartz 和 Flowable。下面是现有配置的连续摘录,使用占位
参数传入密码,文章不提供真实环境密钥。
data:redis:host:${REDIS_HOST:127.0.0.1}port:${REDIS_PORT:6379}database:${REDIS_DATABASE:0}password:${REDIS_PASSWORD:please-change-me}quartz:job-store-type:jdbcjdbc:initialize-schema:neverflowable:database-schema-update:falsedatabase-schema:${FLOWABLE_DATABASE_SCHEMA:RUOYI_OFFICE}mybatis-plus:global-config:db-config:id-type:AUTOFlowable 的database-schema-update=false与 Quartz 的initialize-schema=never,共同
要求实施人员先交付匹配的初始化结构。
这不是“禁止升级数据库”,而是把数据库升级放到显式、可核对的交付步骤中,避免一次应用重启同
时承担部署和结构变更两种责任。
5. 按可观察顺序验证服务
▲ 先准备数据与参数,再启动服务,最后通过浏览器进入业务;后一步的成功依赖前一步,但健康检查不能替代业务验收。
建议按“数据库可连接 → 应用健康 → 接入资源正确 → 登录 → 代表业务”递进。若工作台正常但流程
提交失败,应定位业务写入或引擎层,而不是重新安装操作系统。
四、部署成功需要什么证据
2026 年 9 月实验记录包含以下结果。数字描述的是当时的软件与数据基线,不是容量指标或生产性
能承诺。
| 项目 | 实验结果 | 能证明什么 |
|---|---|---|
| openEuler / 毕昇 / Tengine | 安装与基础运行通过 | 软件运行环境可用 |
| 达梦数据库 | 782 张表、72 个用户记录 | 该基线已导入 |
| 达梦应用 | 健康检查 UP | 应用完成启动 |
| 登录 | 成功取得认证结果 | 认证链路可用 |
| 用印审批 | 流程 completed,业务状态为 2 | 指定代表流程闭环通过 |
openGauss 在同一软件环境完成启动、登录、流程发布和用印填报。其本轮最终证据没有覆盖完整审
批,不应因为共用了相同操作系统就自动提升验证等级。
1. 应用包、数据包与参数必须一起归档
现场交付应记录应用版本、前端产物、数据库初始化来源、JDK 与数据库版本。只保存 JAR,很难解
释后续为什么同一个包在另一台机器表现不同。
数据库从 8 月基线初始化,而应用已包含 9 月新增字段时,还需要目标库版本的配套增量。登录成
功只能证明登录使用的表结构齐全,不能证明其他模块也齐全。
2. 快照方便复建,备份承担恢复
VMware 快照适合在实验阶段保留安装节点,但数据库恢复仍需数据库备份与恢复演练。生产运行不
能把宿主机快照视为唯一备份。
应用文件、数据库和上传目录需要不同的保留策略。恢复数据库但没有附件文件,会产生“单据正常
、附件失效”的不一致。
3. 最小验证和扩展验证分开安排
| 验证层级 | 典型内容 | 后续动作 |
|---|---|---|
| 最小产品链路 | 登录、表单、代表审批 | 判断部署是否具备业务可用性 |
| 模块回归 | 合同、财务、HRM、ERP | 按客户启用范围展开 |
| 集成回归 | 文件、邮件、支付、外部模型 | 核对外部服务与网络条件 |
| 运行保障 | 备份恢复、监控、容量 | 形成生产运行要求 |
一次用印流程的通过非常有价值,但它的价值是证明一条具体链路,不是替代所有模块测试。
五、如何把实验方案带到客户现场
客户现场先确认采购的操作系统、CPU 架构、数据库及版本,再选择匹配介质。实验室是 x86_64,A
RM 和 LoongArch 需要对应 JDK、数据库与本地组件介质。
接着核对客户启用的业务模块,选择一条代表流程。对有公文、附件预览或在线编辑需求的客户,补
上相应文件与办公组件验收。
最终交付应让实施人员能够回答四个问题:入口在哪里,应用连接哪个库,初始化包来自哪里,恢复
时要恢复哪些数据。
建议现场按以下顺序操作:
- 核对服务器架构与软件版本。
- 固定应用、日志、上传与数据库目录。
- 安装运行环境并核对实际 Java 版本。
- 导入目标库初始化包及配套增量。
- 配置环境文件与服务单元。
- 启动目标数据库、应用与 Web 接入。
- 登录并打开代表表单与流程结果。
- 记录版本、观察结果及未覆盖范围。
这份顺序不是为了增加文档数量,而是让另一位实施人员能按相同输入复建环境。
从一台实验机走向客户现场:用一张访问路径卡交接
假设客户使用内网域名访问系统,应用、数据库和 Tengine 部署在同一台服务器。
交接时,实施人员应画出真实访问路径,并为每段保留一个观察点。
浏览器取得静态资源
先打开首页,确认入口 HTML 与构建资源来自同一套前端产物。
再选择一个实际 JavaScript 请求,观察内容类型和响应正文。
若响应是 HTML,问题通常仍在资源路径与接入规则;此时重建数据库没有帮助。
最后刷新一个深层业务路由,确认页面路由回退正常。
这些动作分别覆盖首页、静态资源和 SPA 路由,避免三者共用一个“访问成功”的模糊结论。
应用读取正确参数
核对 systemd 实例名、环境文件名与当前 Profile。
再确认 JDBC URL 指向目标 schema,用户名拥有所需权限。
参数文件存在并不表示实例已经重新读取它。修改参数后,应按照实际部署方式重新加载或重启,并
查看新的启动时间。
对生产环境,不把实验室关闭验证码的设置直接照搬过去。
前后端验证码、租户选择、身份系统参数应以客户批准的认证方案为准。
数据库提供配套业务资产
区分“账号可连接”与“业务 schema 已准备好”。
账号能执行简单查询,只证明一小部分数据库能力。
接着核对代表用户、字典、印章资料和激活流程定义。
最后使用获准测试单据观察完整状态,记录单号与结果。
若只有普通员工无法打开模块,应检查角色与菜单数据,不能把它直接归入数据库连接故障。
| 观察点 | 最小证据 | 常见定位方向 |
|---|---|---|
| 首页 | HTML 与构建入口 | 发布目录 |
| 脚本 | 类型正确、内容是脚本 | 资源前缀与缓存 |
| API | 真实业务响应 | 代理路径与后端 |
| 登录 | 身份、菜单、组织 | 认证与基础资料 |
| 表单 | 字段与关联正常 | 数据基线和契约 |
| 流程 | 实例、任务、回写 | 引擎与业务接口 |
把扩展组件留在它自己的链路上
例如客户需要在线编辑文件,单据审批正常并不能证明编辑器也已完成部署。
需要核对文件访问、编辑器回调与网络地址,避免把内网地址传给无法访问内网的组件。
客户需要地图或外部身份系统时,也应取得对应参数和访问权限。
这类检查依附具体需求,不应让未启用组件成为基础部署的无意义阻断项。
做一次能解释的恢复演练
在获准测试环境,从一份明确备份恢复数据库,并使用配套应用和文件目录进入产品。
记录恢复后的代表单号、附件访问与新增结果。
如果业务单恢复了,附件却打不开,首先核对文件资产有没有包含在恢复范围。
如果历史记录可查,但新增失败,首先核对目标版本的主键与序列。
不要把恢复演练变成“所有页面点一遍”。选取能覆盖身份、历史、关联与新写入的代表路径,信息量
更高。
交接卡应该怎样写
一张实用交接卡至少包含环境组合、应用包身份、数据基线、访问入口、参数位置与恢复资产。
其中密码引用客户的凭据管理位置,不在卡片正文填写真实密钥。
再附上已执行的代表用例及剩余验证项,接手人员就能沿着同一条访问路径复核。
| 交接问题 | 应能直接找到的答案 |
|---|---|
| 当前运行哪个版本 | 应用与前端产物身份 |
| 当前连接哪里 | 非敏感 JDBC 信息与 schema |
| 参数在哪里 | 环境文件与服务实例 |
| 数据从哪里来 | 初始化资产及增量范围 |
| 出错先看哪里 | 当前实例日志与请求路径 |
| 恢复要带什么 | 数据库、文件、参数和应用 |
部署方案写到这里,才从“安装教程”变成可接手的运行方案。
六、快速体验
在线演示:https://ruoyioffice.com/web/
演示账号:admin / admin123。在线环境用于体验产品,不代表当前连接国产数据库。
在“工作台”查看待办,在“OA → 用印管理”打开申请详情,再到流程中心查看已有审批轨迹。先观察
已有单据,可避免为了看页面反复制造测试数据。
本地前端启动命令:
cd ruoyi-office-vben pnpm dev:antd后端采用 Java 17、单体启动方式。使用国产库前,应完成对应初始化数据和环境参数配置,不能仅
在启动命令上追加 Profile。
常见问题(FAQ)
openEuler 上部署 RuoYi Office,必须采用微服务吗?
不需要。实验室验证采用 Spring Boot 单体。微服务涉及网关、注册配置中心等额外组件,应按实
际规模和交付要求选择。
安装了毕昇 JDK,就能确定应用使用了它吗?
还需核对实际java -version与 systemd 启动使用的 Java 路径。机器存在另一套 Java 时,安
装脚本和替代链接可能使运行版本与预期不同。
Tengine 页面返回 200,可以作为部署通过标准吗?
只能说明该请求有响应。还要核对静态资源类型、API 代理、登录和代表业务,避免 HTML 回退掩盖
错误资源路径。
这套实验说明已经完成全部国产化认证吗?
它提供指定版本的软件工程验证。采购要求中的厂商互认证、国产整机和正式测评,需要对应版本及
厂商流程另行确认。
结语:让每一层软件都能对应到产品结果
openEuler、毕昇 JDK、Tengine 和国产数据库的组合,最终应落到用户可见的工作台、业务表单和
审批结果。
RuoYi Office 的部署资产把应用包、参数与目标数据库分开管理,使国产化方案能够持续复建和验
证。真正有用的交付,不止告诉客户装了哪些软件,也能解释每一层怎样支撑企业办公。
你在国产化项目中最常遇到的是静态资源、数据库初始化,还是流程与业务状态回写问题?这些问题
值得分别建立验收用例。
系列阅读
- SpringBoot3 + 达梦 DM8:RuoYi Office 用印申请与多级审批实战
- SpringBoot3 + openGauss:RuoYi Office 登录、流程发布与用印填报适配实战
- 达梦 DM8 + openGauss:RuoYi Office 的 MySQL 数据转换与导入实践
- 达梦 DM8、openGauss、人大金仓怎么选?RuoYi Office 国产数据库适配与验收指南
- openEuler + 达梦 DM8 + openGauss:RuoYi Office 多库部署与运行维护实践
如果这篇对你有用,点个「在看」或收藏。
🌐演示地址:https://ruoyioffice.com/web
📦GitHub 源码:https://github.com/yuqing2026/ruoyi-office
📦Gitee 源码:https://gitee.com/yqzy1688/ruoyi-office
💬微信:17156169080(获取产品咨询)
打开演示地址直接查看系统。