services: api: build: context: . target: api environment: SCHEDULE_LINK: ${SCHEDULE_LINK} SCHEDULE_INTERVAL_MINUTES: ${SCHEDULE_INTERVAL_MINUTES:-15} SCHEDULE_CACHE_TTL: ${SCHEDULE_CACHE_TTL:-900} SCHEDULE_RETRY_AFTER: ${SCHEDULE_RETRY_AFTER:-60} # админка: пусто = выключена (страница и /api/admin/* не появятся) ADMIN_PATH: ${ADMIN_PATH:-} ADMIN_LOGIN: ${ADMIN_LOGIN:-} ADMIN_PASSWORD: ${ADMIN_PASSWORD:-} ADMIN_MAX_ATTEMPTS: ${ADMIN_MAX_ATTEMPTS:-3} ADMIN_LOCKOUT_MINUTES: ${ADMIN_LOCKOUT_MINUTES:-15} # настройки админки (ссылка, интервал, история входов) живут в томе SETTINGS_FILE: ${SETTINGS_FILE:-/data/settings.json} volumes: - schedule_data:/data ports: # api нужен только фронтенду внутри docker-сети; наружу — 127.0.0.1 для отладки - "127.0.0.1:${API_PORT:-8000}:8000" restart: unless-stopped healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/healthz', timeout=5)"] interval: 30s timeout: 5s retries: 3 start_period: 10s frontend: build: context: . target: frontend environment: # внутри compose api доступен по имени сервиса; менять не нужно SCHEDULE_API: ${SCHEDULE_API:-http://api:8000} # страница админки отдаётся фронтендом по этому пути ADMIN_PATH: ${ADMIN_PATH:-} ports: # фронт обслуживает nginx; наружу напрямую не смотрит - "127.0.0.1:${FRONTEND_PORT:-8080}:8080" restart: unless-stopped depends_on: api: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/healthz', timeout=5)"] interval: 30s timeout: 5s retries: 3 start_period: 10s volumes: schedule_data: