프로덕션 배포 토대. headless Chrome 은 Akamai/Cloudflare Turnstile 에 탐지됨(실측 실패) → 컨테이너에선 Xvfb(가상 디스플레이)로 headful Chromium 을 실행한다. - Dockerfile.worker: chromium+xvfb+xauth+한글폰트. Xvfb 를 백그라운드로 띄우고 python 을 exec 승계(로그가 docker logs 로 나옴; xvfb-run 은 stdout 을 삼킴). root=--no-sandbox 필수. - Dockerfile: API 전용(lean, 브라우저 불필요)임을 명시. - docker-compose: lps-api(:9600) + lps-worker(shm 1g, DB=host.docker.internal) 서비스 추가. - browser_base: 브라우저 실행 대상 env 화(LPS_CHROME_EXECUTABLE/CHANNEL). 컨테이너=시스템 chromium(+no-sandbox/disable-dev-shm-usage), 로컬=실제 Chrome(channel=chrome). 검증(컨테이너): DB연결·프리플라이트·쿠팡(Akamai)·gmarket(Turnstile) 웜업 통과 → end-to-end 검색 DONE(8몰: 네이버·쿠팡·G마켓·옥션·11번가, 비용 $0.016). docker logs 로 로그 확인. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
30 lines
1.4 KiB
Docker
30 lines
1.4 KiB
Docker
# 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"]
|