diff options
| author | Adam Malczewski <[email protected]> | 2026-04-27 23:05:19 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-04-27 23:05:19 +0900 |
| commit | c7d5395ddc4f818d1faf0c59bd7c87d4ffd67a12 (patch) | |
| tree | 695fcbd4c84b18c6eb14f950bc47b11be6828f30 /docker-compose.yml | |
| download | firecrawl-dokploy-c7d5395ddc4f818d1faf0c59bd7c87d4ffd67a12.tar.gz firecrawl-dokploy-c7d5395ddc4f818d1faf0c59bd7c87d4ffd67a12.zip | |
init
Diffstat (limited to 'docker-compose.yml')
| -rw-r--r-- | docker-compose.yml | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a59d779 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,165 @@ +name: firecrawl + +services: + # ============================================================ + # SearXNG — metasearch engine (powers Firecrawl's /search API) + # ============================================================ + searxng: + image: docker.io/searxng/searxng:latest + networks: + - backend + - dokploy-network + volumes: + - ./searxng:/etc/searxng:rw + - searxng-cache:/var/cache/searxng:rw + environment: + - SEARXNG_BASE_URL=https://${SEARXNG_DOMAIN:-searxng.localhost}/ + cap_drop: + - ALL + cap_add: + - CHOWN + - SETGID + - SETUID + - DAC_OVERRIDE + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "1" + restart: unless-stopped + # Uncomment labels below if you want SearXNG accessible via its own domain. + # Otherwise it's only reachable internally by Firecrawl. + # labels: + # - "traefik.enable=true" + # - "traefik.http.routers.searxng.rule=Host(`${SEARXNG_DOMAIN}`)" + # - "traefik.http.routers.searxng.entrypoints=websecure" + # - "traefik.http.routers.searxng.tls.certResolver=letsencrypt" + # - "traefik.http.services.searxng.loadbalancer.server.port=8080" + + # ============================================================ + # Playwright — headless browser for JS-rendered pages + # ============================================================ + playwright-service: + image: ghcr.io/firecrawl/playwright-service:latest + networks: + - backend + - dokploy-network + environment: + PORT: 3000 + PROXY_SERVER: ${PROXY_SERVER:-} + PROXY_USERNAME: ${PROXY_USERNAME:-} + PROXY_PASSWORD: ${PROXY_PASSWORD:-} + BLOCK_MEDIA: ${BLOCK_MEDIA:-} + ALLOW_LOCAL_WEBHOOKS: ${ALLOW_LOCAL_WEBHOOKS:-} + MAX_CONCURRENT_PAGES: ${MAX_CONCURRENT_PAGES:-10} + cpus: 2.0 + mem_limit: 4G + memswap_limit: 4G + tmpfs: + - /tmp/.cache:noexec,nosuid,size=1g + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + compress: "true" + restart: unless-stopped + + # ============================================================ + # Firecrawl API — scrape, crawl, search, map + # ============================================================ + api: + image: ghcr.io/firecrawl/firecrawl + networks: + - backend + - dokploy-network + extra_hosts: + - "host.docker.internal:host-gateway" + environment: + # === Required === + PORT: ${PORT:-3002} + INTERNAL_PORT: ${INTERNAL_PORT:-3002} + HOST: 0.0.0.0 + NUM_WORKERS_PER_QUEUE: ${NUM_WORKERS_PER_QUEUE:-8} + REDIS_URL: redis://redis:6379 + REDIS_RATE_LIMIT_URL: redis://redis:6379 + PLAYWRIGHT_MICROSERVICE_URL: http://playwright-service:3000/scrape + USE_DB_AUTHENTICATION: ${USE_DB_AUTHENTICATION:-false} + # === SearXNG (internal, same compose network) === + SEARXNG_ENDPOINT: http://searxng:8080 + SEARXNG_ENGINES: ${SEARXNG_ENGINES:-} + SEARXNG_CATEGORIES: ${SEARXNG_CATEGORIES:-} + # === Optional: Auth === + TEST_API_KEY: ${TEST_API_KEY:-} + BULL_AUTH_KEY: ${BULL_AUTH_KEY:-CHANGEME} + # === Optional: AI Features === + OPENAI_API_KEY: ${OPENAI_API_KEY:-} + OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-} + MODEL_NAME: ${MODEL_NAME:-} + # === Optional: Proxy === + PROXY_SERVER: ${PROXY_SERVER:-} + PROXY_USERNAME: ${PROXY_USERNAME:-} + PROXY_PASSWORD: ${PROXY_PASSWORD:-} + ports: + - ${PORT:-3002} + ulimits: + nofile: + soft: 65535 + hard: 65535 + cpus: 4.0 + mem_limit: 8G + memswap_limit: 8G + command: node dist/src/harness.js --start-docker + depends_on: + redis: + condition: service_healthy + playwright-service: + condition: service_started + searxng: + condition: service_started + labels: + - "traefik.enable=true" + - "traefik.http.routers.firecrawl-api.rule=Host(`${FIRECRAWL_DOMAIN}`)" + - "traefik.http.routers.firecrawl-api.entrypoints=websecure" + - "traefik.http.routers.firecrawl-api.tls.certResolver=letsencrypt" + - "traefik.http.services.firecrawl-api.loadbalancer.server.port=${PORT:-3002}" + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + compress: "true" + restart: unless-stopped + + # ============================================================ + # Redis — queues, rate limiting, caching + # ============================================================ + redis: + image: redis:alpine + networks: + - backend + command: redis-server --bind 0.0.0.0 + volumes: + - redis-data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + logging: + driver: "json-file" + options: + max-size: "5m" + max-file: "2" + compress: "true" + restart: unless-stopped + +networks: + backend: + driver: bridge + dokploy-network: + external: true + +volumes: + redis-data: + searxng-cache: |
