跳到主要内容

麒麟系统与达梦 8 部署

本文以银河麒麟高级服务器操作系统 V10 的单机部署为例。数据库使用达梦 8(DM8),后端运行交付的 Java 8 可执行 JAR,Nginx 提供前端页面并转发接口。数据库、Redis 和后端也可以分机部署,此时将示例中的 127.0.0.1 改为受信网络中的实际地址。

部署前准备

确认交付包中有同一版本、适配 DM8 的以下文件:

文件用途
init-dm.sql在空 schema 中创建表、索引、外键、函数并导入基础数据
surveyking-server.jar已包含达梦 JDBC 驱动的后端程序
survey-3.2-xxxx.zip前端交付包,解压后包含 dist/public/index.htmldist/admin/index.html
License 和版本配置说明按实际交付要求配置

交付的 init-dm.sql 是可单独导入的 SQL 文件。SK_JSON_NUMBER 函数已包含在文件中,全新安装无需另行导入函数脚本。下文命令中的 xxxx 应替换为实际交付包文件名中的版本标识。

演示环境建议至少准备 4 核 CPU、8 GB 内存;生产容量应按数据库、Java 堆、Redis、业务数据、附件、日志和备份量分别规划。确认操作系统与 DM8、JDK 的 CPU 架构一致,并使用正式环境有效的达梦授权。对外通常只开放 Nginx 的 80/443 端口,5236、6379 和 48080 仅允许本机或受信网络访问。

1. 安装基础软件和达梦实例

银河麒麟服务器版 V10 可通过已配置的软件源安装 Nginx、Redis 和 Java 8。包名可能随软件源变化,下面以提供这些包的 dnf 软件源为例:

sudo dnf install -y java-1.8.0-openjdk-headless redis nginx unzip
java -version
redis-server --version
nginx -v
sudo systemctl enable --now redis nginx

java -version 应显示 Java 8。若单位使用离线源或指定的国产 JDK/中间件,请安装其适配 Java 8 的交付版本,并确认 java 命令实际指向该版本。

达梦官方 Linux 安装说明安装 DM8,并由数据库管理员初始化新的数据库实例。本项目的空库脚本要求如下参数,尤其应在建库时确定页大小、字符集和大小写规则:

参数示例值
PAGE_SIZE32(KB)
EXTENT_SIZE16
CHARSET / UNICODE_FLAG1(UTF-8)
CASE_SENSITIVE0(大小写不敏感)
BLANK_PAD_MODE0
PORT_NUM5236

例如,安装目录为 /opt/dmdbms、数据目录为 /data/dm8 时,数据库管理员可使用 dminit 初始化。将尖括号内的密码换成符合单位要求的强密码,并按实际环境调整路径与容量:

sudo install -d -o dmdba -m 0750 /data/dm8
sudo -u dmdba /opt/dmdbms/bin/dminit PATH=/data/dm8 DB_NAME=SURVEYKING \
INSTANCE_NAME=SURVEYKING PORT_NUM=5236 PAGE_SIZE=32 EXTENT_SIZE=16 \
CHARSET=1 CASE_SENSITIVE=0 BLANK_PAD_MODE=0 BUFFER=1024 \
SYSDBA_PWD='<管理用户强密码>' SYSAUDITOR_PWD='<审计用户强密码>'

由管理员按安装程序给出的实际 dm.ini 路径注册并启动实例服务;上述 DB_NAME 对应的路径通常为 /data/dm8/SURVEYKING/dm.ini,例如:

sudo /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver \
-dm_ini /data/dm8/SURVEYKING/dm.ini -p SURVEYKING
sudo systemctl enable --now DmServiceSURVEYKING

服务名以现场注册结果为准。页大小、字符集和大小写规则应在建库时确定,不能靠重启修改。

2. 创建应用用户并导入数据库脚本

DM8 中用户会自动拥有同名的默认 schema。本项目使用 SURVEYKING 用户及 schema,不需要像 MySQL 那样执行 CREATE DATABASE surveyinit-dm.sql 中写有 SET SCHEMA SURVEYKING,因此建库后按以下顺序执行,只对空库运行一次

  1. 将交付的独立文件 init-dm.sql 上传到数据库服务器,让运行 disql 的账号可读取。假设文件已经上传到当前目录:

    sudo install -d -o dmdba -m 0700 /home/dmdba/surveyking-init
    sudo install -o dmdba -m 0600 init-dm.sql \
    /home/dmdba/surveyking-init/
  2. 设置 UTF-8 终端环境,以 SYSDBA 登录 disql。创建应用账号并设置兼容参数;把示例中的密码改为生产强密码。

export LANG=en_US.UTF-8
/opt/dmdbms/bin/disql /nolog

disql 中输入 LOGIN,按提示填写 SYSDBA、密码和 127.0.0.1:5236,然后执行:

WHENEVER SQLERROR EXIT SQL.SQLCODE;
SP_SET_PARA_VALUE(2, 'COMPATIBLE_MODE', 4);
SP_SET_PARA_VALUE(2, 'JSON_MODE', 2);
CREATE USER SURVEYKING IDENTIFIED BY "<应用用户强密码>";
GRANT RESOURCE TO SURVEYKING;
EXIT;

上述语句设置 COMPATIBLE_MODE=4JSON_MODE=2,并创建、授权 SURVEYKING 用户。执行成功后重启达梦实例,等待数据库重新可以连接。以下服务名只是示例:

sudo systemctl restart DmServiceSURVEYKING

可用 SYSDBA 再次登录 disql,检查 V$DM_INICOMPATIBLE_MODE=4JSON_MODE=2 已生效:

SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI
WHERE PARA_NAME IN ('COMPATIBLE_MODE', 'JSON_MODE');

再次启动 disql /nolog,这次通过 LOGIN 使用 SURVEYKING 和刚设定的密码登录,然后导入表结构及基础数据。若改了用户名,须先同步修改 init-dm.sqlSET SCHEMA 和后端数据库配置:

@/home/dmdba/surveyking-init/init-dm.sql

脚本使用 WHENEVER SQLERROR EXIT SQL.SQLCODE,任何 SQL 错误都应停下排查,不能忽略错误后继续启动应用。请保留导入日志,并在导入结束后使用 SURVEYKING 账号检查:

SELECT COUNT(*) AS TABLE_COUNT FROM USER_TABLES;
SELECT COUNT(*) AS FK_COUNT FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'R';
SELECT COUNT(*) AS MENU_COUNT FROM "system_menu";
SELECT COUNT(*) AS USER_COUNT FROM "system_users";
SELECT COUNT(*) AS FUNCTION_COUNT FROM USER_OBJECTS
WHERE OBJECT_TYPE = 'FUNCTION' AND OBJECT_NAME = 'SK_JSON_NUMBER';

确认业务表、菜单、初始用户和函数均已创建,再继续启动后端。

3. 部署后端与前端文件

以下目录与标准 Nginx 配置一致。将交付的前端压缩包解压到 /opt/surveyking/client;如果交付的是已展开的目录,复制后保证两个 index.html 路径一致。

sudo useradd --system --home-dir /opt/surveyking --shell /sbin/nologin surveyking
sudo mkdir -p /opt/surveyking/{server,client,config,files,logs}
sudo install -o surveyking -g surveyking -m 0644 \
surveyking-server.jar /opt/surveyking/server/surveyking-server.jar
sudo unzip -q survey-3.2-xxxx.zip -d /opt/surveyking/client
sudo chown -R surveyking:surveyking /opt/surveyking

test -f /opt/surveyking/client/dist/public/index.html
test -f /opt/surveyking/client/dist/admin/index.html

项目当前 DM8 后端的 prod 配置从环境变量读取数据库连接。先创建目录,再创建 /etc/surveyking/surveyking.env,按现场修改值,并确保密码不进入仓库或公开日志:

sudo install -d -m 0750 /etc/surveyking
/etc/surveyking/surveyking.env
DB_HOST=127.0.0.1
DB_PORT=5236
DB_NAME=SURVEYKING
DB_USERNAME=SURVEYKING
DB_PASSWORD="<与建库时相同的应用用户密码>"
REDIS_HOST=127.0.0.1
sudo chmod 600 /etc/surveyking/surveyking.env

若 Redis 开启了密码,再向 /etc/surveyking/surveyking.env 增加 SPRING_REDIS_PASSWORD="<实际 Redis 密码>"。无密码时不要添加该变量,后端不会配置 Redis 密码。创建 /opt/surveyking/config/application.yml,将日志写到服务可写目录:

/opt/surveyking/config/application.yml
logging:
file:
name: /opt/surveyking/logs/surveyking-server.log
sudo chown surveyking:surveyking /opt/surveyking/config/application.yml
sudo chmod 600 /opt/surveyking/config/application.yml

确认 Redis 只监听本机或受信地址,按其实际配置文件设置 bindprotected-mode 和认证;更改后重启并用 redis-cli ping 检查。后端默认使用 Redis 的 0 号库和 6379 端口;如现场不同,在外部 application.yml 中覆盖。

创建 systemd 服务,后端仍使用 JAR 自带的 Web 容器:

/etc/systemd/system/surveyking.service
[Unit]
Description=SurveyKing Pro (DM8)
After=network-online.target redis.service
Wants=network-online.target

[Service]
Type=simple
User=surveyking
Group=surveyking
WorkingDirectory=/opt/surveyking/files
EnvironmentFile=/etc/surveyking/surveyking.env
ExecStart=/usr/bin/java -Xms512m -Xmx4g -Dfile.encoding=UTF-8 -jar /opt/surveyking/server/surveyking-server.jar --spring.profiles.active=prod --spring.config.additional-location=optional:file:/opt/surveyking/config/
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/opt/surveyking/files /opt/surveyking/logs

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now surveyking
sudo systemctl status surveyking --no-pager
sudo journalctl -u surveyking -n 100 --no-pager

检查日志中没有数据库连接、Redis、License 或目录权限错误,并确认后端的 48080 端口已监听。若数据库不在本机,确保应用用户能访问远端 5236 端口。示例最大堆内存为 4 GB,请按服务器可用内存和实际并发调整 -Xmx

4. 配置 Nginx 并验证

使用标准 Nginx 站点配置,将 server_name 改为实际域名。该配置已区分 dist/publicdist/admin 两套前端入口,并将 /admin-api/captcha 原样转发至 127.0.0.1:48080。若后端分机部署,改为后端的受信地址。公网场景按单位要求配置 HTTPS 证书。

sudo nginx -t
sudo systemctl reload nginx
curl -I http://127.0.0.1/pub/index.html
curl -I http://127.0.0.1/adm/index.html
curl -I http://127.0.0.1/e/route-check
curl http://127.0.0.1/health

上述前端请求应返回 200/e/route-check 仅验证 Nginx 的 public 路由回退。

5. 系统初始化

部署完成后,登录管理后台完成系统初始化,再正式开放使用。若选择本地硬盘存储,打开 /infra/file/file-config基础设置 → 文件管理 → 文件配置),选择“本地磁盘”,将“基础路径”设为 /opt/surveyking/files;确认 surveyking 运行用户可读写该目录,并设置用户可访问的文件域名。

完成后用实际账号创建测试项目、提交答卷,并验证文件上传、预览和下载。按交付说明配置 License、对外访问域名,修改初始账号及密钥,按单位要求备份达梦数据库、附件、外部配置和 License。

使用 TongWeb 等国产中间件

本示例使用 Java 8 可执行 JAR 的内嵌 Web 容器。若项目要求改用 TongWeb 等国产应用服务器,需要使用交付方提供并验证过的对应部署包(通常是 WAR)及其配置,再按中间件说明部署;不能直接把本示例的可执行 JAR 当作 WAR 投入 TongWeb。切换后仍需保持前端调用的 /admin-api/captcha 等接口路径和数据库、Redis 配置一致,Nginx 的反向代理目标按实际监听地址调整。