netx/packaging/linux/README.md
oliver eb0eccdffe UME TLS off by default on Linux and Windows; truthful admin login hints.
- Deployments are on internal networks with self-signed UME certificates:
  installers write NETX_UME_VERIFY_TLS=false and
  NETX_ALLOW_INSECURE_DEFAULTS=1 when absent (Linux also on update), so
  binding 0.0.0.0 no longer stops NetX at the startup security check.
  Admin password and JWT secret stay unique per install.
- Linux: after install, check app_user to report whether the generated
  initial password applies or the admin already exists (reused external
  DB); new 'netxctl admin-password'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 15:50:38 +08:00

136 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# NetX Linux 发行版 / Linux release
一个离线安装包 `netx-<版本>-linux-x86_64.tar.gz`:自带 Python 3.12、全部依赖、PostgreSQL 16 和网页,目标机器上**不需要预装任何软件**(只需要 bash、coreutils、useradd 这些系统自带的东西,再加上解压用的 tar)。
## 支持的系统
x86_64、glibc ≥ 2.17:CentOS 7/8/Stream 9、RHEL 7–9、Rocky/Alma 8–9、Oracle Linux、Fedora、Ubuntu 18.04+、Debian 9+、openSUSE Leap / SLES 12+、openEuler 20.03+、麒麟 V10、统信 UOS 20、Anolis 等。
**实际测试过**(每次发版 CI 都会在这些系统上断网完整测试一遍安装、改端口、更新、卸载):CentOS 7、Rocky Linux 9、Ubuntu 18.04、Ubuntu 24.04、Debian 12、openSUSE Leap 15、openEuler 22.03。上面列出的其他系统使用相同的 glibc 运行环境,理论上兼容,但没有逐一实测。
不支持:Alpine(musl)、32 位、ARM(鲲鹏/飞腾)、CentOS 6(glibc 太旧)。
## 安装
```bash
tar xzf netx-0.4.19-linux-x86_64.tar.gz
cd netx-0.4.19-linux-x86_64
sudo ./install.sh
```
**解压到哪里、文件夹叫什么都可以**:`install.sh` 按自己所在的位置找包里的文件,并把程序复制到 `/opt/netx`、数据放到 `/var/lib/netx`。装完后,解压出来的文件夹和 tar.gz 都可以删掉,不影响运行和以后的升级。
想放到别的位置(比如数据盘 `/data`)时,安装时指定,之后 `netxctl` 会自动记住:
```bash
sudo ./install.sh --prefix /data/netx --data /data/netx-data
```
**目录在 `/root` 下面时**:NetX 服务以系统用户 `netx` 运行(内置 PostgreSQL 不允许用 root 运行),而 `/root` 默认不允许其他用户进入。安装程序会检测到这种情况:交互安装时询问是否授权;非交互安装加 `--grant-access` 自动授权。授权只给 `netx` 开放上级目录的"进入"权限(不能查看目录内容):优先用 `setfacl -m u:netx:x`,系统没有 ACL 工具时用 `chmod o+x`。
```bash
sudo ./install.sh --prefix /root/service/netx/programfile --data /root/service/netx/userdata --grant-access
```
已经装在 `/root` 下、启动失败且日志为空的,手动授权后直接 `sudo netxctl start` 即可,不用重装:
```bash
setfacl -m u:netx:x /root /root/service /root/service/netx
```
卸载时不会撤销这些授权;需要的话用 `setfacl -x u:netx <目录>` 撤销。
全部安装参数见 `./install.sh --help`。
交互式安装会依次询问:监听地址(默认 `0.0.0.0`)、**Web/API 端口**(默认 8890,被占用会提示重新输入)、数据库(内置 / 外置)、**内置 PostgreSQL 端口**(默认 15432,只监听 127.0.0.1)。
非交互示例:
```bash
sudo ./install.sh --yes --port 9890 --db bundled --pg-port 25432
sudo ./install.sh --yes --db external --db-url 'postgresql+psycopg://netx:密码@10.0.0.8:5432/netx'
```
装好后访问 `http://<服务器IP>:<端口>/`,初始账号 `admin`,密码在安装结束时显示(随机生成,也可用 `--admin-password` 指定;同时保存在 `/var/lib/netx/.env` 的 `NETX_BOOTSTRAP_ADMIN_PASSWORD`),首次登录必须改密码。
**登录密码**:安装结束时会显示登录信息,之后也可以随时用 `sudo netxctl admin-password` 查看。
- 新数据库:NetX 首次启动时用随机生成的初始密码创建 `admin`(保存在 `.env` 的 `NETX_BOOTSTRAP_ADMIN_PASSWORD`),首次登录必须修改。
- 沿用已有数据库(例如外置库里已有以前部署的数据):库里已经有账号,初始密码不会生效,请用原来的密码登录;`admin-password` 会明确提示这种情况。
**对接 UME**:在 `/var/lib/netx/.env` 中加入下面几行,然后 `sudo netxctl restart`:
```
NETX_UME_BASE_URL=https://<UME地址>:<端口>
NETX_UME_USERNAME=...
NETX_UME_PASSWORD=...
```
> UME 一般使用自签名证书,所以安装程序默认设置 `NETX_UME_VERIFY_TLS=false` 和 `NETX_ALLOW_INSECURE_DEFAULTS=1`。后者用来放行 NetX 的启动安全检查(对外监听时,该检查要求开启 UME 证书校验、管理员初始密码不是 admin123;否则 api.log 末尾是 `security_bootstrap.py ... SystemExit: 2`)。管理员密码和 JWT 密钥在安装时已经单独生成,所以实际放开的只有"访问 UME 时不校验证书"这一项,与 Windows 版默认行为相同。如果 UME 证书可信,可以改成 `NETX_UME_VERIFY_TLS=true` 并删掉 `NETX_ALLOW_INSECURE_DEFAULTS`。
| 路径 | 内容 |
|---|---|
| `/opt/netx/current` → `releases/<版本>` | 程序(只读,保留最近 2 个版本用于回滚) |
| `/var/lib/netx` | `.env`、`pgdata/`、`data/`、`logs/`、`backups/` |
| `/usr/bin/netxctl` | 管理命令 |
| `netx.service` | systemd 服务,开机自启;没有 systemd 时用 `netxctl start` |
服务以系统用户 `netx` 运行。
## 日常管理
启动和停止:
```bash
sudo netxctl start # 启动,等页面能访问后才返回
sudo netxctl stop # 停止(API、后台任务、内置 PostgreSQL 一起停)
sudo netxctl restart
sudo netxctl status # 是否在运行、版本、端口、数据库模式
```
- 有 systemd 的系统(绝大多数服务器):默认开机自启,进程崩溃后 5 秒内自动拉起。`netxctl start/stop` 内部调用的就是 systemd,也可以直接用 `sudo systemctl start|stop netx`;不想开机自启时执行 `sudo systemctl disable netx`。
- 没有 systemd 的环境(如容器):`netxctl start/stop` 一样能用,但不会开机自启,服务器重启后要手动执行 `sudo netxctl start`。
其他管理命令:
```bash
sudo netxctl logs api -f # api / worker / biz0 / pg / netxctl
sudo netxctl set-port 9890 # 改 Web/API 端口(检查占用,失败自动回滚)
sudo netxctl set-bind 127.0.0.1
sudo netxctl set-pg-port 25432 # 改内置 PostgreSQL 端口
sudo netxctl reconfigure-db # 重新选择内置/外置数据库(不删数据)
sudo netxctl backup # pg_dump + .env + 密钥 → /var/lib/netx/backups/
sudo netxctl uninstall # 保留数据;--purge 连数据一起删除
```
## 更新
- 在线:`sudo netxctl check-update`、`sudo netxctl update`。更新源与 Windows 版一致(GitHub、Forgejo,可用 `.env` 里的 `NETX_UPDATE_*` 覆盖),下载后校验 sha256。
- 离线:把新包拷到服务器,两种方式任选,效果一样,**不需要重新安装**:
- `sudo netxctl update --file netx-0.4.20-linux-x86_64.tar.gz`
- 解压新包后执行 `sudo ./install.sh`:检测到已有安装后默认选"更新",不会再问端口和数据库。
把同名的 `.sha256` 文件放在包旁边,会自动校验包是否完整。包的版本不高于当前版本时会拒绝;确实要重装同一版本,加 `--force`。
- 自动:`sudo netxctl auto-update on`(每天 03:30 左右;systemd timer,没有 systemd 时用 cron)。
更新会先停服务,把内置数据库备份到 `backups/pre-<版本>-*.dump`(保留 3 份),然后切换版本并启动。新版本没起来就自动切回旧版本。端口、数据库等配置保持不变。
## 构建(开发者)
需要 docker,构建在 `manylinux2014` 容器里进行(CentOS 7 / glibc 2.17),保证产物在老系统上也能运行:
```bash
packaging/linux/build_linux_release.sh # 产物在 packaging/release/
packaging/linux/build_linux_release.sh --skip-web-build # 复用现成的 web/dist
```
- 第一次会从源码编译 PostgreSQL,结果缓存在 `packaging/cache/linux/`。
- `check_bundle.sh` 检查所有 ELF:要求的 glibc 不超过 2.17,并且依赖的库都在包里。
- 冒烟测试(断网,在一个裸发行版容器里完整走一遍安装、改端口、更新和卸载;镜像里没有 tar 时,先在宿主机解压,再把解压目录作为第二个参数传入,见 `release-linux.yml`):
```bash
docker run --rm --network none -v "$PWD/packaging/release:/pkg:ro" \
-v "$PWD/packaging/linux/smoke_test.sh:/smoke.sh:ro" centos:7 \
bash /smoke.sh /pkg/netx-0.4.19-linux-x86_64.tar.gz
```
CI:`.github/workflows/release-linux.yml` 在 `v*` tag 上构建,在 7 个发行版里跑冒烟测试,全部通过后把 tar.gz 和 .sha256 挂到同一个 Release。挂到 Forgejo 用 `packaging/publish_forgejo_release.ps1`,它会自动带上 `packaging/release/` 下的 Linux 包。