chore: baseline — ORM migration + systemd deploy + MCP server + daily check
- ORM migration: models/ops 重构 - deploy: 标准化 systemd timer/service 部署体系 - MCP server: 5 个只读工具(任务/状态/数据集) - daily check: 数据一致性巡检 - watch: task_watch 后台监控 - kline_daily: 麦蕊优先,时间门禁15:00 - 删除: task_industry_sector, task_sector_features
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
[Unit]
|
||||
Description=Market sync daily check — reads dataset_registry, writes report, alerts on failures
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/daily_sync_check.py
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 巡检:读 PG dataset_registry,对比今日预期,写 logs/daily_check_*.json
|
||||
# 失败时 POST webhook 到 FAILURE_WEBHOOK_URL(HMAC-SHA256 签名)
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/.venv/bin/python /home/gao/Development/quant_home/market_sync/bin/daily_sync_check.py
|
||||
|
||||
# 巡检应 < 30s 完成;超时 = PG 不通或代码 bug,不让卡死
|
||||
TimeoutStartSec=120
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑)
|
||||
# 失败时 exit code = 1,可被 OnFailure= 钩住发通知
|
||||
|
||||
# 日志走 journald(journalctl -u market-sync-daily-check -f)
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-daily-check
|
||||
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=Schedule market sync daily check — Daily 23:00 Asia/Shanghai
|
||||
# market-sync-daily-check.service 是这个 timer 的执行单元
|
||||
# 23:00 触发:周一~五最后一个任务是 longhubang @ 22:00,留 1h buffer;
|
||||
# 周六 23:00 给 stock_node @ 11:30 留 11h+ buffer
|
||||
|
||||
[Timer]
|
||||
# 每天 23:00 触发;Persistent=true 确保关机/错过时下次开机补跑
|
||||
OnCalendar=*-*-* 23:00:00 Asia/Shanghai
|
||||
Persistent=true
|
||||
Unit=market-sync-daily-check.service
|
||||
# 不要 AccuracySec(默认 1min 漂移够用)
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,20 @@
|
||||
[Unit]
|
||||
Description=Market sync kline_5min — 5分钟K (评分核心)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_kline_5min_run.sh
|
||||
After=network-online.target market-sync-kline-daily.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_kline_5min_run.sh
|
||||
TimeoutStartSec=7200
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-kline-5min
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,10 @@
|
||||
[Unit]
|
||||
Description=Schedule kline_5min sync — Mon..Fri 16:00 Asia/Shanghai
|
||||
|
||||
[Timer]
|
||||
OnCalendar=Mon..Fri 16:00:00 Asia/Shanghai
|
||||
Persistent=true
|
||||
Unit=market-sync-kline-5min.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=Market sync kline_daily — 15:10 麦蕊优先抢跑
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_kline_daily_run.sh
|
||||
|
||||
[Timer]
|
||||
OnCalendar=Mon..Fri 15:10:00
|
||||
Persistent=false
|
||||
RandomizedDelaySec=0
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,20 @@
|
||||
[Unit]
|
||||
Description=Market sync kline_daily — 个股日K (评分核心)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_kline_daily_run.sh
|
||||
After=network-online.target market-sync-kline-index.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_kline_daily_run.sh
|
||||
TimeoutStartSec=3600
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-kline-daily
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,10 @@
|
||||
[Unit]
|
||||
Description=Schedule kline_daily sync — Mon..Fri 15:40 Asia/Shanghai
|
||||
|
||||
[Timer]
|
||||
OnCalendar=Mon..Fri 15:40:00 Asia/Shanghai
|
||||
Persistent=true
|
||||
Unit=market-sync-kline-daily.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,20 @@
|
||||
[Unit]
|
||||
Description=Market sync kline_index — 指数日K (独立, 非评分依赖)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_kline_index_run.sh
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_kline_index_run.sh
|
||||
TimeoutStartSec=600
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-kline-index
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,10 @@
|
||||
[Unit]
|
||||
Description=Schedule kline_index sync — Mon..Fri 15:30 Asia/Shanghai
|
||||
|
||||
[Timer]
|
||||
OnCalendar=Mon..Fri 15:30:00 Asia/Shanghai
|
||||
Persistent=true
|
||||
Unit=market-sync-kline-index.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,33 @@
|
||||
[Unit]
|
||||
Description=Market data 龙虎榜 sync (akshare 源, daily 22:00)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_lhb_run.sh
|
||||
After=network-online.target market-sync.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口脚本:单独跑 longhubang 一个 task
|
||||
# 龙虎榜数据 19:00~21:00 陆续出齐 → 22:00 触发(与 moneyflow 21:35 错开避免并发)
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_lhb_run.sh
|
||||
|
||||
# 硬上限 1h(每日 ~200 次 akshare 调用 + DB upsert,3-5 分钟内完成,留 buffer)
|
||||
TimeoutStartSec=3600
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑——
|
||||
# 重跑会撞外部 API 限流窗口,浪费资源)
|
||||
# Restart=no 是 oneshot 默认值
|
||||
|
||||
# 日志走 journald(journalctl -u market-sync-lhb.service -f)
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-lhb
|
||||
|
||||
# 环境(不读 /etc/environment,只带这几个;.env 由 cli 内部 load_dotenv)
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,16 @@
|
||||
[Unit]
|
||||
Description=Schedule 龙虎榜 sync — Mon..Fri 22:00 Asia/Shanghai
|
||||
# market-sync-lhb.service 是这个 timer 的执行单元
|
||||
# 龙虎榜数据 19:00~21:00 陆续出齐 → 22:00 触发(与 moneyflow 21:35 错开)
|
||||
|
||||
[Timer]
|
||||
# 龙虎榜出齐 → 22:00 触发
|
||||
OnCalendar=Mon..Fri 22:00:00 Asia/Shanghai
|
||||
# 系统关机 / 错过执行时,下次开机补跑一次(避免漏数据)
|
||||
Persistent=true
|
||||
# 单位(service)的精确名称
|
||||
Unit=market-sync-lhb.service
|
||||
# 不要 AccuracySec(默认 1min 漂移够用,避免 22:00:00 整点打堆)
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,32 @@
|
||||
[Unit]
|
||||
Description=Market data MACD/KDJ/BOLL indicators sync (mairui, daily 16:40)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_mairui_indicators_run.sh
|
||||
After=network-online.target market-sync.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口脚本:单独跑 mairui_indicators 一个 task
|
||||
# mairui 16:30 后发布指标数据 → 16:40 触发留 buffer
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_mairui_indicators_run.sh
|
||||
|
||||
# 硬上限 3h(5204 只 × 3 指标,正常 ~20min,全量时可能更久)
|
||||
TimeoutStartSec=10800
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑)
|
||||
# Restart=no 是 oneshot 默认值
|
||||
|
||||
# 日志走 journald
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-mairui-indicators
|
||||
|
||||
# 环境
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,14 @@
|
||||
[Unit]
|
||||
Description=Schedule MACD/KDJ/BOLL indicators sync — Mon..Fri 16:40 Asia/Shanghai
|
||||
# market-sync-mairui-indicators.service 是这个 timer 的执行单元
|
||||
|
||||
[Timer]
|
||||
# mairui 16:30 后发布指标数据 → 16:40 触发留 buffer
|
||||
OnCalendar=Mon..Fri 16:40:00 Asia/Shanghai
|
||||
# 系统关机 / 错过执行时,下次开机补跑一次(避免漏数据)
|
||||
Persistent=true
|
||||
# 单位(service)的精确名称
|
||||
Unit=market-sync-mairui-indicators.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,32 @@
|
||||
[Unit]
|
||||
Description=Market data MA daily sync (local derivative, daily 16:30)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_mairui_ma_daily_run.sh
|
||||
After=network-online.target market-sync.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口脚本:单独跑 mairui_ma_daily 一个 task
|
||||
# 本地派生任务,依赖 kline_stock 已更新
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_mairui_ma_daily_run.sh
|
||||
|
||||
# 硬上限 2h(正常 ~30min,留 buffer)
|
||||
TimeoutStartSec=7200
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑)
|
||||
# Restart=no 是 oneshot 默认值
|
||||
|
||||
# 日志走 journald
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-mairui-ma-daily
|
||||
|
||||
# 环境
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,14 @@
|
||||
[Unit]
|
||||
Description=Schedule MA daily sync — Mon..Fri 16:30 Asia/Shanghai
|
||||
# market-sync-mairui-ma-daily.service 是这个 timer 的执行单元
|
||||
|
||||
[Timer]
|
||||
# kline_daily 15:40 / kline_index 15:30 跑完后,16:30 计算 MA
|
||||
OnCalendar=Mon..Fri 16:30:00 Asia/Shanghai
|
||||
# 系统关机 / 错过执行时,下次开机补跑一次(避免漏数据)
|
||||
Persistent=true
|
||||
# 单位(service)的精确名称
|
||||
Unit=market-sync-mairui-ma-daily.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,20 @@
|
||||
[Unit]
|
||||
Description=Market sync market_regime — 市场情绪 (本地计算, 非评分依赖)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_market_regime_run.sh
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_market_regime_run.sh
|
||||
TimeoutStartSec=600
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-market-regime
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,10 @@
|
||||
[Unit]
|
||||
Description=Schedule market_regime sync — Mon..Fri 16:30 Asia/Shanghai
|
||||
|
||||
[Timer]
|
||||
OnCalendar=Mon..Fri 16:30:00 Asia/Shanghai
|
||||
Persistent=true
|
||||
Unit=market-sync-market-regime.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,22 @@
|
||||
[Unit]
|
||||
Description=market_sync MCP Server — Model Context Protocol for sync data
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/app/mcp_server.py
|
||||
After=network-online.target postgres-container.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/.venv/bin/python -m app.mcp_server --sse --host 127.0.0.1 --port 8101
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
TimeoutStartSec=30
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-mcp
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,33 @@
|
||||
[Unit]
|
||||
Description=Market data moneyflow sync (mairui transaction, daily 21:35)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_moneyflow_run.sh
|
||||
After=network-online.target market-sync.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口脚本:单独跑 moneyflow 一个 task
|
||||
# mairui 文档:「更新:每日 21:30」—— 21:35 触发留 5min buffer
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_moneyflow_run.sh
|
||||
|
||||
# 硬上限 2h(5206 只 × 50 RPS = 104s 理论上限,留 buffer 给重试 / 慢响应)
|
||||
TimeoutStartSec=7200
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑——
|
||||
# 重跑会撞外部 API 限流窗口,浪费 1.5h)
|
||||
# Restart=no 是 oneshot 默认值
|
||||
|
||||
# 日志走 journald(journalctl -u market-sync-moneyflow.service -f)
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-moneyflow
|
||||
|
||||
# 环境(不读 /etc/environment,只带这几个;.env 由 cli 内部 load_dotenv)
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,16 @@
|
||||
[Unit]
|
||||
Description=Schedule moneyflow sync — Mon..Fri 21:35 Asia/Shanghai
|
||||
# market-sync-moneyflow.service 是这个 timer 的执行单元
|
||||
# mairui 文档:「更新:每日 21:30」—— 21:35 触发留 5 分钟 buffer
|
||||
|
||||
[Timer]
|
||||
# mairui 21:30 发布数据 → 21:35 触发
|
||||
OnCalendar=Mon..Fri 21:35:00 Asia/Shanghai
|
||||
# 系统关机 / 错过执行时,下次开机补跑一次(避免漏数据)
|
||||
Persistent=true
|
||||
# 单位(service)的精确名称
|
||||
Unit=market-sync-moneyflow.service
|
||||
# 不要 AccuracySec(默认 1min 漂移够用,避免 21:35:00 整点打堆)
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,29 @@
|
||||
[Unit]
|
||||
Description=Market sync morning pre-market — stock_basic
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_morning_run.sh
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 早盘前只跑 stock_basic(确保最新股票列表+股本快照)
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_morning_run.sh
|
||||
|
||||
# stock_basic ~9min + buffer = 1h 够用
|
||||
TimeoutStartSec=3600
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑)
|
||||
|
||||
# 日志走 journald(journalctl -u market-sync-morning -f)
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-morning
|
||||
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,14 @@
|
||||
[Unit]
|
||||
Description=Schedule market sync morning — Mon..Fri 09:00 Asia/Shanghai
|
||||
# market-sync-morning.service 是这个 timer 的执行单元
|
||||
# 早盘前 09:00 触发:跑 stock_basic,给 09:30 开盘留 30min buffer
|
||||
|
||||
[Timer]
|
||||
# A 股开盘 09:30,09:00 跑 stock_basic (~9min) 即可
|
||||
OnCalendar=Mon..Fri 09:00:00 Asia/Shanghai
|
||||
# 关机/错过时下次开机补跑
|
||||
Persistent=true
|
||||
Unit=market-sync-morning.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,31 @@
|
||||
[Unit]
|
||||
Description=Market data 股本快照 sync (雪球源, weekly Sat 11:30)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_share_run.sh
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口脚本:单独跑 share_snapshot 一个 task
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_share_run.sh
|
||||
|
||||
# 硬上限 30min(全市场 5200 只雪球 quote_detail,10 worker 约 3-8min,留 buffer)
|
||||
TimeoutStartSec=1800
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑)
|
||||
# Restart=no 是 oneshot 默认值
|
||||
|
||||
# 日志走 journald(journalctl -u market-sync-share.service -f)
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-share
|
||||
|
||||
# 环境(不读 /etc/environment,只带这几个;.env 由 cli 内部 load_dotenv)
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,16 @@
|
||||
[Unit]
|
||||
Description=Schedule share_snapshot sync — Sat 11:30 Asia/Shanghai
|
||||
# market-sync-share.service 是这个 timer 的执行单元
|
||||
# 股本快照每周跑一次即可(雪球 quote_detail,周末收盘后数据稳定)
|
||||
|
||||
[Timer]
|
||||
# 周六 11:30(和 stock_node 同时段)
|
||||
OnCalendar=Sat *-*-* 11:30:00 Asia/Shanghai
|
||||
# 系统关机 / 错过执行时,下次开机补跑一次(避免漏数据)
|
||||
Persistent=true
|
||||
# 单位(service)的精确名称
|
||||
Unit=market-sync-share.service
|
||||
# 不要 AccuracySec(默认 1min 漂移够用)
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,33 @@
|
||||
[Unit]
|
||||
Description=Market data 股票-节点映射 sync (mairui /hszg, weekly Sat 11:30)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_stock_node_run.sh
|
||||
After=network-online.target market-sync-morning.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口脚本:单独跑 stock_node 一个 task
|
||||
# mairui /hszg 数据每周六 11:00 更新 → 11:30 触发,留 30 min buffer
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_stock_node_run.sh
|
||||
|
||||
# 硬上限 2h(1100+ 调用 + 写库 + retry buffer)
|
||||
TimeoutStartSec=7200
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑——
|
||||
# 重跑会撞 mairui 配额窗口)
|
||||
# Restart=no 是 oneshot 默认值
|
||||
|
||||
# 日志走 journald(journalctl -u market-sync-stock-node.service -f)
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-stock-node
|
||||
|
||||
# 环境(不读 /etc/environment,只带这几个;.env 由 cli 内部 load_dotenv)
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,16 @@
|
||||
[Unit]
|
||||
Description=Schedule stock_node sync — Sat 11:30 Asia/Shanghai
|
||||
# market-sync-stock-node.service 是这个 timer 的执行单元
|
||||
# mairui /hszg 数据每周六 11:00 更新 → 11:30 触发(30 min buffer)
|
||||
|
||||
[Timer]
|
||||
# 周六 11:30(mairui 11:00 更新后)
|
||||
OnCalendar=Sat *-*-* 11:30:00 Asia/Shanghai
|
||||
# 系统关机 / 错过执行时,下次开机补跑一次(避免漏数据)
|
||||
Persistent=true
|
||||
# 单位(service)的精确名称
|
||||
Unit=market-sync-stock-node.service
|
||||
# 不要 AccuracySec(默认 1min 漂移够用,避免 11:30:00 整点打堆)
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,33 @@
|
||||
[Unit]
|
||||
Description=Market data tick-by-tick trade sync (mairui hsrl/zbjy, daily 21:05)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_tick_run.sh
|
||||
After=network-online.target market-sync.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口脚本:单独跑 tick_trade 一个 task(mairui 21:00 发布数据,
|
||||
# 这个 service 在 21:05 触发,留 5min buffer;force=True 绕过 task 内部 21:00 门控)
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_tick_run.sh
|
||||
|
||||
# 硬上限 2h(5000 只 × 1 RPS ≈ 17min,留 buffer 给 retry / 慢任务)
|
||||
TimeoutStartSec=7200
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑——
|
||||
# 重跑会撞外部 API 限流窗口,浪费 1.5h)
|
||||
# Restart=no 是 oneshot 默认值
|
||||
|
||||
# 日志走 journald(journalctl -u market-sync-tick.service -f)
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync-tick
|
||||
|
||||
# 环境(不读 /etc/environment,只带这几个;.env 由 cli 内部 load_dotenv)
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,17 @@
|
||||
[Unit]
|
||||
Description=Schedule tick_trade sync — Mon..Fri 21:05 Asia/Shanghai
|
||||
# market-sync-tick.service 是这个 timer 的执行单元
|
||||
# 触发顺序:market-sync.service (15:30) 之后 market-sync-tick.service (21:05)
|
||||
# 但 systemd timer 独立触发,After= 只是声明依赖关系(非强制)
|
||||
|
||||
[Timer]
|
||||
# mairui 文档:「更新:每日 21:00」—— 21:05 触发留 5 分钟 buffer
|
||||
OnCalendar=Mon..Fri 21:05:00 Asia/Shanghai
|
||||
# 系统关机 / 错过执行时,下次开机补跑一次(避免漏数据)
|
||||
Persistent=true
|
||||
# 单位(service)的精确名称
|
||||
Unit=market-sync-tick.service
|
||||
# 不要 AccuracySec(默认 1min 漂移够用,避免 21:05:00 整点打堆)
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1,25 @@
|
||||
[Unit]
|
||||
Description=Market Data Sync Worker (PostgreSQL, scheduler + health monitor)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/app/entrypoints/worker.py
|
||||
# 依赖 network 和 PG
|
||||
After=network-online.target postgresql.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口:启动进程内 scheduler + health monitor + recover 卡死任务
|
||||
# 注意:实际入口是 app/entrypoints/worker.py,不是 app/worker.py
|
||||
# 2026-07-12 修复: 把 python -m app.worker 改为 python -m app.entrypoints.worker
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/.venv/bin/python -m app.entrypoints.worker
|
||||
|
||||
# 明确标记运行模式,让 worker.py 知道不要启动 scheduler
|
||||
# (systemd 模式下同步由 timer 触发,避免双调度器重叠)
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
Environment="RUNTIME_MODE=systemd"
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,35 @@
|
||||
[Unit]
|
||||
Description=Market Data Full Sync (PostgreSQL, 9 sync tasks end-to-end)
|
||||
Documentation=file:///home/gao/Development/quant_home/market_sync/bin/market_sync_run.sh
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
WorkingDirectory=/home/gao/Development/quant_home/market_sync
|
||||
User=gao
|
||||
Group=gao
|
||||
|
||||
# 入口脚本(runall_once.py + structured_watch.sh 二合一)
|
||||
ExecStart=/home/gao/Development/quant_home/market_sync/bin/market_sync_run.sh
|
||||
|
||||
# 硬上限 3h(实际 ~80min + kline_5min 增量 70min, 总 ~2.5h, 留 30min buffer)
|
||||
# 2026-07-08 教训: 之前 4h 让 kline_daily 单点卡死拖 4h,runall 链全部受影响。
|
||||
# runall_once.py 已加 per-task multiprocessing timeout(单 task 最长 75min),
|
||||
# 这里 3h 是 systemd 层兜底。
|
||||
TimeoutStartSec=10800
|
||||
|
||||
# 不要 Restart=(oneshot 失败就让 OnFailure= 发通知,别自动重跑——
|
||||
# 重跑会撞外部 API 限流窗口,浪费 1.5h)
|
||||
# Restart=no 是 oneshot 默认值
|
||||
|
||||
# 日志走 journald(journalctl -u market-sync.service -f)
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=market-sync
|
||||
|
||||
# 环境(不读 /etc/environment,只带这几个;.env 由 runall_once.py 内部 load_dotenv)
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=Schedule market data full sync — Mon..Fri 15:30 Asia/Shanghai
|
||||
# market-sync.service 是这个 timer 的执行单元
|
||||
|
||||
[Timer]
|
||||
# A 股收盘时间 15:00,30 分钟 buffer 让最后一笔 tick 落地
|
||||
OnCalendar=Mon..Fri 15:30:00 Asia/Shanghai
|
||||
# 系统关机 / 错过执行时,下次开机补跑一次(避免漏数据)
|
||||
Persistent=true
|
||||
# 单位(service)的精确名称
|
||||
Unit=market-sync.service
|
||||
# 不要 AccuracySec(默认 1min 漂移够用,避免 15:30:00 整点打堆)
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
Reference in New Issue
Block a user