Commit ebcef114321d14623dfc24e9fb2a57eb01d70a7b

Authored by yibo
1 parent c07ee772

raylight/h3-console: 补 systemd 开机自启

服务器意外重启后 raylight/h3-console 全灭才发现之前没有任何开机自启配置,
补上三个 unit(raylight.service 只管开机拉起一次,两个 h3-console 实例走
Restart=on-failure),详见 CHANGELOG。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CHANGELOG.md
1 # 变更记录 1 # 变更记录
2 2
  3 +## 2026-08-25(晚)— 服务器意外重启后 raylight/h3-console 全灭,补上 systemd 开机自启
  4 +
  5 +**背景**:用户反馈 `http://192.168.110.67:8080/newtask.html` 打不开。排查发现机器在当天
  6 +23:04 自己重启过(`uptime`/`last reboot` 确认,非人为操作),重启后 GPU 显存全空、
  7 +ComfyUI(8188)/raylight-server(8100)/h3-console(8080/8081) 全部没起来——**这台机器此前
  8 +没有任何开机自启配置**(既无 systemd unit 也无 crontab),全靠手动 `start.sh`/`run.sh`。
  9 +
  10 +**修复**:临时先手动 `bash raylight/scripts/start.sh` + 手动起两个 h3-console 实例恢复服务,
  11 +然后补了三个 systemd unit(本地副本见 `raylight/scripts/raylight.service`、
  12 +`h3-console/systemd/h3-console-lan.service`、`h3-console/systemd/h3-console-public.service`,
  13 +服务器上装在 `/etc/systemd/system/`):
  14 +
  15 +- `raylight.service`:`Type=oneshot` + `RemainAfterExit=yes` 包一层 `start.sh`,只负责
  16 + **开机拉起一次**,**故意不设 `Restart=`**——崩溃自愈已经交给 `watchdog.sh`,两套自动重启
  17 + 机制并存会重现 8月24日 PM2 那次「谁在重启」的排查混乱。
  18 +- `h3-console-lan.service`(8080) / `h3-console-public.service`(8081):`Type=simple` 直接
  19 + `ExecStart=run.sh`(脚本末尾是 `exec uvicorn`,进程替换后 systemd 能正确跟踪主进程),
  20 + 日志仍然 `append` 到原来的 `console-8080.log`/`console-subpath.log`,不改用 journald,
  21 + 保留原有排查习惯;这两个是无状态 FastAPI,加了 `Restart=on-failure` 没有已知冲突。
  22 +- 三者都已 `enable`。console 两个实例已经停掉手动进程、切到 systemd 管理并验证 200;
  23 + `raylight.service` 因为手动起的进程当时健康在跑,为避免几分钟模型重载中断没有强制重启
  24 + 「认领」,只对下次开机生效。
  25 +
  26 +**遗留**:没有实测过真的 `reboot` 验证三个 unit 顺序拉起是否顺畅(尤其 raylight 启动要等
  27 +ComfyUI+4卡FSDP集群就绪,可能需要 `TimeoutStartSec` 更宽裕),下次计划性重启时留意确认。
  28 +
3 ## 2026-08-25(凌晨)— 修复 watchdog.sh 误杀:把"采样跑完/VAE存盘中"当成卡死重启,打断了一批正在跑的任务 29 ## 2026-08-25(凌晨)— 修复 watchdog.sh 误杀:把"采样跑完/VAE存盘中"当成卡死重启,打断了一批正在跑的任务
4 30
5 **背景**:批量重跑 16 个 h3-showcase 案例期间,队列跑到一半突然又出现"进程重启导致任务被取消/ 31 **背景**:批量重跑 16 个 h3-showcase 案例期间,队列跑到一半突然又出现"进程重启导致任务被取消/
h3-console/README.md
@@ -143,6 +143,13 @@ PID=$(ss -lptn &quot;sport = :8080&quot; | grep -o &quot;pid=[0-9]*&quot; | cut -d= -f2 | sort -u) @@ -143,6 +143,13 @@ PID=$(ss -lptn &quot;sport = :8080&quot; | grep -o &quot;pid=[0-9]*&quot; | cut -d= -f2 | sort -u)
143 [ -n "$PID" ] && kill $PID 143 [ -n "$PID" ] && kill $PID
144 ``` 144 ```
145 145
  146 +**开机自启(2026-08-25 补)**:两个实例现在都由 systemd 管理——`/etc/systemd/system/
  147 +h3-console-lan.service`(8080)、`h3-console-public.service`(8081),本地副本见
  148 +`systemd/` 目录,已 `enable`。`ExecStart` 直接指向 `run.sh`(脚本末尾 `exec uvicorn`,
  149 +进程替换后 systemd 能正确跟踪),日志仍 `append` 到原来的 `console-8080.log`/
  150 +`console-subpath.log`(不改用 journald),加了 `Restart=on-failure`。改配置后用
  151 +`systemctl restart h3-console-lan h3-console-public` 生效,不用再手动 kill 端口。
  152 +
146 **部署后验过**:`curl http://192.168.110.67:8080/v1/backends` 看到 4/4 ready;提交一个 fl2va 153 **部署后验过**:`curl http://192.168.110.67:8080/v1/backends` 看到 4/4 ready;提交一个 fl2va
147 首尾帧任务,`console.log` 里能看到 `[supervisor] flip port=... ref2va -> fl2va`,30 秒后(空闲 154 首尾帧任务,`console.log` 里能看到 `[supervisor] flip port=... ref2va -> fl2va`,30 秒后(空闲
148 判定)触发一次、只触发一次,新后端 ready 后任务自动提交并跑完,下载代理拿到合法 mp4。 155 判定)触发一次、只触发一次,新后端 ready 后任务自动提交并跑完,下载代理拿到合法 mp4。
h3-console/systemd/h3-console-lan.service 0 → 100644
  1 +[Unit]
  2 +Description=h3-console (LAN instance, port 8080, elastic supervisor off)
  3 +After=network.target raylight.service
  4 +
  5 +[Service]
  6 +Type=simple
  7 +User=admin
  8 +WorkingDirectory=/data/models/minimax-h3/console
  9 +Environment=H3_GATEWAY_URL=http://127.0.0.1:8100
  10 +Environment=H3_CONSOLE_PUBLIC_BASE=http://192.168.110.67:8080
  11 +Environment=PORT=8080
  12 +ExecStart=/data/models/minimax-h3/console/run.sh
  13 +StandardOutput=append:/data/models/minimax-h3/console/console-8080.log
  14 +StandardError=append:/data/models/minimax-h3/console/console-8080.log
  15 +Restart=on-failure
  16 +RestartSec=5
  17 +
  18 +[Install]
  19 +WantedBy=multi-user.target
h3-console/systemd/h3-console-public.service 0 → 100644
  1 +[Unit]
  2 +Description=h3-console (public /console subpath instance, port 8081)
  3 +After=network.target raylight.service
  4 +
  5 +[Service]
  6 +Type=simple
  7 +User=admin
  8 +WorkingDirectory=/data/models/minimax-h3/console
  9 +Environment=H3_GATEWAY_URL=http://127.0.0.1:8100
  10 +Environment=H3_CONSOLE_PUBLIC_BASE=http://192.168.110.67:8080
  11 +Environment=H3_CONSOLE_BASE_PATH=/console
  12 +Environment=PORT=8081
  13 +ExecStart=/data/models/minimax-h3/console/run.sh
  14 +StandardOutput=append:/data/models/minimax-h3/console/console-subpath.log
  15 +StandardError=append:/data/models/minimax-h3/console/console-subpath.log
  16 +Restart=on-failure
  17 +RestartSec=5
  18 +
  19 +[Install]
  20 +WantedBy=multi-user.target
raylight/README.md
@@ -30,6 +30,11 @@ bash /data/models/raylight/start.sh @@ -30,6 +30,11 @@ bash /data/models/raylight/start.sh
30 脚本会按端口停掉已在跑的 ComfyUI(8188)/raylight-server(8100),重新拉起两者,轮询健康检查。 30 脚本会按端口停掉已在跑的 ComfyUI(8188)/raylight-server(8100),重新拉起两者,轮询健康检查。
31 照抄的是 `minimax-h3/start-all.sh` 的模式(按端口 `ss -lptn` 找PID kill,不用 `pkill -f`)。 31 照抄的是 `minimax-h3/start-all.sh` 的模式(按端口 `ss -lptn` 找PID kill,不用 `pkill -f`)。
32 32
  33 +**开机自启(2026-08-25 补)**:`/etc/systemd/system/raylight.service` 包了这个脚本
  34 +(`Type=oneshot`+`RemainAfterExit=yes`,已 `enable`),本地副本见 `scripts/raylight.service`。
  35 +故意不设 `Restart=`——崩溃自愈交给 `watchdog.sh`,两套自动重启机制并存会重现 8月24日 PM2
  36 +那次「谁在重启」的排查混乱,这个 unit 只管开机拉起一次。
  37 +
33 ## 怎么停 / 回滚到旧的 minimax-h3 38 ## 怎么停 / 回滚到旧的 minimax-h3
34 39
35 ```bash 40 ```bash
raylight/scripts/raylight.service 0 → 100644
  1 +[Unit]
  2 +Description=Raylight ComfyUI + FSDP server (MiniMax-H3 backend, 4-GPU cluster)
  3 +After=network.target
  4 +
  5 +[Service]
  6 +Type=oneshot
  7 +RemainAfterExit=yes
  8 +User=admin
  9 +WorkingDirectory=/data/models/raylight
  10 +ExecStart=/data/models/raylight/start.sh
  11 +TimeoutStartSec=300
  12 +# 故意不设 Restart=:崩溃后的自愈已经交给 watchdog.sh 处理,两套自动重启机制并存
  13 +# 会重现 CHANGELOG 2026-08-24「排查清楚谁在重启」那次混乱。这个 unit 只管开机拉起一次。
  14 +
  15 +[Install]
  16 +WantedBy=multi-user.target