fix(deploy): 支持无 systemd 的环境,并修复降级路径的两个真实缺陷
用户实测:服务器没有 systemctl,install.sh 直接报错退出。
原错误信息本身也是错的(建议 SKIP_NGINX=1,但那只跳过 nginx,仍走 systemctl)。
进程管理改为四层降级:
systemd → OpenRC → SysVinit → nohup 后台进程(deploy/ctl.sh)
- 新增 deploy/ctl.sh:start/stop/restart/status/logs,PID 文件 + 进程名双重判定
- 新增 deploy/openrc/opendance-api、deploy/initd/opendance-api
- 无 init 系统时写 crontab @reboot 实现开机自启
- uninstall.sh 同步支持四种模式清理(原先只处理 systemd,会留下运行中的进程)
- 汇总输出按实际初始化系统给出对应运维命令
测试中发现并修复降级路径的两个真实缺陷:
1. nohup 无法调用 shell 函数
实测退出码 127 且什么都不执行
(nohup 是外部命令,只能执行可执行文件)。
这会让无 systemd 的降级路径完全失效——服务根本起不来。
改为按 runuser / setpriv / su 显式拼接成外部命令后再 nohup。
另加启动后 1 秒存活检测,失败立即打印日志,不再白等 30 秒。
2. find_pids 在无进程时返回一个空格
在空输入下仍会执行一次 echo,输出空行,
最终得到 " ";调用方 [ -n ... ] 会判为「有进程」,
导致 start 直接跳过、status 谎报运行中。改为纯 bash 拼接,空时返回空串。
实测(真实 API 进程,端口 3100):
start → 健康检查 200,PID 正确
重复 start → 识别已在运行,进程数保持 1
status → 运行中
restart → 新 PID,健康检查 200
stop → 无残留进程,端口释放
无 process 时 find_pids 返回空串,is_running=false
This commit is contained in:
@@ -51,9 +51,30 @@ deploy/nginx/opendance.conf
|
||||
| `deploy/uninstall.sh` | 卸载;默认保留上传数据,`--purge` 才删除 |
|
||||
| `deploy/.env.example` | 部署环境变量样例(含 `HOST=127.0.0.1`) |
|
||||
| `deploy/systemd/opendance-api.service` | systemd 单元,含 `ProtectSystem=strict` 等安全加固 |
|
||||
| `deploy/openrc/opendance-api` | OpenRC 服务脚本 |
|
||||
| `deploy/initd/opendance-api` | SysVinit / LSB 启动脚本(转调 ctl.sh) |
|
||||
| `deploy/ctl.sh` | 无 init 系统时的进程控制(nohup + PID 文件),start/stop/restart/status/logs |
|
||||
| `deploy/nginx/opendance.conf` | 站点配置:SPA 回退、API 反代、上传上限 512 MiB、gzip |
|
||||
| `web-server/admin/nginx.conf` | 管理端容器内配置(保留给需要独立静态托管的场景) |
|
||||
|
||||
## 进程管理:四层降级
|
||||
|
||||
"运行在 Linux 上"不应等于"必须有 systemd"。安装时按以下顺序探测并选择:
|
||||
|
||||
```
|
||||
1. systemd /run/systemd/system 存在且 systemctl 可用
|
||||
2. OpenRC rc-service + rc-update 可用
|
||||
3. SysVinit /etc/init.d 存在且 update-rc.d 或 chkconfig 可用
|
||||
4. 都没有 nohup 后台进程 + PID 文件(deploy/ctl.sh)
|
||||
并写 crontab @reboot 实现开机自启
|
||||
```
|
||||
|
||||
三种 init 方式最终都调用同一个 Node 进程,只是守护方式不同;第 4 种由
|
||||
`deploy/ctl.sh` 提供 start/stop/restart/status/logs。
|
||||
|
||||
**不使用 sudo**:脚本已要求 root,降权到服务用户用 `runuser → setpriv → su`
|
||||
依次回退(部分服务器根本没装 sudo)。
|
||||
|
||||
## 关键实现
|
||||
|
||||
- **Node 进程只监听 `127.0.0.1`**(`HOST=127.0.0.1`),外部只能经 nginx 访问;
|
||||
|
||||
Reference in New Issue
Block a user