playwright / docker-compose.yml
cv3inx's picture
Fix tmpfs perms β€” own /tmp and /app/runs as UID 1000
5ad73b1
Raw
History Blame Contribute Delete
2.31 kB
services:
# ---------- Self-hosted Turnstile/CF solver (no third-party API) ----------
turnstile-solver:
build: ./solver
container_name: turnstile-solver
restart: unless-stopped
environment:
PORT: 9988
MAX_WORKERS: ${SOLVER_WORKERS:-8}
CAMOUFOX_HEADLESS: virtual
# Solver does not need to be exposed to the host β€” playwright-api reaches
# it over the internal Docker network. Uncomment the ports stanza below
# if you want to test it directly.
# ports:
# - "9988:9988"
shm_size: "1gb"
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://localhost:9988/health > /dev/null || exit 1"]
interval: 30s
timeout: 5s
retries: 5
start_period: 60s
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
networks:
- internal
# ---------- Playwright execution API ----------
playwright-api:
build: .
container_name: playwright-api
restart: unless-stopped
depends_on:
turnstile-solver:
condition: service_healthy
ports:
- "${HOST_PORT:-7860}:7860"
environment:
PORT: 7860
TIMEOUT_MS: ${TIMEOUT_MS:-1800000}
# Wired to the bundled solver β€” no external URL, no API key.
TURNSTILE_SOLVER_URL: http://turnstile-solver:9988
WHISPER_MODEL: ${WHISPER_MODEL:-Xenova/whisper-tiny.en}
COOKIES_DIR: /app/cookies
shm_size: "2gb"
ipc: host
deploy:
resources:
limits:
cpus: "${CPU_LIMIT:-4.0}"
memory: "${MEM_LIMIT:-8g}"
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://localhost:7860/health > /dev/null || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
# tmpfs mounts default to root:root,755 which the UID-1000 container user
# can't write to. Pin uid/gid to 1000 and 0700 so /app/runs is writable.
tmpfs:
- /tmp:size=2g,exec,uid=1000,gid=1000,mode=1777
- /app/runs:size=512m,exec,uid=1000,gid=1000,mode=0700
volumes:
- playwright-cookies:/app/cookies
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
networks:
- internal
networks:
internal:
driver: bridge
volumes:
playwright-cookies: