feat: add PostgreSQL web installation wizard
Signed Release / release (push) Failing after 5m1s

This commit is contained in:
Qiufeng
2026-08-04 07:42:20 +08:00
parent b714f9851e
commit 1affcd9a5e
61 changed files with 1992 additions and 431 deletions
+21 -34
View File
@@ -10,7 +10,7 @@
- 当前有效后端位于 `oa-backend/`
- 当前有效前端位于 `ofbiz-framework/plugins/modern-ui/app/`;其上层旧 OFBiz 运行框架已经弃用。
- 前端构建产物直接写入后端 `src/main/resources/static/`,由同一个 Spring Boot JAR 提供页面与 `/api/oa/*` API。
- 已实现非 Docker 安装、PostgreSQL Flyway 迁移、Gitea Release 更新、Ed25519/SHA-256 校验、服务重启、健康检查和自动回滚。
- 已实现非 Docker 一键安装、PostgreSQL Flyway 迁移、独立网页安装向导、Gitea Release 更新、Ed25519/SHA-256 校验、服务重启、健康检查和自动回滚。
- 业务功能和外部系统接入仍需按项目需求验收;技术部署链路通过不等于可以跳过生产安全、备份和数据迁移评审。
## 两种运行模式
@@ -158,13 +158,14 @@ https://resonant-elated-launder.ngrok-free.dev/
## 非 Docker 正式安装
安装器支持 64 位 Linux `amd64/arm64` 和 macOS `arm64/amd64`。Linux 安装需要 rootmacOS 不应使用 sudo 启动 LaunchAgent。正式安装前必须已有包含下列个资产的 Gitea Release
安装器支持 64 位 Linux `amd64/arm64` 和 macOS `arm64/amd64`。Linux 安装需要 rootmacOS 不应使用 sudo 启动 LaunchAgent。正式安装前必须已有包含下列个资产的 Gitea Release
- `kaidi-erp-<version>.tar.gz`
- `kaidi-erp-installer-<version>.jar`
- `SHA256SUMS`
- `SHA256SUMS.sig`
### Linux 使用已有 PostgreSQL
### Linux 一键安装
生产环境应先为 Gitea 配置 HTTPS
@@ -175,19 +176,15 @@ curl -fsSL https://git.example.com/awaioi/ERP/raw/branch/main/install.sh \
--repository awaioi/ERP
```
安装器会从 `/dev/tty` 询问数据库地址、端口、数据库名、账号、密码和 SSL 模式,校验 PostgreSQL 版本及连接后再下载 Release
命令行只做环境准备:优先使用已有的 Java 17+,缺少时通过当前系统的 `apt-get``dnf``yum``zypper` 或 Homebrew 安装 Java、curl、tar、Python 3 和 OpenSSL 3,然后下载并启动独立安装器。数据库信息不在命令行输入
### apt 系 Linux 自动创建本机 PostgreSQL
安装器启动后会输出带一次性令牌的局域网地址,例如:
```bash
curl -fsSL https://git.example.com/awaioi/ERP/raw/branch/main/install.sh \
| sudo -E bash -s -- \
--db-mode local \
--gitea-url https://git.example.com \
--repository awaioi/ERP
```text
Setup URL: http://192.168.1.20:8091/?token=<one-time-token>
```
`--db-mode local` 当前只支持使用 apt 和 systemd 的 Linux。其他 Linux 发行版应先准备 PostgreSQL,再使用默认的 `existing` 模式
首次打开该地址进入网页向导,依次完成环境检查、PostgreSQL 地址/端口/库名/账号/密码/SSL 测试、管理员账号/姓名/密码设置、数据库迁移和初始化。项目当前没有 Redis 依赖,因此向导不会显示 Redis 配置项。正式服务真实健康检查通过后,启动器才会原子写入安装锁并物理删除 `installer/``install.pending`
### macOS
@@ -200,23 +197,6 @@ curl -fsSL https://git.example.com/awaioi/ERP/raw/branch/main/install.sh \
--repository awaioi/ERP
```
### 无人值守安装
```bash
export ERP_DB_HOST=127.0.0.1
export ERP_DB_PORT=5432
export ERP_DB_NAME=kaidi_erp
export ERP_DB_USER=kaidi_erp
export ERP_DB_PASSWORD='replace-with-a-strong-password'
export ERP_DB_SSLMODE=require
curl -fsSL https://git.example.com/awaioi/ERP/raw/branch/main/install.sh \
| sudo -E bash -s -- \
--non-interactive \
--gitea-url https://git.example.com \
--repository awaioi/ERP
```
### 当前 HTTP 测试服务器
当前 Gitea 地址 `http://38.76.196.225:10099` 只允许用于开发验收:
@@ -240,9 +220,11 @@ Linux 默认路径:
| 程序和版本目录 | `/opt/kaidi-erp` |
| 环境配置 | `/etc/kaidi-erp/erp.env` |
| 更新状态 | `/var/lib/kaidi-erp/update-state.json` |
| 安装状态 | `/var/lib/kaidi-erp/install.pending``/var/lib/kaidi-erp/install.lock` |
| 首次安装器 | `/opt/kaidi-erp/installer/`(健康后自动删除) |
| systemd 服务 | `kaidi-erp.service` |
使用 `--no-service`安装文件,不注册 systemd/launchd,同时会默认设置 `OA_UPDATE_ENABLED=false`。在线更新需要能在 Java 进程退出后自动拉起新版本的进程管理器
使用 `--no-service`用于开发验收:启动器会在当前用户下运行,但默认设置 `OA_UPDATE_ENABLED=false`生产环境应使用 systemd/launchd,让在线更新可以在 Java 进程退出后自动拉起新版本。
## 在线更新与回滚
@@ -255,7 +237,7 @@ Linux 默认路径:
对应前端路由为 `/appdev/update`,后端 API 为 `/api/oa/system-update/*`。更新过程如下:
1. 从 Gitea 读取 stable channel 的最新 Release。
2. 下载归档、`SHA256SUMS` 和 Ed25519 签名。
2. 下载归档、`SHA256SUMS` 和 Ed25519 签名(Release 里的独立安装器资产只用于首次安装)
3. 先验证签名和 SHA-256,再拒绝路径穿越、绝对路径、符号链接、硬链接和结构不完整的归档。
4. 校验 `manifest.json` 中的版本、`database=postgresql``rollbackCompatible=true`
5. 可选执行 `pg_dump`,将新版本写入独立目录。
@@ -311,7 +293,7 @@ git tag -a v0.2.0 -m 'Kaidi ERP v0.2.0'
git push origin v0.2.0
```
发布完成后必须确认 Release 页面存在个资产,并使用仓库中的 `distribution/release-public-key.pem` 验证签名。私钥与该公钥不匹配时打包脚本会直接失败。
发布完成后必须确认 Release 页面存在个资产,并使用仓库中的 `distribution/release-public-key.pem` 验证签名。私钥与该公钥不匹配时打包脚本会直接失败。
本地手工生成签名资产:
@@ -336,6 +318,7 @@ ERP_RELEASE_PRIVATE_KEY_FILE="$HOME/.config/kaidi-erp/release-signing-key.pem" \
| `OA_UPDATE_CHANNEL` | 更新通道 | `stable` |
| `OA_UPDATE_TOKEN` | 私有仓库下载令牌 | 空;公开仓库不需要 |
| `OA_UPDATE_ALLOW_INSECURE_HTTP` | 允许 HTTP 更新地址 | `false` |
| `OA_SEED_DEMO` | 是否生成演示数据 | 正式安装为 `false` |
| `ERP_UPDATE_BACKUP_MODE` | 更新前数据库备份 | `none`,可设 `pg_dump` |
| `ERP_UPDATE_HEALTH_TIMEOUT_SECONDS` | 新旧版本健康检查超时 | `120` |
| `ERP_UPDATE_HEALTH_POLL_SECONDS` | 健康轮询间隔 | `2` |
@@ -388,7 +371,11 @@ OA=http://127.0.0.1:8091 bash oa-itest.sh
### 安装器提示没有 Release
Gitea 仓库尚未发布首个可安装版本,或 Release 缺少个必需资产。先检查 `/api/v1/repos/awaioi/ERP/releases/latest` 和 Release 页面。
Gitea 仓库尚未发布首个可安装版本,或 Release 缺少个必需资产。先检查 `/api/v1/repos/awaioi/ERP/releases/latest` 和 Release 页面。
### 如何填写数据库
数据库连接信息只在首次网页向导填写。安装器会执行 `SELECT 1`、检查 PostgreSQL 15+ 并创建/验证 `pg_trgm`,错误凭据不会启动正式应用,也不会把密码写入响应或日志。数据库中已经有业务用户时,安装器会拒绝接管。
### PostgreSQL profile 启动失败
@@ -404,7 +391,7 @@ Gitea 仓库尚未发布首个可安装版本,或 Release 缺少三个必需
### 签名验证失败
不要跳过验证。确认 Release 的个资产来自同一次构建、`SHA256SUMS` 未被改写、签名私钥与 `distribution/release-public-key.pem` 匹配。
不要跳过验证。确认 Release 的个资产来自同一次构建、`SHA256SUMS` 未被改写、签名私钥与 `distribution/release-public-key.pem` 匹配。
## Git 协作