# zcbot 蓝绿双实例模板 unit(RUN.md §无感更新 B 档)。
# 安装:sudo cp deploy/zcbot@.service /etc/systemd/system/ && sudo systemctl daemon-reload
# 实例:zcbot@blue(port 8766)/ zcbot@green(port 8767),端口与实例名由
# deploy/instances/<实例>.env 注入(ZCBOT_PORT / ZCBOT_INSTANCE)。
# 对外端口仍是 8765 —— 由 nginx 接管(客户端 / platform 嵌入无感),upstream 在
# 两实例间切流量,部署走 deploy/update_bluegreen.sh。
[Unit]
Description=zcbot web (FastAPI/uvicorn) - instance %i
After=network-online.target postgresql.service
Wants=network-online.target

[Service]
Type=simple
User=zcbot
WorkingDirectory=/opt/zcbot
# 先装 .env(业务配置),再装实例 env(ZCBOT_PORT/ZCBOT_INSTANCE,后装覆盖前者同名项)
EnvironmentFile=/opt/zcbot/.env
EnvironmentFile=/opt/zcbot/deploy/instances/%i.env
# 只绑 127.0.0.1:对外统一走 nginx,实例端口不直接暴露
ExecStart=/opt/zcbot/.venv/bin/python main.py web --host 127.0.0.1 --port ${ZCBOT_PORT}
Restart=on-failure
RestartSec=2
KillSignal=SIGTERM
# ★ 优雅 drain:SIGTERM 后先拒新 run(503)、等在跑的 run 收尾(config/agent.yaml
# `shutdown` 段:drain_timeout 30s + cancel_grace 15s)。TimeoutStopSec 必须 >
# drain_timeout + cancel_grace + 余量(sandbox 容器清扫 + uvicorn graceful 5s),
# 否则 systemd 中途 SIGKILL 把 drain 砍掉。改 agent.yaml 那两个数值时这里跟着调。
TimeoutStopSec=90
KillMode=mixed
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
