107 lines
6.2 KiB
Markdown
107 lines
6.2 KiB
Markdown
# HEARTBEAT.md
|
||
|
||
## ⏰ ORCH-102 автозапуск после ресета лимита (запланирован 10.06 21:19 UTC)
|
||
На хосте mva154 крутится `nohup /home/slin/requeue_orch102.sh` (PID был 1406671): ждёт 21:35 UTC (ресет лимита Claude 00:30 MSK), пингует opus, реквелит tester ORCH-102 (task 89, stage testing). Лог: `/home/slin/requeue_orch102.log`.
|
||
- **На heartbeat проверить:** `sshpass ... cat /home/slin/requeue_orch102.log` + стадию ORCH-102. Если tester реквелен и пошёл → следить до прода, доложить Славе. Если лимит ещё держался/скрипт упал → реквелить вручную (`enqueue_job tester ... task_id=89`).
|
||
- Когда ORCH-102 дойдёт до done — **снять этот блок** из HEARTBEAT и доложить Славе утром (Lite-инструкция в проде).
|
||
- ⚠️ Я (Стрим) хожу по тем же rate-limited моделям — мои ответы тоже могли падать 429. После ресета — норма.
|
||
|
||
## 🤖 Watchdog: orchestrator pipeline (ORCH-задачи) — ПРИОРИТЕТ
|
||
|
||
Чтобы НЕ терять конвейер: на каждом heartbeat проверять активные ORCH-задачи и докладывать Славе об изменениях стадий / застреваниях / падениях. Особенно при ведении эпика ORCH-54 (автономное внедрение).
|
||
|
||
```shell
|
||
sshpass -p 'motoZ@yaz2010' ssh -o StrictHostKeyChecking=no -o ConnectTimeout=15 slin@82.22.50.71 "docker exec orchestrator python3 /tmp/orch_watch.py" 2>/dev/null
|
||
```
|
||
|
||
Если `/tmp/orch_watch.py` отсутствует — создать его (в контейнере) со скриптом: вывести активные ORCH-задачи (`SELECT id,work_item_id,stage,updated_at FROM tasks WHERE stage!='done' AND work_item_id LIKE 'ORCH%'`) и активную очередь (`jobs WHERE status IN ('queued','running')`).
|
||
|
||
Логика:
|
||
- Задача **сменила стадию** → доложить («ORCH-XX: stage → review»).
|
||
- Задача **застряла** (stage!=done, нет активных job, updated_at давно) → проверить гейт, при нужде пнуть штатно (как ORCH-044), доложить.
|
||
- Job **failed / transient (429)** → доложить + следить за ретраем (breaker).
|
||
- Спокойно и без изменений → HEARTBEAT_OK (не спамить).
|
||
- Последнюю известную стадию по каждой ORCH-задаче держать в `memory/heartbeat-state.json`.
|
||
|
||
## 🔄 Yandex backfill (02-19.04 thread_title)
|
||
|
||
Rate limit сброс ~01:00 UTC. Запустить:
|
||
```shell
|
||
/home/node/.openclaw/skills/installer/scripts/ssh_exec.sh --host fr24 --cmd "sg docker -c 'docker exec fr24-schedule python backfill.py --start-date 2026-04-06 --end-date 2026-04-19 2>&1'" --timeout 1800
|
||
```
|
||
Если снова 429 — подождать ещё час и повторить.
|
||
|
||
## 🌊 Watchdog: noisemap Flask (port 5555)
|
||
|
||
Check if Flask is running on port 5555. If not — start it silently.
|
||
|
||
```shell
|
||
curl -s --connect-timeout 2 http://localhost:5555/ > /dev/null 2>&1 || (cd /home/node/.openclaw/workspace/tasks/flightradar24/prototype && nohup /home/node/.openclaw/workspace/tasks/flightradar24/prototype/venv/bin/python app.py > /tmp/noisemap.log 2>&1 &)
|
||
```
|
||
|
||
Run the shell command above. If Flask responded (exit 0) — do nothing.
|
||
If Flask was not running (exit non-0) — start it with the command above and report: "🚀 noisemap Flask restarted on port 5555".
|
||
|
||
## 🏔️ Watchdog: snowbike-rag (port 5557)
|
||
|
||
Check if snowbike-rag is running on port 5557. If not — start it via start.sh.
|
||
|
||
```shell
|
||
curl -s --connect-timeout 2 http://localhost:5557/health > /dev/null 2>&1 || bash /home/node/.openclaw/workspace/tasks/snowbike-rag/start.sh > /dev/null 2>&1
|
||
```
|
||
|
||
If Flask responded (exit 0) — do nothing, reply HEARTBEAT_OK.
|
||
If not running — start it and report: "🚀 snowbike-rag restarted on port 5557".
|
||
|
||
## 🏔️ Watchdog: Terrain hypso tile generation
|
||
|
||
Проверять статус генерации hypso тайлов (зумы 5-14) каждые 30 минут и отписываться Славе.
|
||
|
||
```shell
|
||
cd /home/node/.openclaw/workspace/tasks/enduro-trails/prototype && node -e "
|
||
const { Client } = require('ssh2');
|
||
const conn = new Client();
|
||
function exec(conn, cmd) {
|
||
return new Promise((resolve, reject) => {
|
||
conn.exec(cmd, (err, stream) => {
|
||
if (err) return reject(err);
|
||
let out = '', e = '';
|
||
stream.on('data', d => out += d);
|
||
stream.stderr.on('data', d => e += d);
|
||
stream.on('close', () => resolve({ out: out.trim(), err: e.trim() }));
|
||
});
|
||
});
|
||
}
|
||
conn.on('ready', async () => {
|
||
const zooms = await exec(conn, 'ls /home/slin/enduro-trails/data/terrain/hillshade/ 2>/dev/null | grep -v xml | sort -n | tr \\\"\\n\\\" \\\" \\\"');
|
||
const pngs = await exec(conn, 'find /home/slin/enduro-trails/data/terrain/hillshade -name \\\"*.png\\\" 2>/dev/null | wc -l');
|
||
const procs = await exec(conn, 'pgrep -c gdal2tiles 2>/dev/null || echo 0');
|
||
console.log('zooms:' + zooms.out + ' pngs:' + pngs.out + ' procs:' + procs.out);
|
||
conn.end();
|
||
});
|
||
conn.connect({ host: '82.22.50.71', username: 'slin', password: 'motoZ@yaz2010', readyTimeout: 15000 });
|
||
" 2>/dev/null
|
||
```
|
||
|
||
Если `procs: 0` И зумы 10-15 все есть → hillshade готов → запустить ручные тесты TC-07..TC-25 и отписаться Славе.
|
||
Если ещё идёт → отписаться: «🏔️ Hillshade: зумы X, PNGs Y, ещё генерируется».
|
||
|
||
---
|
||
|
||
## 🌐 Watchdog: vpn-srv FRP tunnel
|
||
|
||
Check if vpn-srv FRP tunnel is active (port 3322 on relay).
|
||
|
||
```shell
|
||
timeout 3 bash -c 'echo > /dev/tcp/185.130.212.192/3322' 2>/dev/null && echo ok || echo FAIL
|
||
```
|
||
|
||
If FAIL — try to reconnect via SSH tunnel:
|
||
```shell
|
||
ssh -i /home/node/.openclaw/ha_ssh_key -o StrictHostKeyChecking=no -o Port=3322 vpn@185.130.212.192 'echo meNt85doC | sudo -S systemctl restart frpc' 2>/dev/null
|
||
```
|
||
|
||
If tunnel still down — alert: "⚠️ vpn-srv FRP tunnel down, manual intervention needed".
|
||
|
||
|