# LPS 워커 이미지 — 크롤용 **헤드풀 Chromium + 가상 디스플레이(Xvfb)**. # headless Chrome 은 Akamai(쿠팡)·Cloudflare Turnstile(G마켓/옥션)에 탐지돼 통과 못 함(실측 확인). # → 컨테이너에선 Xvfb(가상 프레임버퍼)로 headful Chromium 을 실행한다. # # 빌드/실행: # docker compose build lps-worker && docker compose up -d lps-worker # 스텔스 참고: 로컬 Mac 은 실제 Chrome(channel=chrome), 컨테이너는 시스템 chromium(executable_path). # 프로덕션에서 stealth 가 부족하면 amd64 이미지에 google-chrome-stable 설치 후 LPS_CHROME_CHANNEL=chrome 로 전환. FROM python:3.12-slim # chromium(런타임 의존성 apt 가 자동 해결) + Xvfb + 한글 폰트 RUN apt-get update && apt-get install -y --no-install-recommends \ chromium xvfb xauth fonts-nanum ca-certificates \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV APP_ENV=local \ PYTHONUNBUFFERED=1 \ LPS_CHROME_EXECUTABLE=/usr/bin/chromium \ DISPLAY=:99 # Xvfb(가상 디스플레이)를 백그라운드로 띄우고 python 을 exec 로 승계 실행. # → 헤드풀 Chromium 이 :99 에 뜨고, 워커 로그는 그대로 docker logs 로 나온다(xvfb-run 은 로그를 삼킴). CMD ["bash", "-c", "Xvfb :99 -screen 0 1920x1080x24 -nolisten tcp >/dev/null 2>&1 & sleep 1; exec python worker_main.py"]