麒麟系统与达梦 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.html 和 dist/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_SIZE | 32(KB) |
EXTENT_SIZE | 16 |
CHARSET / UNICODE_FLAG | 1(UTF-8) |
CASE_SENSITIVE | 0(大小写不敏感) |
BLANK_PAD_MODE | 0 |
PORT_NUM | 5236 |
例如,安装目录为 /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 survey。init-dm.sql 中写有 SET SCHEMA SURVEYKING,因此建库后按以下顺序执行,只对空库运行一次。
-
将交付的独立文件
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/ -
设置 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=4、JSON_MODE=2,并创建、授权 SURVEYKING 用户。执行成功后重启达梦实例,等待数据库重新可以连接。以下服务名只是示例:
sudo systemctl restart DmServiceSURVEYKING
可用 SYSDBA 再次登录 disql,检查 V$DM_INI 中 COMPATIBLE_MODE=4、JSON_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.sql 的 SET 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
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,将日志写到服务可写目录:
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 只监听本机或受信地址,按其实际配置文件设置 bind、protected-mode 和认证;更改后重启并用 redis-cli ping 检查。后端默认使用 Redis 的 0 号库和 6379 端口;如现场不同,在外部 application.yml 中覆盖。
创建 systemd 服务,后端仍使用 JAR 自带的 Web 容器:
[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/public 与 dist/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 的反向代理目标按实际监听地址调整。