--- type: howto title: "Self-host Firecrawl with Docker Compose and wire it to Claude Code / agents" summary: "Steps to run open-source Firecrawl via Docker Compose, the env vars that matter, how to point the firecrawl MCP server (and any REST client) at the self-hosted endpoint, and the security posture required since self-host has no auth." tags: - type/howto - tool/firecrawl - tool/docker - domain/web-scraping scope: global last_updated: 2026-07-08 --- # Self-Hosting Firecrawl (Docker Compose) Prereqs: Docker + Compose, 4 GB RAM headroom (2 GB absolute floor), a few GB disk for images. See [[firecrawl-self-hosted-capabilities]] for what you get/don't get. ## Install ```bash git clone https://github.com/firecrawl/firecrawl.git cd firecrawl cp apps/api/.env.example .env # check SELF_HOST.md for current layout docker compose build && docker compose up -d # API serves on http://localhost:3002 ``` Follow the current [SELF_HOST.md](https://github.com/firecrawl/firecrawl/blob/main/SELF_HOST.md) — the v1.5.0 self-host overhaul reworked the compose file and added a production-ready image; details drift. ## Env vars that matter | Var | Why | |---|---| | `PORT` / `HOST` | Default 3002 / 0.0.0.0 | | `OPENAI_API_KEY` | Only needed for `/extract` / JSON LLM extraction; OpenAI-compatible endpoints and Ollama work | | `BULL_AUTH_KEY` | Secures the otherwise-open Bull queue admin UI — always set | | `POSTGRES_USER/PASSWORD/DB` | Change from dev defaults | | `PROXY_SERVER`, `PROXY_USERNAME`, `PROXY_PASSWORD` + `stealthProxy` | Bring-your-own proxies (no built-in pool self-hosted) | | `MAX_CPU`, `MAX_RAM` | Reject new jobs under load | | SearXNG endpoint | Only if you want `/search` | ## Security posture (critical) Self-host has **no working auth** (Supabase auth is cloud-only; the "Supabase client not configured" warning means auth is bypassed). Therefore: - Bind to LAN/Tailscale/Docker-internal networks only — never the public internet. - On a public VPS behind Traefik: do NOT give it a public router; keep it on an internal Docker network only, or add reverse-proxy basic-auth/forward-auth if a route is unavoidable. ## Smoke test ```bash curl -s -X POST http://localhost:3002/v1/scrape \ -H 'Content-Type: application/json' \ -d '{"url":"https://example.com","formats":["markdown"]}' ``` ## Wiring to Claude Code / agents — CLI + skill (preferred over MCP) The official CLI (`npm i -g firecrawl-cli`, repo github.com/firecrawl/cli) supports self-host cleanly and avoids the ~10–20k-token MCP schema tax: - `export FIRECRAWL_API_URL=http://:3002` (or `--api-url`) — when the URL isn't `https://api.firecrawl.dev`, **auth is automatically skipped**; no key or placeholder needed. - Commands: `scrape`, `search`, `map`, `crawl`, `agent`, `interact`, `monitor`. - Official Claude Code integration: `firecrawl/firecrawl-claude-plugin` (install via `/plugin`, search "firecrawl") wraps the CLI as skills — it inherits `FIRECRAWL_API_URL`, so it works self-hosted. Requires the CLI installed on the host machine. `firecrawl/skills` is a separate repo for embedding Firecrawl in application code. - Sensible routing: Firecrawl first, WebFetch as fallback when Firecrawl fails or isn't needed. ## Wiring via MCP (heavier alternative) ```bash claude mcp add firecrawl \ -e FIRECRAWL_API_URL=http://:3002 \ -e FIRECRAWL_API_KEY=self-hosted-placeholder \ -- npx -y firecrawl-mcp ``` - `FIRECRAWL_API_KEY` must be a non-empty placeholder even for self-host — the MCP server errors without it ([mcp-server#126](https://github.com/firecrawl/firecrawl-mcp-server/issues/126)); the self-hosted API doesn't validate it. - MCP schema costs ~10–20k tokens/session — add the server per-project where scraping is actually used, not globally. - Any non-MCP agent (e.g. Hermes) can hit the REST API directly (`POST /v1/scrape`, `/v1/crawl`) — same surface as cloud, so official SDKs work by overriding the API URL. ## Ops notes - Update: `git pull && docker compose build && docker compose up -d` (watch the v1.x release notes; compose layout has changed before). - Keep WebFetch as the default for simple static pages; route JS-heavy pages, crawls, and structured extraction to Firecrawl. ## Related - [[firecrawl-self-hosted-capabilities]] — feature parity and value assessment