Files
admin/.tasks/sched-pipelines-local-stack.md

5.3 KiB
Raw Blame History

sched-pipelines-local-stack

Локальный стенд: sched daemon + HTTP-воркеры (yandex-market-partner-api-client, ozon-seller-api-client)

  • CDP-browser + локальный ntfy + alert-bridge (sched webhook → ntfy/email Unisender Go). Потом миграция на VDS.

Статус (2026-08-20 вечер)

Сделано в этой сессии:

  • schedd обновлён 0.4.2 → 0.5.0 (core 0.45.0): envelope-дыра → громкий broken-worker, относительный statusUrl, poll-ретраи 2×500мс, run-deadline контракт (task-level timeoutMs).
  • tasks.json: "timeoutMs": -1 на обе пайплайн-таски (рекомендация sched). ⚠️ НЕ применилсябаг sched: applyTask при upsert существующей задачи не переносит timeoutMs (поле не в списке merged). Письмо sched 19:30Z + требование vitya: -1 = дефолт, можно не указывать (absent должен вести себя как -1, не legacy-25мин).
  • Одновременный dry-run обеих тасок через sched — оба зелёные: ozon 8/8 стадий succeeded, yandex 11/11 succeeded (outcome published, notify sent). Конкурентность работает.
  • Воркеры: ozon пересобран с их фиксами (ТЗ №1-10, envelope реализован), ym свежий (JSDoc-фикс в образе).
  • publish-мокабельность: ТЗ обеим командам (publish-mockable на их досках + письма): ozon — data.registry/.remoteBase/.githubApiBase (у них хардкод); ym — только data.githubApiBase (REST), registry+remoteBase уже есть.
  • docker-compose: ozon bind-mount на хост (./data-ozon → /app/data + state.json → /app/state.json) — раньше state/output жили в слое образа и терялись.
  • Находка: у ozon state.json/output в слое образа (run.js хардкодит ROOT), /app/data volume пуст — это их недоработка, state персистится только mount'ом. У ym state в bind (data-ym).

Открытые вопросы (к sched):

  1. applyTask timeoutMs-баг (см. письмо 19:30Z) — фикс + absent=-1 дефолт.
  2. Устаревшая таска pipeline (disabled) осталась в БД sched после переименования — sync не удаляет, контракт такой.

Поднято и проверено:

  • schedd 0.4.2 (published, verdaccio) — healthy; admin API 127.0.0.1:18080 (SCHED_ADMIN_KEY из pass)
  • tasks.json: ozon 0 2 * * *, yandex 30 2 * * *, alerts webhook (HMAC) → alert-bridge
  • ym-client-builder: envelope ✓ (ping → succeeded), auth ✓ (401 на wrong key)
  • browser-cdp: Chrome 131 + CDP :9222 ✓
  • ntfy локальный :8096 ✓; alert-bridge HMAC ✓ + доставка в топик sched-alerts ✓
  • email: unisender go2 код 229 — нужен sender-domain в аккаунте (вопрос юзеру)

Ozon-воркер ОСТАНОВЛЕН (их баги, ждём фиксы — ТЗ в их инбоксе):

  1. envelope-контракт не реализован (всегда 200 {runId,verdict} → sched видит успех)
  2. нет notify на sched-пути
  3. нет publish-стадии на sched-пути (publish только в крон-пути, крон выключен)
  4. email на старый домен go.unisender.ru + массив to + form → go2 JSON
  5. job.getTask() нет в node-cron v4 → restart-loop
  6. Dockerfile COPY ... 2>/dev/null || true — не билдится
  7. lock пинит yaml на verdaccio → E401 в чистом контейнере

Yandex (2 дефекта, ТЗ отправлено):

  1. email-эндпоинт go2.unisender.ru/api/v1/sendEmail → 404; правильный: /ru/transactional/api/v1/email/send.json (JSON body)
  2. ntfy dead-домен + email.to плейсхолдер в deploy/sched-task.json

sched (письмо «впрягись»):

  1. envelope-mode + non-envelope 2xx = тихий succeeded (маскирует фейлы) — позиция/фича
  2. канон envelope-контракта для ozon-команды
  3. missed-slot при ежедневных 2:00/2:30 — grace ок?
  4. VDS: daemon без docker-runner — docker-сокет не нужен?

Секреты (pass)

sched-pipelines/local/*: sched-api-key (общий sched→воркеры), admin-key, webhook-secret, unisender-go-api-key. В стенде через .env (gitignored) → render-tasks.cjstasks.generated.json.

Команды

cd ~/projects/.admin/host-stacks/local/sched-pipelines
node render-tasks.cjs && docker compose up -d --build
docker compose logs -f schedd

Проверки GitHub-токена

OpeItcLoc03 (gh auth), orgs: schedjs, snollacms, apitano, apilki (role admin). Репо в оргах создаёт ✓ (тест apilki/token-check-* create + delete, delete_repo scope есть). Нужно для create-if-missing: apilki/ozon-seller-typescript, apilki/ozon-seller-postman, apilki/yandex-market-postman (ещё не существуют).