#!/bin/bash set -euo pipefail is_worker_command() { local joined="$*" case "$joined" in *"celery -A iaai_scraper.worker.celery_app worker"*|*" celery -A iaai_scraper.worker.celery_app worker"*) return 0 ;; esac return 1 } is_scrape_cli_command() { local joined="$*" case "$joined" in *"collect-listing"*|*"scrape-vehicle"*|*"sync-vehicle"*|*"sync-listing"*) return 0 ;; esac return 1 } needs_browser_runtime() { is_worker_command "$@" || is_scrape_cli_command "$@" } start_proxy_bridge_if_needed() { if ! needs_browser_runtime "$@"; then return 0 fi if [ -z "${SOCKS5_PROXY_HOST:-}" ]; then return 0 fi echo "[entrypoint] Starting proxy bridge (HTTP :8899 → SOCKS5 ${SOCKS5_PROXY_HOST}:${SOCKS5_PROXY_PORT:-1002})..." if [ -z "${IAAI_PROXY_SERVER:-}" ]; then export IAAI_PROXY_SERVER="http://127.0.0.1:8899" elif [ "${IAAI_PROXY_SERVER}" = "http://localhost:8899" ]; then export IAAI_PROXY_SERVER="http://127.0.0.1:8899" fi echo "[entrypoint] Using browser proxy: ${IAAI_PROXY_SERVER}" # Watchdog: автоматически рестартует bridge при падении. # Нужно для долгоиграющих контейнеров (месяцы аптайма): без watchdog # упавший bridge тихо ломает весь скрапинг и IAAI начинает банить реальный IP VPS. ( while true; do python -m iaai_scraper.proxy_bridge EXIT_CODE=$? echo "[entrypoint] proxy_bridge exited with code ${EXIT_CODE}; restarting in 3s..." sleep 3 done ) & BRIDGE_WATCHDOG_PID=$! sleep 1 if ! kill -0 "${BRIDGE_WATCHDOG_PID}" 2>/dev/null; then echo "[entrypoint] ERROR: proxy_bridge watchdog failed to start" exit 1 fi # Проверяем что bridge действительно слушает порт. for i in 1 2 3 4 5; do if python -c "import socket,sys; s=socket.socket(); s.settimeout(2); sys.exit(0 if s.connect_ex(('127.0.0.1', 8899))==0 else 1)" 2>/dev/null; then echo "[entrypoint] Proxy bridge listening on :8899 (watchdog PID ${BRIDGE_WATCHDOG_PID})" return 0 fi sleep 1 done echo "[entrypoint] ERROR: proxy_bridge did not start listening on :8899" exit 1 } start_proxy_bridge_if_needed "$@" exec "$@"