services: app: build: context: . dockerfile: Dockerfile restart: unless-stopped ports: - "${APP_PORT:-3000}:3000" environment: DASHBOARD_HOST: 0.0.0.0 DASHBOARD_PORT: 3000 DASHBOARD_DB: ${DASHBOARD_DB:-mysql} DASHBOARD_POLL_INTERVAL_SEC: ${DASHBOARD_POLL_INTERVAL_SEC:-60} MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_USER: ${MYSQL_USER:-airwatcher} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-airwatcher} MYSQL_DATABASE: ${MYSQL_DATABASE:-airwatcher} OPENAI_API_KEY: ${OPENAI_API_KEY:-} OPENAI_MODEL: ${OPENAI_MODEL:-gpt-4.1-mini} CRAWLER_ENDPOINT: ${CRAWLER_ENDPOINT:-} CRAWLER_PROVIDERS: ${CRAWLER_PROVIDERS:-} CRAWLER_ENDPOINT_SKYSCANNER: ${CRAWLER_ENDPOINT_SKYSCANNER:-} CRAWLER_ENDPOINT_NAVER: ${CRAWLER_ENDPOINT_NAVER:-} CRAWLER_ENDPOINT_GOOGLE: ${CRAWLER_ENDPOINT_GOOGLE:-} CRAWLER_ROUTING_STRATEGY: ${CRAWLER_ROUTING_STRATEGY:-priorityFallback} CRAWLER_REQUEST_TIMEOUT_MS: ${CRAWLER_REQUEST_TIMEOUT_MS:-15000} CRAWLER_MAX_ATTEMPTS: ${CRAWLER_MAX_ATTEMPTS:-2} CRAWLER_RETRY_BASE_DELAY_MS: ${CRAWLER_RETRY_BASE_DELAY_MS:-300} CRAWLER_RETRY_MAX_DELAY_MS: ${CRAWLER_RETRY_MAX_DELAY_MS:-3000} NOTIFY_CHANNEL: ${NOTIFY_CHANNEL:-console} TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-} TELEGRAM_CHAT_ID: ${TELEGRAM_CHAT_ID:-} TELEGRAM_API_BASE: ${TELEGRAM_API_BASE:-https://api.telegram.org} NOTIFY_WEBHOOK_URL: ${NOTIFY_WEBHOOK_URL:-} depends_on: mysql: condition: service_healthy mysql: image: mysql:8.4 restart: unless-stopped command: --default-authentication-plugin=mysql_native_password ports: - "${MYSQL_PORT_HOST:-3306}:3306" environment: MYSQL_DATABASE: ${MYSQL_DATABASE:-airwatcher} MYSQL_USER: ${MYSQL_USER:-airwatcher} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-airwatcher} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} healthcheck: test: - CMD-SHELL - mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD || exit 1 interval: 5s timeout: 3s retries: 20 volumes: - mysql_data:/var/lib/mysql volumes: mysql_data: