Files
cbpred/docs/deployment.md
2026-08-24 20:17:24 +08:00

75 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 8H 预测服务部署
## 方案对比
| 方案 | 适用场景 | 本项目的限制 |
| --- | --- | --- |
| cron | 单机、只需固定时间执行一条命令 | 需要额外处理 K 线入库延迟、重启后重复运行、互斥锁、通知失败重试和结构化日志。 |
| Python 常驻服务 | 需要状态、通知和后续扩展 | 需要由 systemd 或其他进程管理器守护。 |
当前实现选择 Python 常驻服务。它每 `poll_seconds` 秒检查一次,但只会在 UTC 的 `00:00`、`08:00`、`16:00` 后经过 `grace_seconds`,针对刚结束的 8H K 线执行一次。成功状态只会在预测和全部通知都成功后写入;通知或预测失败时,下一次轮询会重试同一根 K 线,进程异常退出时由 systemd 重启。
## 配置
复制 [`config/prediction-service.yml.example`](../config/prediction-service.yml.example) 到 `/etc/cbpred/prediction-service.yml`,填写实际路径、Webhook 和 SMTP 参数。字符串中的 `${NAME}` 会在进程启动时从环境变量读取;缺失的变量会使服务启动失败,避免把空密钥发送到外部服务。
例如,`/etc/cbpred/prediction-service.env`:
```text
CBPRED_WEBHOOK_TOKEN=replace-with-webhook-token
CBPRED_SMTP_PASSWORD=replace-with-smtp-password
```
将其设为仅服务账户可读,例如 `chmod 600 /etc/cbpred/prediction-service.env`。不要把密钥提交到仓库。
HTTP 通知默认发送 `event`、K 线结束时间、`report.json` 摘要和全部 CSV 行;可在各个目标上设置 `include_predictions: false` 或 `max_rows`。邮件会包含摘要并默认附加 `predictions.csv`。HTTP 或邮件任一失败,状态文件不会推进,因此会重试。
## 验证和安装
先执行一次只读调度检查。若当前不在 K 线完成后的宽限期内,它会正常退出且不执行预测:
```bash
/data/quant/cbpred/.venv/bin/python -m cbpred.prediction_service \
--config /etc/cbpred/prediction-service.yml --once
```
将 [`scripts/cbpred-prediction.service`](../scripts/cbpred-prediction.service) 安装为 systemd unit:
```bash
sudo install -d -m 755 /etc/cbpred
sudo install -d -o ctyun -g ctyun -m 750 /var/lib/cbpred
sudo install -o root -g ctyun -m 640 config/prediction-service.yml.example /etc/cbpred/prediction-service.yml
sudo install -o root -g ctyun -m 640 config/prediction-service.env.example /etc/cbpred/prediction-service.env
sudo install -m 644 scripts/cbpred-prediction.service /etc/systemd/system/cbpred-prediction.service
sudo systemctl daemon-reload
sudo systemctl enable --now cbpred-prediction.service
sudo systemctl status cbpred-prediction.service
```
查看运行日志:
```bash
journalctl -u cbpred-prediction.service -f
```
服务使用状态文件锁避免并发重复运行。不要为同一套输出目录同时启用 `update_and_predict.sh` 的 cron 作业和该服务。
没有系统管理员权限时,可使用已启用 linger 的用户级 systemd。它使用同一套服务逻辑,但配置与状态文件放在当前用户目录:
```bash
install -d -m 700 ~/.config/cbpred ~/.local/state/cbpred ~/.config/systemd/user
install -m 600 config/prediction-service.user.yml.example ~/.config/cbpred/prediction-service.yml
install -m 600 config/prediction-service.env.example ~/.config/cbpred/prediction-service.env
install -m 644 scripts/cbpred-prediction.user.service ~/.config/systemd/user/cbpred-prediction.service
systemctl --user daemon-reload
systemctl --user enable --now cbpred-prediction.service
```
查看用户服务日志:
```bash
journalctl --user -u cbpred-prediction.service -f
```
如果只需 cron,可将 `scripts/update_and_predict.sh` 安排在 `2 0,8,16 * * *`(UTC)之后运行,并自行提供锁、通知与失败监控;这正是本服务已经处理的部分。