# chongming.service — systemd 管理打包后的 chongming 应用(Nuitka 单二进制 + 模块库) # # 安装步骤(以 /opt/chongming 为例,目录名可改,需同步修改下方 WorkingDirectory/ExecStart): # sudo mkdir -p /opt/chongming # sudo cp -r build/. /opt/chongming/ # 打包产物:chongming 二进制 + config.toml + config/ + resources/ + static.svfs # sudo useradd --system --home /opt/chongming --shell /usr/sbin/nologin chongming # sudo chown -R chongming:chongming /opt/chongming # sudo cp deploy/chongming.service /etc/systemd/system/ # sudo systemctl daemon-reload # sudo systemctl enable --now chongming # # 常用操作: # systemctl status chongming # 状态 # journalctl -u chongming -f # 实时日志(应用自身日志另见 /opt/chongming/logs/) # systemctl restart chongming # 重启(SIGTERM 优雅排空,最长等待 30s) # # 可选:/etc/chongming.env 中写 APP_WORKERS= 覆盖 worker 数(默认取 # config.toml [production.server].workers,打包版通常为 4)。 [Unit] Description=Chongming Zenoh Gateway (FastAPI + Zenoh + MQTT) Wants=network-online.target After=network-online.target # 60s 内失败 5 次则放弃(避免配置错误导致崩溃循环) StartLimitIntervalSec=60 StartLimitBurst=5 [Service] Type=simple # 打包应用入口:Nuitka 编译产物,前台运行 gunicorn master(Linux 分支) ExecStart=/data/chongming/chongming # 所有相对路径(config.toml / config/ / resources/*.mbank / static.svfs / # data/ / logs/ / uploads/)均相对工作目录解析,必须指向安装目录 WorkingDirectory=/data/chongming # 非特权用户运行(HTTP 8000 / MQTT 1883 / Zenoh 7447 等端口均无需 root) User=linaro Group=linaro UMask=0027 # 每机可选覆盖(如 APP_WORKERS),文件不存在时忽略(- 前缀) EnvironmentFile=-/etc/chongming.env Environment=PYTHONUNBUFFERED=1 # ffmpeg 位于非标准路径(AI Box 的 sophon-ffmpeg):覆盖默认 PATH 才能被 # shutil.which / create_subprocess_exec 找到(RTSP 拉流依赖);若 ffmpeg 还依赖 # 私有动态库,再补一条 Environment=LD_LIBRARY_PATH=/opt/sophon/sophon-ffmpeg-latest/lib Environment=PATH=/opt/sophon/sophon-ffmpeg-latest/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 优雅停机:SIGTERM 由 gunicorn 排空 worker,等在途请求/告警上传完成 KillSignal=SIGTERM KillMode=control-group TimeoutStopSec=30 # 异常退出自动拉起 Restart=on-failure RestartSec=3 # Zenoh / MQTT / 并发连接放开文件描述符上限 LimitNOFILE=65535 LimitNPROC=65535 # 轻量加固(应用无 setuid/特权端口需求,不影响运行) PrivateTmp=true NoNewPrivileges=true [Install] WantedBy=multi-user.target