📅 Juni 2026 · Letztes Update: 07.06.2026
TL;DR
Firecrawl ist eine der leistungsfähigsten Open-Source-Web-Crawling-Engines — und lässt sich mit einem einzigen docker compose up selbst hosten. Der Stack besteht aus 5 Containern (API, Playwright, Redis, RabbitMQ, PostgreSQL), läuft auf einem eigenen Server und liefert sauberes Markdown für KI-Pipelines. Keine API-Keys nötig, keine Request-Limits, keine Daten auf fremden Servern.
Stack: Firecrawl API · Playwright · Redis · RabbitMQ · PostgreSQL · Docker Compose — zum Fazit springen →
📖 Inhalt
1. Warum Firecrawl selbst hosten?
Firecrawl ist eine Web-Scraping-Engine, die Webseiten crawled, sauberes Markdown extrahiert und strukturierte Daten für KI-Anwendungen liefert. Die Cloud-Version (api.firecrawl.dev) ist komfortabel — aber sie kostet pro Request und schickt alle Daten über externe Server.
Für Projekte mit hohem Crawling-Volumen oder Datenschutz-Anforderungen lohnt sich das Self-Hosting:
- Keine API-Kosten: Nur Server-Kosten, kein Pay-per-Request
- Datensouveränität: Alle gecrawlten Inhalte bleiben auf eigener Hardware
- Keine Rate-Limits: Crawling-Geschwindigkeit selbst bestimmt
- Agent-Integration: Direkter API-Zugriff aus eigenen KI-Agenten ohne Authentifizierung
- DSGVO-konform: Keine Datenweitergabe an Dritte
💡 Hinweis: Die Self-Hosted-Variante hat keinen Zugriff auf Fire-Engine (IP-Block-Umgehung, erweiterte Bot-Erkennung). Für die meisten Anwendungsfälle reichen Fetch + Playwright aber völlig aus.
2. Anforderungen
- Docker: Alle Services laufen containerisiert
- RAM: ca. 2–3 GB für den gesamten Stack (Playwright ist der größte Verbraucher)
- Disk: ~5 GB für Images + Daten
- Netzwerk: Ausgehender Internet-Zugang zum Crawlen
- Optional: OpenAI-API-Key für KI-gestützte Extraktion (JSON-Format, /extract-Endpoint)
3. Architektur & Services
Der Self-Hosted-Stack besteht aus fünf Docker-Containern, die über ein internes Bridge-Netzwerk kommunizieren:
🔥 Firecrawl API
Port 3002 — Node.js. Die zentrale API für Scrape, Crawl, Map und Search. Verteilt Jobs via RabbitMQ an Worker.
🎭 Playwright Service
Intern — Node.js + Chromium. Rendert JavaScript-lastige Seiten. Max. 10 concurrent Pages, 2 CPUs, 4 GB RAM-Limit.
🐇 RabbitMQ
Intern — Message Broker für Job-Queuing. Verteilt Crawl-Aufträge, Healthcheck alle 5s.
📦 Redis
Intern — Alpine-basiert. Rate-Limiting und Caching. Zwei Redis-URLs können auf dieselbe Instanz zeigen.
🗄️ PostgreSQL
Intern — Custom Image (nuq-postgres). Speichert Crawl-Ergebnisse und Job-Metadaten. Nicht nach außen exponiert.
🔧 Bull Queue UI
Port 3002/admin — Dashboard zur Überwachung aktiver Jobs, Queues und Fehler.
| Container | RAM (Idle) | RAM (Last) | Port |
|---|---|---|---|
| fc-api-1 (API) | ~300 MB | ~1 GB | 3002 → Host |
| fc-playwright-service-1 | ~400 MB | ~2 GB | intern |
| fc-rabbitmq-1 | ~150 MB | ~300 MB | intern |
| fc-redis-1 | ~10 MB | ~50 MB | intern |
| fc-nuq-postgres-1 | ~50 MB | ~200 MB | intern |
| Gesamt | ~900 MB | ~3,5 GB |
💡 Port-Strategie: Nur der API-Container exponiert Port 3002. Alle anderen Dienste (Playwright, Redis, RabbitMQ, PostgreSQL) kommunizieren ausschließlich über das interne Docker-Netzwerk. Das reduziert die Angriffsfläche erheblich.
4. Setup: Docker Compose
4.1 Repository klonen
git clone https://github.com/firecrawl/firecrawl.git
cd firecrawl
4.2 .env konfigurieren
Die minimale Konfiguration für den Self-Hosted-Betrieb:
# ===== Required =====
PORT=3002
HOST=0.0.0.0
# ===== AI Features (optional) =====
# OPENAI_API_KEY=... # Für JSON-Extraktion
# OPENAI_BASE_URL=... # OpenAI-kompatible API
# ===== Queue Admin UI =====
BULL_AUTH_KEY=dein-sicheres-passwort
# ===== PostgreSQL =====
POSTGRES_USER=postgres
POSTGRES_PASSWORD=dein-db-passwort
POSTGRES_DB=postgres
# ===== Performance =====
CRAWL_CONCURRENT_REQUESTS=10
NUM_WORKERS_PER_QUEUE=8
BROWSER_POOL_SIZE=5
⚠️ Achtung: BULL_AUTH_KEY schützt das Queue-Admin-Panel. Ohne Änderung ist es unter /admin/CHANGEME/queues öffentlich erreichbar — sofort ändern!
4.3 docker-compose.yaml (Kernstruktur)
Die offizielle Compose-Datei definiert die fünf Services. Die wichtigsten Ausschnitte:
# docker-compose.yaml (Auszug)
services:
api:
build: apps/api
restart: unless-stopped
ports:
- "${PORT:-3002}:${INTERNAL_PORT:-3002}"
environment:
REDIS_URL: redis://redis:6379
REDIS_RATE_LIMIT_URL: redis://redis:6379
PLAYWRIGHT_MICROSERVICE_URL: http://playwright-service:3000/scrape
NUQ_RABBITMQ_URL: amqp://rabbitmq:5672
ENV: local
depends_on:
- redis
- playwright-service
rabbitmq:
condition: service_healthy
cpus: 4.0
mem_limit: 8G
playwright-service:
build: apps/playwright-service-ts
restart: unless-stopped
cpus: 2.0
mem_limit: 4G
redis:
image: redis:alpine
restart: unless-stopped
rabbitmq:
image: rabbitmq:3-management
restart: unless-stopped
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "-q", "check_running"]
interval: 5s
nuq-postgres:
build: apps/nuq-postgres
restart: unless-stopped
4.4 Build & Start
# Images bauen (beim ersten Mal, dauert einige Minuten)
docker compose build
# Stack starten
docker compose up -d
# Prüfen ob alles läuft
docker compose ps
# Erwartet: 5 Container mit Status "Up"
4.5 Test ob die API funktioniert
# Einfacher Scrape-Test
curl -s http://localhost:3002/v1/scrape \
-H 'Content-Type: application/json' \
-d '{"url": "https://example.com"}' | python3 -m json.tool
# Crawl-Test (folgt allen Links auf einer Seite)
curl -X POST http://localhost:3002/v1/crawl \
-H 'Content-Type: application/json' \
-d '{"url": "https://firecrawl.dev"}'
5. API & Integration
5.1 Wichtigste Endpoints
| Endpoint | Beschreibung |
|---|---|
POST /v1/scrape | Einzelne URL scrapen → Markdown |
POST /v1/crawl | Rekursiv crawlen, alle verlinkten Seiten |
POST /v1/map | URL-Struktur einer Domain erkennen |
POST /v1/search | Web-Suche (Google oder SearXNG) |
POST /v1/extract | Strukturierte Daten per KI extrahieren |
/admin/{key}/queues | Bull Queue Dashboard |
5.2 Agent-Integration
In meiner eigenen Umgebung wird die Firecrawl-Instanz direkt von KI-Agenten genutzt — für tägliche News-Recherche, Blog-Recherche und Web-Scraping. Da die API lokal läuft, ist keine Authentifizierung nötig:
# Direkter API-Call von einem Agenten
# Kein API-Key, kein Account — die Instanz ist im lokalen Netzwerk
response = requests.post(
"http://localhost:3002/v1/scrape",
json={
"url": "https://blog.example.com/article",
"formats": ["markdown"]
}
)
markdown_content = response.json()["data"]["markdown"]
# Das Markdown kann direkt in LLM-Kontexte (RAG) fließen
llm_context = f"Webseiten-Inhalt:\n{markdown_content}"
💡 Integrationstipp: Über eine zentrale LLM-Gateway-Instanz (z. B. LiteLLM) lässt sich der Firecrawl-Endpoint als Proxy-Tool registrieren. Agenten können dann /v1/search aufrufen, um das Web zu durchsuchen, ohne dass ein separater Search-API-Key nötig ist.
5.3 Crawl-Parameter (wichtigste)
{
"url": "https://zielseite.de",
"limit": 50, // Max. Seiten pro Crawl
"maxDepth": 3, // Kriechtiefe
"includePaths": ["/blog/*", "/docs/*"],
"excludePaths": ["/admin/*"],
"scrapeOptions": {
"formats": ["markdown"],
"onlyMainContent": true,
"waitFor": 2000 // ms auf JS-Rendering warten
}
}
6. Betrieb & Lessons Learned
Was gut läuft
- Docker Compose ist narrensicher:
docker compose up -dund 5 Container starten.restart: unless-stoppedsorgt dafür, dass nach Server-Reboots alles automatisch wieder hochkommt. - Markdown-Output ist Gold wert: Im Gegensatz zu rohem HTML kann das Markdown direkt in KI-Pipelines verwendet werden — ohne Nachbearbeitung.
- Playwright-Service ist isoliert: Der Browser läuft im eigenen Container mit CPU-/RAM-Limits. Wenn eine Seite den Renderer crasht, ist nur der Playwright-Container betroffen, nicht die ganze API.
- RabbitMQ-Healthcheck: Der automatische Healthcheck sorgt dafür, dass der API-Container erst startet, wenn RabbitMQ bereit ist — keine Race Conditions beim Boot.
Lessons Learned
- Build dauert beim ersten Mal: Die Container werden aus Source gebaut (nicht pre-built Images). Der erste
docker compose builddauert 10–15 Minuten. Danach sind inkrementelle Builds schnell. - RAM ist der limitierende Faktor: Der Playwright-Container braucht mit 10 concurrent Pages und JavaScript-Rendering schnell 2 GB+. Auf Servern mit <4 GB RAM die
CRAWL_CONCURRENT_REQUESTSauf 3–5 reduzieren. - PostgreSQL nicht nach außen exponieren: Die Compose-Datei exponiert PostgreSQL nicht — das ist Absicht. Für DB-Zugriff:
docker exec -it fc-nuq-postgres-1 psql -U postgresnutzen. - Log-Dateien wachsen: Die Compose-Datei hat Log-Rotation konfiguriert (max 10 MB pro File, 3 Files). Ohne das würden die Logs die Platte füllen — prüfen ob die Limits zum eigenen Crawling-Volumen passen.
- Fire-Engine fehlt: Die Self-Hosted-Version hat keinen Zugriff auf Fire-Engine (IP-Block-Umgehung). Seiten mit aggressivem Bot-Schutz können mit einfachem Fetch scheitern. Playwright hilft in vielen Fällen, aber nicht immer.
Monitoring
Das Bull Queue Dashboard (http://localhost:3002/admin/{key}/queues) ist das wichtigste Monitoring-Tool. Es zeigt:
- Aktive, wartende und fehlgeschlagene Jobs
- Durchsatz pro Queue
- Fehlerdetails pro Job
Für Server-Monitoring empfiehlt sich ein Prometheus + Grafana-Stack, der CPU-, RAM- und Disk-Metriken aller fünf Container trackt.
7. Fazit & Ausblick
✅ Das funktioniert
- 5 Docker-Container, ein
docker compose up - Sauberes Markdown, direkt LLM-tauglich
- Keine API-Keys nötig im lokalen Netzwerk
- DSGVO-konform, alle Daten auf eigener Hardware
- Agent-Integration ohne Vendor-Lock-in
🔜 Geplant
- SearXNG als Search-Backend statt Google
- LLM-Gateway-Integration für /extract
- Prometheus-Metriken für Crawl-Statistiken
- Pre-built Images statt Source-Build
Firecrawl Self-Hosted ist die ideale Lösung für alle, die eine leistungsfähige Web-Crawling-Engine unter eigener Kontrolle betreiben wollen. Der initiale Setup-Aufwand ist mit Docker Compose überschaubar, der Betrieb läuft stabil, und die Integration in KI-Agenten-Pipelines ist denkbar einfach: lokaler Endpoint, kein Auth, Markdown-Output.
Für Teams und Einzelentwickler, die regelmäßig Web-Inhalte für KI-Anwendungen benötigen, ist das Self-Hosting die klare Alternative zur Cloud-API — Kostenkontrolle, Datensouveränität und keine Limits sind die drei schlagenden Argumente.
🤖 KI-Agenten-Integration
Diese Instanz ist das Crawling-Backend meiner Agent-Factory. Agenten nutzen /v1/scrape für gezielte Seitenabrufe und /v1/search für Web-Recherchen. Das gewonnene Markdown fließt direkt in LLM-Kontexte — ein nahtloser Stack von Crawl bis Inference.
📝 Eigenständiger Beitrag zur vollen KI-Integration in Vorbereitung
Disclaimer: Persönliches Projekt. Dieser Artikel dokumentiert meine eigene Self-Hosted-Instanz. Keine Affiliate-Links, kein Sponsoring. Firecrawl ist Open Source (AGPL-3.0) und wurde nach technischen Kriterien ausgewählt.