本次安装由codex半自动化安装。
1. 环境信息
虚拟化平台:PVE 9.1
虚拟机 IP:10.139.27.9
SSH 用户:bg4vrg
SSH 端口:22
操作系统:openEuler 24.03 (LTS-SP3)
目标组件:
JDK 17
Tomcat 11
PostgreSQL 18.1
itacc-admin-1.60.0.war
itacc_full.dump
2. 实际安装结论 本次环境已经成功安装并可用,最终状态如下:
JDK 17 已安装并可用
Tomcat 11 已安装并通过 systemd 管理
PostgreSQL 18.1 已源码编译安装并通过 systemd 管理
itacc 数据库已成功恢复
itacc-admin-1.60.0.war 已成功部署
前端页面可打开
登录后菜单可正常点击和打开
3. 与原始方案相比的关键修正 3.1 JDK 17 直接使用 openEuler 仓库安装:
1 sudo dnf install -y java-17-openjdk java-17-openjdk-devel
3.2 Tomcat 11 openEuler 仓库只有 tomcat 9,不满足要求,因此改为使用 Apache 官方二进制包安装。
3.3 PostgreSQL 18.1 openEuler 仓库主版本不是 18.1,因此改为 PostgreSQL 官方源码编译安装。
3.4 PostgreSQL 18.1 额外依赖 实际编译时发现需要额外安装:
1 sudo dnf install -y libicu-devel
否则 configure 会报 ICU 依赖缺失。
3.5 平台数据库配置 应用包里默认数据库地址是:
必须覆盖为本机数据库,否则应用启动时 Flyway 会连接超时。
3.6 平台部署路径 该 war 包前端资源引用使用根路径 /assets/...,因此必须部署到站点根路径,也就是:
不能继续挂在 /itacc-admin/ 下,否则首页虽然能打开,但静态资源路径会错。
3.7 空权限数组问题 登录接口实际返回:
前端会把空权限数组直接作为有效权限,导致登录后左侧菜单子项全部被过滤。实际处理方式是补丁修正为:
如果权限数组有值,按接口返回使用
如果权限数组为空且用户名是 admin,则按管理员全权限处理
4. 最终目录规划 4.1 程序目录 1 2 3 /opt/tomcat11 /usr/local/pg18 /usr/local/pg18/data
4.2 临时上传文件 1 2 /tmp/itacc_full.dump /tmp/itacc-admin-1.60.0.war
5. 基础依赖安装 执行:
1 2 3 4 5 6 7 8 sudo dnf install -y \ wget curl tar vim-enhanced lsof which \ gcc gcc-c++ make \ readline-devel zlib-devel openssl-devel \ libxml2-devel libxslt-devel \ bison flex perl-devel python3-devel systemd-devel \ libicu-devel \ java-17-openjdk java-17-openjdk-devel
6. JDK 17 安装与验证 6.1 安装 1 sudo dnf install -y java-17-openjdk java-17-openjdk-devel
6.2 验证 1 2 3 4 java -version javac -version readlink -f /usr/bin/javareadlink -f /usr/bin/javac
本次实际结果:
openjdk version "17.0.18"
7. Tomcat 11 安装 7.1 创建运行用户 1 sudo useradd -r -m -U -d /opt/tomcat11 -s /sbin/nologin tomcat
7.2 下载并安装 Tomcat 11 以 11.0.18 为例:
1 2 3 4 5 6 7 8 9 cd /tmpcurl -fL https://downloads.apache.org/tomcat/tomcat-11/v11.0.18/bin/apache-tomcat-11.0.18.tar.gz -o apache-tomcat-11.0.18.tar.gz || \ curl -fL https://archive.apache.org/dist/tomcat/tomcat-11/v11.0.18/bin/apache-tomcat-11.0.18.tar.gz -o apache-tomcat-11.0.18.tar.gz sudo rm -rf /opt/tomcat11 sudo mkdir -p /opt/tomcat11 sudo tar -xzf apache-tomcat-11.0.18.tar.gz --strip-components=1 -C /opt/tomcat11 sudo chown -R tomcat:tomcat /opt/tomcat11 sudo chmod +x /opt/tomcat11/bin/*.sh
7.3 systemd 服务文件 文件:
1 /etc/systemd/system/tomcat11.service
内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [Unit] Description =Apache Tomcat 11 After =network.target[Service] Type =forkingUser =tomcatGroup =tomcatEnvironment =JAVA_HOME=/usr/lib/jvm/java-17 -openjdk-17.0 .18.8 -8 .oe2403sp3.x86_64 Environment =CATALINA_PID=/opt/tomcat11/temp/tomcat.pidEnvironment =CATALINA_HOME=/opt/tomcat11Environment =CATALINA_BASE=/opt/tomcat11ExecStart =/opt/tomcat11/bin/startup.shExecStop =/opt/tomcat11/bin/shutdown.shRestart =on -failureRestartSec =5 UMask =0007 [Install] WantedBy =multi-user.target
7.4 启动与放通端口 1 2 3 4 sudo systemctl daemon-reload sudo systemctl enable --now tomcat11 sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload
7.5 验证 1 2 3 sudo systemctl status tomcat11 --no-pager -l curl -I http://127.0.0.1:8080/ ss -ltnp | grep 8080
8. PostgreSQL 18.1 安装 8.1 创建 postgres 用户 1 sudo useradd -m postgres
8.2 下载源码并编译 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cd /usr/local/srcsudo curl -fL https://ftp.postgresql.org/pub/source/v18.1/postgresql-18.1.tar.gz -o postgresql-18.1.tar.gz sudo tar -xzf postgresql-18.1.tar.gz cd postgresql-18.1sudo ./configure --prefix=/usr/local/pg18 \ --with-openssl \ --with-perl \ --with-python \ --with-libxml \ --with-libxslt \ --with-systemd sudo make -j"$(nproc) " sudo make install
8.3 初始化数据目录 1 2 sudo mkdir -p /usr/local/pg18/data sudo chown -R postgres:postgres /usr/local/pg18
检查 locale:
初始化:
1 2 sudo su - postgres /usr/local/pg18/bin/initdb -D /usr/local/pg18/data --locale=en_US.UTF-8 --encoding=UTF8
如果系统没有 en_US.UTF-8,可改用:
1 /usr/local/pg18/bin/initdb -D /usr/local/pg18/data --locale=C.utf8 --encoding=UTF8
8.4 配置 PostgreSQL 编辑:
1 /usr/local/pg18/data/postgresql.conf
设置:
1 2 listen_addresses = '*' port = 5432
编辑:
1 /usr/local/pg18/data/pg_hba.conf
追加:
1 host all all 0.0.0.0/0 scram-sha-256
8.5 PostgreSQL systemd 服务 文件:
1 /etc/systemd/system/postgresql.service
内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [Unit] Description =PostgreSQL 18.1 database serverAfter =network.target[Service] Type =forkingUser =postgresGroup =postgresEnvironment =PGDATA=/usr/local/pg18/dataPIDFile =/usr/local/pg18/data/postmaster.pidExecStart =/usr/local/pg18/bin/pg_ctl start -D /usr/local/pg18/data -s -w -t 300 ExecStop =/usr/local/pg18/bin/pg_ctl stop -D /usr/local/pg18/data -m fastExecReload =/usr/local/pg18/bin/pg_ctl reload -D /usr/local/pg18/data -sTimeoutSec =300 LimitNOFILE =65536 [Install] WantedBy =multi-user.target
8.6 启动与放通端口 1 2 3 4 sudo systemctl daemon-reload sudo systemctl enable --now postgresql sudo firewall-cmd --permanent --add-port=5432/tcp sudo firewall-cmd --reload
8.7 设置密码 1 2 sudo su - postgres /usr/local/pg18/bin/psql -d postgres
执行:
1 ALTER USER postgres WITH PASSWORD '123.asd#' ;
8.8 验证 1 2 3 sudo systemctl status postgresql --no-pager -l ss -ltnp | grep 5432 PGPASSWORD='123.asd#' /usr/local/pg18/bin/psql -h 127.0.0.1 -U postgres -d postgres -c 'select version();'
9. 导入数据库 9.1 上传 dump 将 itacc_full.dump 上传到:
9.2 创建数据库 1 PGPASSWORD='123.asd#' /usr/local/pg18/bin/createdb -h 127.0.0.1 -U postgres itacc
9.3 恢复 本次 dump 实际格式为 PostgreSQL custom format,因此使用:
1 2 3 4 5 6 7 PGPASSWORD='123.asd#' /usr/local/pg18/bin/pg_restore \ -h 127.0.0.1 \ -U postgres \ -d itacc \ --no-owner \ --no-privileges \ /tmp/itacc_full.dump
9.4 验证 1 2 PGPASSWORD='123.asd#' /usr/local/pg18/bin/psql -h 127.0.0.1 -U postgres -d itacc -Atc \ "select count(*) from information_schema.tables where table_schema='public';"
本次恢复后,公共 schema 表数量为:
10. 部署 war 包 10.1 上传 war 将:
上传到:
1 /tmp/itacc-admin-1.60.0.war
10.2 覆盖数据库环境变量 应用默认数据库配置位于 application.yml:
1 2 3 url: ${DB_URL:jdbc:postgresql://192.168.143.107:5432/itacc?...} username: ${DB_USER:postgres} password: ${DB_PASSWORD:123.asd#}
因此需要通过 Tomcat setenv.sh 覆盖。
创建:
1 /opt/tomcat11/bin/setenv.sh
内容:
1 2 3 4 #!/bin/sh export DB_URL='jdbc:postgresql://127.0.0.1:5432/itacc?currentSchema=public&useUnicode=true&characterEncoding=utf8&stringtype=unspecified&sslmode=disable' export DB_USER='postgres' export DB_PASSWORD='123.asd#'
设置权限:
1 2 sudo chown tomcat:tomcat /opt/tomcat11/bin/setenv.sh sudo chmod 750 /opt/tomcat11/bin/setenv.sh
10.3 以 ROOT.war 方式部署 必须部署到根路径:
1 2 3 4 sudo rm -rf /opt/tomcat11/webapps/ROOT /opt/tomcat11/webapps/ROOT.war sudo cp /tmp/itacc-admin-1.60.0.war /opt/tomcat11/webapps/ROOT.war sudo chown tomcat:tomcat /opt/tomcat11/webapps/ROOT.war sudo systemctl restart tomcat11
10.4 验证 1 2 3 curl -I http://127.0.0.1:8080/ curl -I http://127.0.0.1:8080/assets/index-4OEjHvD5.js sudo tail -n 80 /opt/tomcat11/logs/catalina.out
正常时:
/ 返回 HTTP/1.1 200
/assets/... 返回 HTTP/1.1 200
11. 修复 admin 登录后菜单无响应问题 11.1 问题现象
admin / 123.asd# 可登录
左侧菜单点击后看起来没有反应
11.2 根因 登录接口返回:
1 2 3 4 5 6 7 8 9 { "msg" : "登录成功" , "code" : 200 , "data" : { "nickName" : "管理员" , "permissions" : [ ] , "token" : "..." } }
前端逻辑把空权限数组当成有效权限,导致所有子菜单被过滤。
11.3 修复方式 将前端打包文件中的这段逻辑:
1 Array .isArray (l)?Yn (l):s.username .trim ()==="admin" ?Yn (["*:*:*" ]):...
改为:
1 Array .isArray (l)&&l.length >0 ?Yn (l):s.username .trim ()==="admin" ?Yn (["*:*:*" ]):...
这样空权限数组时:
普通用户仍按默认兜底权限处理
admin 自动使用 *:*:*
11.4 修复后处理 重打 ROOT.war 并重启 Tomcat
用户侧需要:
12. 最终验证结果 12.1 服务状态 1 2 sudo systemctl status tomcat11 sudo systemctl status postgresql
12.2 端口监听 1 ss -ltnp | grep -E ':8080|:5432'
12.3 HTTP 验证 1 2 curl -I http://127.0.0.1:8080/ curl -I http://127.0.0.1:8080/assets/index-4OEjHvD5.js
12.4 数据库验证 1 PGPASSWORD='123.asd#' /usr/local/pg18/bin/psql -h 127.0.0.1 -U postgres -d itacc -Atc 'select 1;'
12.5 实际可用结果
可以访问首页
可以使用 admin / 123.asd# 登录
登录后左侧菜单可以正常点击打开
13. 当前重要配置汇总 13.1 访问地址 1 http://10.139.27.9:8080/
13.2 数据库连接 1 2 3 4 5 Host: 127.0.0.1 Port: 5432 Database: itacc User: postgres Password: 123.asd#
13.3 平台登录 1 2 User: admin Password: 123.asd#
14. 建议的后续优化
删除 Tomcat 默认应用:
docs
examples
manager
host-manager
将测试环境数据库放通规则从:
1 host all all 0.0.0.0/0 scram-sha-256
改为精确网段。
将前端“admin 空权限数组兜底”修复回源代码,而不是只保留在线上包中。
为 PostgreSQL 和 Tomcat 做备份与升级记录。