summaryrefslogtreecommitdiffhomepage
path: root/docker-compose.yml
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-04-27 23:05:19 +0900
committerAdam Malczewski <[email protected]>2026-04-27 23:05:19 +0900
commitc7d5395ddc4f818d1faf0c59bd7c87d4ffd67a12 (patch)
tree695fcbd4c84b18c6eb14f950bc47b11be6828f30 /docker-compose.yml
downloadfirecrawl-dokploy-c7d5395ddc4f818d1faf0c59bd7c87d4ffd67a12.tar.gz
firecrawl-dokploy-c7d5395ddc4f818d1faf0c59bd7c87d4ffd67a12.zip
init
Diffstat (limited to 'docker-compose.yml')
-rw-r--r--docker-compose.yml165
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: