ops(sched-pipelines): локальный стенд sched + ym/ozon воркеры + browser/ntfy/alert-bridge; ТЗ разосланы

This commit is contained in:
2026-08-20 20:07:50 +03:00
parent cbd22be2a2
commit bfcc4d5e72
9 changed files with 491 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
# sched-pipelines — локальный стенд
sched daemon + 2 HTTP-воркера (Yandex Market, Ozon Seller) + CDP-browser + локальный ntfy + alert-bridge.
## Расписание (sched daemon)
| Задача | Cron | URL |
|---|---|---|
| `ozon-seller-pipeline` | `0 2 * * *` (02:00) | http://ozon-seller-builder:8080/run |
| `yandex-market-pipeline` | `30 2 * * *` (02:30) | http://ym-client-builder:8080/run |
Воркеры в **DRY-RUN**: реальные npm publish / GitHub push не выполняются (озон — `DRY_RUN=1` + publish-стадии нет на sched-пути; яндекс — stages без publish/githubDistro). После отмашки оператора — снять DRY_RUN и добавить стадии.
## Состав
| Сервис | Порт на хосте | Заметки |
|---|---|---|
| `schedd` | 127.0.0.1:18080 | admin API, ключ `SCHED_ADMIN_KEY` |
| `ym-client-builder` | 127.0.0.1:18090 | воркер Yandex (envelope-контракт ✅) |
| `ozon-seller-builder` | 127.0.0.1:18091 | воркер Ozon (sched-путь без publish/notify — ТЗ отправлено) |
| `browser` | — | Chrome headless + CDP :9222 (антибот-стадии ozon) |
| `ntfy` | 127.0.0.1:8096 | локальный ntfy на период локального теста |
| `alert-bridge` | 127.0.0.1:19090 | sched webhook → ntfy + email (unisender go2) |
## Секреты
- `.env` — gitignored; источник правды — `pass sched-pipelines/local/*`:
`sched-api-key`, `admin-key`, `webhook-secret`, `unisender-go-api-key`.
- `SCHED_API_KEY` — общий токен sched→воркеры (x-sched-api-key). Сгенерирован, в pass.
- `WEBHOOK_SECRET` — HMAC-подпись sched-алертов (X-Sched-Signature-256).
## Команды
```bash
# рендер tasks.generated.json из tasks.json + .env (после смены секретов/расписания)
node render-tasks.cjs
# сборка + запуск
docker compose up -d --build
# логи
docker compose logs -f schedd
# health sched
curl -H "Authorization: Bearer $(pass show sched-pipelines/local/admin-key)" http://127.0.0.1:18080/api/health
# ручной триггер (dry-run безопасен: воркеры в DRY-RUN)
# через sched admin API: POST /api/tasks/:name/run — см. sched docs 09.admin-api.md
```
## Миграция на VDS
1. Запушить образы в registry.kzntsv.site, compose → Portainer-стек.
2. Сеть: `proxy` (traefik), ntfy → `https://ntfy.vds.kzntsv.site` (+ auth-топик), порты → traefik-правила.
3. Секреты → stack.env на Portainer (или pass, как принято).
4. `CRON_SCHEDULE` ozon остаётся выключенным (рулит sched).
5. Проверить IP-доступность: VDS IP для docs.ozon.ru / антибот — не заблокировать.
## Известные дыры (ТЗ отправлены командам apilki)
- **ozon**: sched-путь не отдаёт sched-envelope (всегда 200 + `{runId, verdict}`) → sched видит «succeeded» на фейле; нет notify на sched-пути; нет publish-стадии на sched-пути (publish только в внутреннем кроне, который тут выключен).
- **yandex**: email-эндпоинт unisender `go2.unisender.ru/api/v1/sendEmail` → 404; правильный — `go2.unisender.ru/ru/transactional/api/v1/email/send.json` (JSON body).
- **ozon**: email-эндпоинт `go.unisender.ru/...` (старый домен) + массив `to` → go2 + одиночный получатель.
- **unisender go2**: аккаунт требует настроенный backend/tracking domain («Custom backend domain or tracking domain required») — конфигурация в аккаунте go2.unisender.ru (руками оператора).