问题描述:
我开发了一个 fnOS 应用(trim.terminal,基于 xterm.js 的 Web 终端),打包成 .fpk 通过应用中心安装。遇到一个问题:框架安装应用时,appcenter.app_service 表中的 gateway_socket 和 gateway_prefix 字段不会从 ui/config 中读取填充,导致访问 /app/trim.terminal 时返回 404。
当前环境:
- 系统:fnOS(飞牛 NAS OS)
- 应用通过 .fpk 包安装,框架自动注册到
appcenter 数据库(PostgreSQL)
- 应用通过 Unix Socket 与
trim_http_cgi 网关通信
已知信息:
-
app_service 表中 gateway_socket 和 gateway_prefix 字段安装后为空
-
手动执行以下 SQL 可修复:
复制
UPDATE app_service
SET gateway_socket='/var/apps/trim.terminal/target/trim.terminal.sock',
gateway_prefix='/app/trim.terminal'
WHERE app_id IN (SELECT id FROM app WHERE app_name='trim.terminal')
AND (gateway_socket IS NULL OR gateway_socket='');
-
修复后需重启 trim_http_cgi 服务才能生效
-
ui/config 中已配置 gatewaySocket 和 gatewayPrefix 字段,但框架安装时未读取
尝试过的方案:
| 方案 |
结果 |
install_callback 脚本中执行 SQL |
❌ 框架未调用 install_callback(已确认脚本已安装但未执行) |
cmd/main 的 start 阶段执行 SQL |
✅ 当 run-as: root 时可正常工作(root 可通过 peer auth 访问 PostgreSQL) |
同上,但 run-as: package(非 root 用户) |
❌ 应用用户无法访问 PostgreSQL(peer auth 仅允许 postgres 系统用户) |
核心矛盾:
出于安全考虑,我希望应用以非 root 用户(trim.terminal)运行,但 app_service 表的修复 SQL 需要 PostgreSQL 权限。trim.terminal 用户无法通过 peer auth 连接 PostgreSQL(psql -U postgres 要求当前系统用户为 postgres)。
想请教:
- 有没有办法让 fnOS 框架在安装时自动从
ui/config 读取 gatewaySocket 和 gatewayPrefix 填充到 app_service 表?(什么条件下框架会自动填充这两个字段?)
- 如何给非 root 的应用用户配置 PostgreSQL 访问权限?比如修改
pg_hba.conf 允许 trim.terminal 用户访问 appcenter 数据库?这样是否安全?
install_callback 在什么条件下会被框架调用?我的另一个应用 trim.openclaw 的 install_callback 会被正常调用,但 trim.terminal 的不会。两者 manifest 有什么关键区别?
相关文件:
ui/config:
manifest(关键字段):
复制
appname = trim.terminal
install_dep_apps = nodejs_v24
desktop_uidir = ui
desktop_applaunchname = trim.terminal.Application
ctl_stop = true
checkport = false