# sched-workers — HTTP-воркеры пайплайнов клиентов @apilki (VDS, рядом с ядром sched). # Ядро sched: стек 28 (sched.compose.yml). Воркеры — отдельный стек в той же сети proxy, # sched ходит к ним по имени сервиса из sched.tasks.json. # Моки: verdaccio.kzntsv.site (npm), git.kzntsv.site (Gitea = мок-GitHub, орга apilki), # ntfy (VDS-сервис в proxy), unisender-mock (локальный мок писем в этом стеке). # Deploy: Portainer-managed (см. portainer-stack-management-vds). Env через Portainer (не env_file). # Source-of-truth: host-stacks/vds-kzntsv/sched-workers.compose.yml. services: ym-client-builder: image: registry.kzntsv.site/ym-client-builder:0.1.2 container_name: ym-client-builder restart: unless-stopped mem_limit: 512m networks: - proxy environment: PORT: "8080" SCHED_API_KEY: ${SCHED_API_KEY} UNISENDER_API_KEY: mock-key UNISENDER_FROM: noreply@snolla.com NPM_TOKEN: ${NPM_TOKEN} GITHUB_TOKEN: ${GITHUB_TOKEN} # мок-publish: verdaccio (npm) + Gitea (репо/релизы) — без выхода в npmjs/github.com PUBLISH_REGISTRY: ${PUBLISH_REGISTRY} PUBLISH_REMOTE_BASE: ${PUBLISH_REMOTE_BASE} PUBLISH_GH_API_BASE: ${PUBLISH_GH_API_BASE} volumes: - /opt/stacks/sched-workers/data-ym:/app/data ozon-seller-builder: image: registry.kzntsv.site/ozon-seller-builder:0.1.0 container_name: ozon-seller-builder restart: unless-stopped # tsc-сборка клиента ~700MB пик (openapi-generator + компилятор) — 512m OOM mem_limit: 1g networks: - proxy environment: WORKER_PORT: "8080" SCHED_API_KEY: ${SCHED_API_KEY} # внутренний крон не нужен — расписанием рулит sched. 31 февраля не наступает никогда. CRON_SCHEDULE: "0 0 29 2 *" # персистентность state/output на хосте (bind-mount /app/data) STATE_FILE: /app/data/state.json OUTPUT_DIR: /app/data/output/typescript # безопасный дефолт: DRY_RUN=1. Реальный мок-publish — только явным data.dryRun=false в таске. DRY_RUN: "1" BROWSER_CDP_URL: http://browser:9222 NTFY_URL: http://ntfy NTFY_TOPIC: ozon-seller-pipeline UNISENDER_API_KEY: mock-key UNISENDER_SENDER_EMAIL: noreply@snolla.com UNISENDER_SENDER_NAME: sched-pipeline UNISENDER_ENDPOINT: http://unisender-mock:8080/ru/transactional/api/v1/email/send.json NOTIFY_EMAIL_TO: ${NOTIFY_EMAIL_TO} GH_TOKEN: ${GITHUB_TOKEN} NPM_TOKEN: ${NPM_TOKEN} # мок-publish: verdaccio (npm) + Gitea (репо/релизы) — без выхода в npmjs/github.com PUBLISH_REGISTRY: ${PUBLISH_REGISTRY} PUBLISH_REMOTE_BASE: ${PUBLISH_REMOTE_BASE} PUBLISH_GH_API_BASE: ${PUBLISH_GH_API_BASE} volumes: - /opt/stacks/sched-workers/data-ozon:/app/data # снапшот спеки из репо (fetch антиботом не ходим — dry-run от ручного снапшота) - /opt/stacks/sched-workers/data-ozon-openapi:/app/openapi depends_on: - browser # headless Chrome + CDP :9222 (для антибот-fetch стадий ozon), socat наружу 0.0.0.0:9222 browser: image: registry.kzntsv.site/browser-cdp:0.1.0 container_name: browser-cdp shm_size: "1gb" restart: unless-stopped mem_limit: 512m networks: - proxy # мок Unisender Go: письма в /opt/stacks/sched-workers/data-mail, реальных отправок нет unisender-mock: image: registry.kzntsv.site/unisender-mock:0.1.0 container_name: unisender-mock restart: unless-stopped mem_limit: 128m environment: PORT: "8080" MAIL_DIR: /mail volumes: - /opt/stacks/sched-workers/data-mail:/mail networks: - proxy networks: proxy: external: true