ops(sched-pipelines): локальный стенд sched + ym/ozon воркеры + browser/ntfy/alert-bridge; ТЗ разосланы
This commit is contained in:
150
host-stacks/local/sched-pipelines/docker-compose.yml
Normal file
150
host-stacks/local/sched-pipelines/docker-compose.yml
Normal file
@@ -0,0 +1,150 @@
|
||||
# sched-pipelines — локальный стенд: sched daemon + 2 HTTP-воркера (ym/ozon)
|
||||
# + CDP-browser (ozon антибот) + локальный ntfy + alert-bridge (sched webhook → ntfy/email).
|
||||
#
|
||||
# Расписание (sched daemon, tasks.json): ozon 2:00, yandex 2:30 — ежедневно.
|
||||
# Воркеры в DRY-RUN: реальные publish/push НЕ выполняются до отмашки оператора.
|
||||
#
|
||||
# Запуск: docker compose up -d --build
|
||||
# Секреты: .env (gitignored; значения в pass: sched-pipelines/local/*)
|
||||
# Миграция на VDS: образы в registry, сеть proxy, ntfy → ntfy.vds.kzntsv.site.
|
||||
name: sched-pipelines
|
||||
|
||||
services:
|
||||
# --- sched daemon (schedd) ---
|
||||
schedd:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: schedd.Dockerfile
|
||||
args:
|
||||
VERDACCIO_TOKEN: ${VERDACCIO_TOKEN:-}
|
||||
image: sched-pipelines/schedd:local
|
||||
command:
|
||||
- --tasks
|
||||
- /app/tasks.json
|
||||
- --db
|
||||
- /data/sched.db
|
||||
- --admin-port
|
||||
- "8080"
|
||||
- --admin-host
|
||||
- 0.0.0.0
|
||||
- --tick-interval
|
||||
- "1000"
|
||||
environment:
|
||||
SCHED_ADMIN_KEY: ${SCHED_ADMIN_KEY:?задайте в .env}
|
||||
volumes:
|
||||
- ./tasks.generated.json:/app/tasks.json:ro
|
||||
- sched-data:/data
|
||||
ports:
|
||||
- "127.0.0.1:18080:8080"
|
||||
healthcheck:
|
||||
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8080/api/health',{headers:{authorization:'Bearer '+process.env.SCHED_ADMIN_KEY}}).then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 10
|
||||
restart: unless-stopped
|
||||
networks: [sched-local]
|
||||
|
||||
# --- воркер Yandex Market (HTTP-воркер sched, envelope) ---
|
||||
ym-client-builder:
|
||||
build:
|
||||
context: ../../../../yandex-market-partner-api-client
|
||||
dockerfile: Dockerfile
|
||||
image: sched-pipelines/ym-client-builder:local
|
||||
environment:
|
||||
PORT: "8080"
|
||||
SCHED_API_KEY: ${SCHED_API_KEY:?задайте в .env}
|
||||
UNISENDER_API_KEY: ${UNISENDER_API_KEY:-}
|
||||
UNISENDER_FROM: ${UNISENDER_FROM:-}
|
||||
NPM_TOKEN: ${NPM_TOKEN:-}
|
||||
GITHUB_TOKEN: ${GITHUB_TOKEN:-}
|
||||
volumes:
|
||||
- ./data-ym:/app/data
|
||||
ports:
|
||||
- "127.0.0.1:18090:8080"
|
||||
restart: unless-stopped
|
||||
networks: [sched-local]
|
||||
|
||||
# --- воркер Ozon Seller (HTTP-воркер sched + внутренний крон ОТКЛЮЧЁН) ---
|
||||
ozon-seller-builder:
|
||||
build:
|
||||
context: ../../../../ozon-seller-api-client
|
||||
dockerfile: C:/Users/vitya/projects/.admin/host-stacks/local/sched-pipelines/ozon.Dockerfile
|
||||
args:
|
||||
VERDACCIO_TOKEN: ${VERDACCIO_TOKEN:-}
|
||||
image: sched-pipelines/ozon-seller-builder:local
|
||||
environment:
|
||||
WORKER_PORT: "8080"
|
||||
SCHED_API_KEY: ${SCHED_API_KEY:?задайте в .env}
|
||||
# внутренний крон не нужен — расписанием рулит sched (ozon 2:00).
|
||||
# 31 февраля не наступает никогда: страховая от двойного запуска.
|
||||
CRON_SCHEDULE: "0 0 29 2 *"
|
||||
STATE_FILE: /app/data/state.json
|
||||
LOCK_FILE: /app/data/pipeline.lock
|
||||
DRY_RUN: "1"
|
||||
BROWSER_CDP_URL: http://browser:9222
|
||||
NTFY_URL: http://ntfy
|
||||
NTFY_TOPIC: ozon-seller-pipeline
|
||||
UNISENDER_API_KEY: ${UNISENDER_API_KEY:-}
|
||||
NOTIFY_EMAIL_TO: ${NOTIFY_EMAIL_TO:-}
|
||||
GH_TOKEN: ${GITHUB_TOKEN:-}
|
||||
NPM_TOKEN: ${NPM_TOKEN:-}
|
||||
volumes:
|
||||
- ozon-data:/app/data
|
||||
ports:
|
||||
- "127.0.0.1:18091:8080"
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- browser
|
||||
networks: [sched-local]
|
||||
|
||||
# --- headless Chrome + CDP (для антибот-fetch стадий ozon) ---
|
||||
browser:
|
||||
build:
|
||||
context: ../../../../ozon-seller-api-client/service/browser
|
||||
dockerfile: Dockerfile
|
||||
image: sched-pipelines/browser-cdp:local
|
||||
container_name: browser-cdp
|
||||
shm_size: "1gb"
|
||||
restart: unless-stopped
|
||||
networks: [sched-local]
|
||||
|
||||
# --- локальный ntfy (на время локального периода; VDS-ntfy требует auth-топика) ---
|
||||
ntfy:
|
||||
image: binwiederhier/ntfy:v2.11.0
|
||||
command: serve
|
||||
environment:
|
||||
NTFY_LISTEN_HTTP: ":80"
|
||||
NTFY_CACHE_FILE: /var/cache/ntfy/cache.db
|
||||
volumes:
|
||||
- ./data-ntfy:/var/cache/ntfy
|
||||
ports:
|
||||
- "127.0.0.1:8096:80"
|
||||
restart: unless-stopped
|
||||
networks: [sched-local]
|
||||
|
||||
# --- alert-bridge: sched webhook-алерты → ntfy + email (unisender go2) ---
|
||||
alert-bridge:
|
||||
build: ./bridge
|
||||
image: sched-pipelines/alert-bridge:local
|
||||
environment:
|
||||
PORT: "9090"
|
||||
NTFY_URL: http://ntfy
|
||||
NTFY_TOPIC: sched-alerts
|
||||
WEBHOOK_SECRET: ${WEBHOOK_SECRET:?задайте в .env}
|
||||
UNISENDER_API_KEY: ${UNISENDER_API_KEY:-}
|
||||
UNISENDER_FROM: ${UNISENDER_FROM:-}
|
||||
EMAIL_TO: ${NOTIFY_EMAIL_TO:-}
|
||||
ports:
|
||||
- "127.0.0.1:19090:9090"
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- ntfy
|
||||
networks: [sched-local]
|
||||
|
||||
volumes:
|
||||
sched-data:
|
||||
ozon-data:
|
||||
|
||||
networks:
|
||||
sched-local:
|
||||
driver: bridge
|
||||
Reference in New Issue
Block a user