- schedd.Dockerfile: daemon 0.6.0 → 0.7.0 (cancel-канал: cancelUrl в accepted-envelope) - tasks.json: publish+githubDistro с dryRun:true у обеих тасок (мок-publish dry, ноль мутаций) - compose: DRY_RUN=1 безопасный дефолт; ozon state персистентен (bind-mount, noop работает) - тесты: мок-publish dry — yandex 13/13, ozon 10/10, GitHub/Gitea/verdaccio чисто - баг cancel воспроизведён (воркер продолжает после cancel) → ТЗ worker-cancel-url обеим командам
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).
Команды
# рендер 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
- Запушить образы в registry.kzntsv.site, compose → Portainer-стек.
- Сеть:
proxy(traefik), ntfy →https://ntfy.vds.kzntsv.site(+ auth-топик), порты → traefik-правила. - Секреты → stack.env на Portainer (или pass, как принято).
CRON_SCHEDULEozon остаётся выключенным (рулит sched).- Проверить 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 (руками оператора).