meta(tasks): migrate .tasks to v2 (global numbering 87 tasks)

This commit is contained in:
2026-08-23 10:18:28 +03:00
parent 83986e0589
commit 3f4d7474b3
28 changed files with 176 additions and 89 deletions

View File

@@ -0,0 +1,76 @@
# 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 вечер)
**Фикс sched принят (0.6.0, проверено живьём):**
- applyTask переносит timeoutMs при upsert существующих задач ✓ (был null → стал -1)
- дефолт absent = -1 ✓ — timeoutMs убран из tasks.json, live-sync подхватил, таски остались -1 (без рестарта)
**Сделано в этой сессии:**
- 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).
**Мок-publish на Gitea (решение vitya):**
- мок-npm = наш verdaccio (verdaccio.kzntsv.site), мок-GitHub = наш Gitea (git.kzntsv.site, орга `apilki` создана, API v1, push через x-access-token работает — проверено живьём).
- Репо руками НЕ создаю — воркеры сами (create-if-missing), это тестируемый сценарий.
- ТЗ обеим командам (`gitea-mock-publish` на досках): ozon — заменить `gh repo create` CLI на REST POST /orgs/{owner}/repos + remoteBase URL-join; yandex — только remoteBase URL-join (REST уже Gitea-совместим).
**Открытые вопросы (к sched):**
1. ✅ applyTask timeoutMs + absent=-1 — ЗАКРЫТО (0.6.0, проверено живьём).
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.cjs``tasks.generated.json`.
## Команды
```bash
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 (ещё не существуют).