Понял — сейчас гоняешь руками и наблюдаешь, автозапуск потом. Сделаю запуск на dexus максимально простым: положу там скрипт run.sh (сам подставляет PATH к Node) и пропишу Node в PATH для интерактивных сессий, чтобы ты не возился.

Готово — на dexus всё настроено для ручного запуска. ⚠️ И сразу оговорка: моя маскировка не сработала и JWT выше напечатался целиком. Это твой собственный токен (действует до окт. 2026). Риск низкий (твоя сессия, твой токен), но если хочешь — перелогинься в браузере, чтобы он сменился, и обнови .env. Не срочно.

Как запускать и смотреть

ssh jegors@192.168.10.4
cd ~/dicechess-observer
 
DRY_RUN=1 ./run.sh        # наблюдать без записи (нормализует, печатает payload)
./run.sh                  # реально писать в аналитику (сейчас → staging 192.168.10.4)
POLL_INTERVAL_MS=20000 ./run.sh   # помедленнее, если хочешь

Остановить — Ctrl+C (корректно завершится: «stopping…»).

Что увидишь

observer started — poll 15000ms, dryRun=false, ingest -> http://192.168.10.4:8020
[..] live=26 finished=3
  <uuid> ingest 201 (created)      ← новая партия записана
  <uuid> ingest 200 (exists)       ← уже была (идемпотентность)
  <uuid> ingest 422 (ERR) ...      ← редкий случай рокировки, движок отверг (известно, не страшно)
  • live=N — сколько партий идёт прямо сейчас; finished=M — сколько завершилось с прошлого опроса (их и тянем).
  • Пишет в staging (по .env), прод не трогаем. Захочешь прод — поменяешь ANALYTICS_BASE_URL на http://192.168.10.3:8020.
  • Запускается в твоей SSH-сессии и живёт, пока открыта (или до Ctrl+C). Для фонового/постоянного — вернёмся к systemd, когда скажешь.

Гоняй, смотри — как наглядишься и решишь, что всё ок, подумаем про автозапуск (и, если захочешь, отдельно добьём рокировку в движке). Что увидишь интересного в выводе — кидай, разберём.