services: crawl-manager: build: context: . dockerfile: Dockerfile container_name: crawl-manager restart: always env_file: - .env.production stdin_open: true tty: true depends_on: crawl-manager-db: condition: service_healthy volumes: - ./data/app:/app/data labels: - traefik.enable=true # 관리자 라우터 - traefik.http.routers.crawl-admin.rule=Host(`admin.startover.co.kr`) - traefik.http.routers.crawl-admin.entrypoints=websecure,web - traefik.http.routers.crawl-admin.tls=true - traefik.http.routers.crawl-admin.tls.certresolver=letsencrypt - traefik.http.routers.crawl-admin.service=crawl-manager-svc # 서브도메인 라우터 (*.startover.co.kr → 크롤링 데이터 서빙) — Traefik v3 정규식 - traefik.http.routers.crawl-sub.rule=HostRegexp(`^[a-z0-9-]+\.startover\.co\.kr$`) && !Host(`admin.startover.co.kr`) - traefik.http.routers.crawl-sub.entrypoints=websecure,web - traefik.http.routers.crawl-sub.tls=true - traefik.http.routers.crawl-sub.tls.certresolver=letsencrypt - traefik.http.routers.crawl-sub.service=crawl-manager-svc - traefik.http.routers.crawl-sub.priority=1 # 서비스 - traefik.http.services.crawl-manager-svc.loadbalancer.server.port=3000 crawl-manager-db: image: postgres:16-alpine container_name: crawl-manager-db restart: always env_file: - .env.production volumes: - ./data/postgres:/var/lib/postgresql/data - ./src/migrations/init.sql:/docker-entrypoint-initdb.d/01-init.sql ports: - "11137:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U crawler -d crawler"] interval: 10s timeout: 5s retries: 5 networks: default: name: repo_default external: true