Files
ERP/docs/online-install-and-update.md
T
Qiufeng d3892320dd
Signed Release / release (push) Successful in 9m24s
feat: add managed online updates
2026-08-04 20:05:50 +08:00

6.8 KiB
Raw Blame History

在线安装与更新

Kaidi ERP 的生产安装不依赖 Docker。安装器支持 64 位 Linux 和 macOS,生产数据库固定为 PostgreSQL 15 或更高版本;生产 JAR 不包含 SQLite 运行库,SQLite 仅保留给源码目录下的本地开发和测试。

发布链路

推送 v* Git tag 后,release.yml 会完成前端构建、Spring Boot 打包、Ed25519 签名,并在 Gitea 中创建或更新对应 Release。每个可安装 Release 必须包含:

  • kaidi-erp-<version>.tar.gz
  • kaidi-erp-installer-<version>.jar
  • SHA256SUMS
  • SHA256SUMS.sig

Gitea Actions runner 需要预装 Java 17 或更高版本、Node.js/npm、Python 3、tar、curl 和 OpenSSL 3。

流水线使用 Gitea 1.27 提供的短期 GITEA_TOKEN,权限限定为代码只读、当前仓库 Release 可写,不需要创建个人访问令牌。仓库 Actions 设置只需创建:

  • Secret RELEASE_PRIVATE_KEY_B64Ed25519 私钥的单行 Base64 内容。
  • Variable ERP_RELEASE_ALLOW_INSECURE_HTTP:生产环境不要设置;当前 HTTP 测试服务器必须显式设为 1。Gitea 不允许仓库变量名以保留前缀 GITEA_GITHUB_ 开头。

本机现有签名私钥位于 ~/.config/kaidi-erp/release-signing-key.pem,不得提交到 Git。macOS 可用以下命令生成 Secret 值:

base64 < ~/.config/kaidi-erp/release-signing-key.pem | tr -d '\n'

发布稳定版本:

git tag v0.3.5
git push origin v0.3.5

首次安装

推荐给 Gitea 配置 HTTPS 域名,然后执行:

curl -fsSL https://git.example.com/awaioi/ERP/raw/branch/main/install.sh \
  | sudo -E bash -s -- \
      --gitea-url https://git.example.com \
      --repository awaioi/ERP

命令行只检查并安装 Java 17+、curl、tar、Python 3 和 OpenSSL 3,然后启动独立安装器并输出带一次性 token 的网页地址。数据库、管理员和密码全部在首次网页向导填写;安装器会真实测试 PostgreSQL 15+、数据库所有权、public schema 建表权限和 pg_trgm 所有权,迁移完成并确认正式服务健康后才写 install.lock,随后物理删除安装器目录。

安装地址优先使用 --public-url(或 ERP_PUBLIC_URL);未指定时依次尝试探测公网 IP、回退局域网 IP,并始终额外输出 Local URL。公网服务器建议显式传入例如 --public-url http://38.76.196.225:8091。参数支持 HTTPS 域名、端口、路径和已有查询参数,安装器会安全追加 token,不会用局域网 IP 覆盖显式公网地址。

目标 PostgreSQL 必须是专用空数据库,网页中填写的账号必须是该数据库的所有者。只拥有连接权限的账号会在网页连接测试阶段被拒绝,不再等到 Flyway 迁移后才显示笼统错误。

Linux 生产服务要求主机使用 systemd;没有 systemd 的容器、WSL 或精简系统只能显式使用 --no-service 做开发验收,在线更新也会保持关闭。

当前 http://38.76.196.225:10099 仅用于开发测试,安装器必须同时传入 --allow-insecure。在没有 HTTPS 的情况下,必须从固定 tag 下载引导脚本并验证本版本记录的 SHA-256,禁止把可变的 main 分支脚本直接管道给 root。HTTP 仍会暴露请求、Release 元数据和 Gitea token,不应作为生产部署方式。

当前 v0.3.5 安装命令:

(
  set -e
  tmp="$(mktemp)"
  trap 'rm -f -- "$tmp"' EXIT
  curl -fsSL http://38.76.196.225:10099/awaioi/ERP/raw/tag/v0.3.5/install.sh -o "$tmp"
  printf '%s  %s\n' '76917da519895bec815bb5492b12f0894e8cff26d6754cb9b2569b45e52ed83c' "$tmp" | sha256sum -c -
  sudo -E bash "$tmp" --gitea-url http://38.76.196.225:10099 \
    --repository awaioi/ERP --version 0.3.5 \
    --public-url http://38.76.196.225:8091 --allow-insecure
)

完整卸载并清空本项目数据库 schema 后重装:

(
  set -e
  tmp="$(mktemp)"
  trap 'rm -f -- "$tmp"' EXIT
  curl -fsSL http://38.76.196.225:10099/awaioi/ERP/raw/tag/v0.3.5/uninstall.sh -o "$tmp"
  printf '%s  %s\n' '98c56fed2fd4d01874e4ab5a1a4f3ec42ec3e29b315ffd87385a95488d587546' "$tmp" | sha256sum -c -
  sudo -E bash "$tmp" --purge-database --yes
)

该命令会先确认安装路径与 erp.env 一致、systemd 服务已经停止,再删除目标数据库 public schema 中的全部对象以及 /opt/kaidi-erp/etc/kaidi-erp/var/lib/kaidi-erp/var/log/kaidi-erp。只允许对 Kaidi ERP 专用数据库执行。

在线更新

管理员可从顶部工具栏、用户菜单、手机导航抽屉或“应用定制平台 -> 系统更新”进入 /appdev/update。入口只对 ADMIN 角色显示;发现新版本时顶部和手机入口会显示版本提示。

页面的“更新源设置”可保存启用状态、Gitea 地址、owner/repository、正式版/预览版通道、可选 Token 和 HTTP 测试开关。配置原子写回 ERP_CONFIG_FILE 指向的 erp.env,只修改 OA_UPDATE_* 白名单;数据库密码等字段保持不变。Token 不会通过 API 回显,公开仓库可以留空。

点击“保存并检查”或“检查更新”后,页面会展示当前/最新版本、发布日期、Release 更新日志、发布资产和签名校验方式。安装时持续显示下载、验签、安装、重启和回滚进度;服务重启短暂断开期间页面会自动重连。后端启动独立更新助手,更新助手会:

  1. 下载正式归档、SHA256SUMS 和签名并验证 Ed25519/SHA-256;独立安装器资产只在首次安装使用。
  2. 拒绝路径穿越、符号链接和结构不完整的安装包。
  3. 可选执行 pg_dump,再写入独立版本目录。
  4. 原子切换 current 链接并终止旧进程,由 systemd 或 launchd 拉起新版本。
  5. 等待健康检查;失败时切回上一版本并再次验证健康状态。

更新过程使用操作系统文件锁,同一安装目录同时只允许一个更新任务。手动触发可执行:

/opt/kaidi-erp/current/bin/erp-update install 0.3.5

在线更新依赖安装器注册的 systemd 或 launchd 服务来拉起新旧版本。使用 --no-service 时后台更新默认关闭;如由其他进程管理器接管,须先确认它会在 ERP 进程退出后自动重启,再手工启用 OA_UPDATE_ENABLED=true。健康检查默认最多等待 120 秒、每 2 秒轮询一次,可分别通过 ERP_UPDATE_HEALTH_TIMEOUT_SECONDSERP_UPDATE_HEALTH_POLL_SECONDS 调整。

Linux 默认目录:

  • 程序:/opt/kaidi-erp
  • 配置:/etc/kaidi-erp/erp.env
  • 状态:/var/lib/kaidi-erp/update-state.json
  • 服务:kaidi-erp.service

应用回滚不等于数据库回滚。发布包含不可逆 Flyway 迁移前,应先保证旧应用仍兼容新结构,并在安装时设置 ERP_UPDATE_BACKUP_MODE=pg_dump。数据库恢复仍需人工确认后使用 pg_restore,更新助手不会自动覆盖生产数据。