SSD Nodes Learn 🎉 VPS ab $5.50/Monat
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-08-07

Firecrawl-Alternativen für den eigenen VPS im Vergleich

Draco, Hound und Firecrawl im Eigenbetrieb: RAM-Bedarf, Headless-Browser, API-Kompatibilität, Installation mit fester Version und MCP-Anbindung im Vergleich.

Was eine selbst gehostete Firecrawl-Alternative leisten muss

Eine selbst gehostete Firecrawl-Alternative hat eine Aufgabe: Sie nimmt eine URL entgegen und gibt die Seite als sauberes Markdown zurück, das ein Agent lesen kann. Bei den gehosteten APIs wird pro Seite abgerechnet. Die Kosten steigen also mit der Neugier Ihres Agents. Ein VPS, den Sie bereits bezahlen, kann dieselbe Arbeit übernehmen. Die Projekte unterscheiden sich bei einer zentralen Frage: Muss auf Ihrem System ein Headless-Browser starten, also eine echte Browser-Engine ohne Fenster?

Diese Entscheidung bestimmt den Speicherbedarf, die Kosten pro Seite und welche Seiten leer zurückgegeben werden. Dieser Leitfaden vergleicht Draco, Hound und die selbst gehostete Firecrawl-Version, installiert die leichteste Variante in einer festgelegten Version und bindet sie über MCP (model context protocol) an einen Agenten an.

Die vier Projekte und was sie tatsächlich sind

Draco ist eine einzelne, in Rust geschriebene Binärdatei unter der MIT- oder Apache-2.0-Lizenz. Release v0.20.5 wurde am 16. Juli 2026 veröffentlicht. draco scrape <url> gibt Markdown auf stdout aus. draco serve startet einen Daemon, der auf 127.0.0.1:3002 antwortet, dem von Firecrawl verwendeten Port. Es gibt kein Container-Image und startet keinen Browser.

Firecrawl self-hosted ist die Engine hinter dem gehosteten Produkt und steht unter der AGPL-3.0-Lizenz. Die docker-compose.yaml definiert sieben Services: playwright-service, api, redis, rabbitmq, nuq-postgres, foundationdb und foundationdb-init. Sie erhalten die echte Crawl-Warteschlange, müssen dafür aber ein kleines verteiltes System betreiben.

Hound befindet sich im Repository master-fetch und wird als hound-mcp auf PyPI veröffentlicht. Es steht unter der MIT-Lizenz und hatte am 3. August 2026 die Version 13.0.1. Es benötigt Python 3.11 oder neuer. Es ist in erster Linie ein MCP-Server und erst in zweiter Linie ein Fetcher: Zunächst versucht es plain HTTP. Erst wenn der Abruf dadurch blockiert wird, startet es einen Patchright-Browser.

Trawl wird hier behandelt, weil man beim Suchen nach den anderen Projekten darauf stößt und es eine andere Aufgabe erfüllt. Es löst JavaScript-Herausforderungen und CAPTCHAs mit einem per Fingerprint-Patch modifizierten Firefox als Ersatz für FlareSolverr in einem *arr-Medien-Stack. Es ist kein Markdown-Extractor. Der folgende Abschnitt zur angemessenen Nutzung erklärt, warum diese Unterscheidung darüber entscheidet, ob es überhaupt in Ihren Agent-Stack gehört.

Warum der Browser-Pool kleine VPS-Server ausbremst

Jeder geöffnete Browser-Tab ist ein eigener Renderer-Prozess mit einem eigenen DOM (Document Object Model) und einem eigenen JavaScript-Heap. Der Speicherbedarf steigt daher mit der Anzahl der gleichzeitig geöffneten Seiten, nicht mit der Anzahl der pro Tag abgerufenen Seiten. Zwei dieser Projekte legen diesen Bedarf in ihren eigenen Compose-Dateien fest.

ChartMemory ceilings each project sets in its own compose file (GB)
The data behind this chart
[
  {
    "label": "Firecrawl api",
    "memory_limit_gb": 8
  },
  {
    "label": "Firecrawl playwright",
    "memory_limit_gb": 4
  },
  {
    "label": "Hound (browser included)",
    "memory_limit_gb": 3
  }
]

Die Compose-Datei von Firecrawl begrenzt den Speicher des Containers api auf 8 GB und den des Containers Playwright auf 4 GB, jeweils mit passenden Swap-Limits. Die Compose-Datei von Hound setzt für einen Container, der ein gebündeltes Chromium enthält, 3 GB fest. Das sind von den Projekten gewählte Obergrenzen und veröffentlichte Werte, keine Messungen eines unbelasteten Systems. Redis, RabbitMQ, PostgreSQL und FoundationDB benötigen zusätzlich ihren Anteil an den für Firecrawl genannten Ressourcen.

Eine Obergrenze oberhalb des tatsächlich verfügbaren RAM bewirkt nichts. Wenn der Server keinen Speicher mehr hat, beendet der Out-of-Memory-Killer des Kernels einen Prozess. Dadurch verschwindet ein Container aus docker compose ps, ohne dass ein Fehler in das Anwendungslog geschrieben wird. Lesen Sie dmesg -T | tail nach jedem Neustart, den Sie sich nicht erklären können. Planen Sie 8 GB für den vollständigen Firecrawl-Stack ein und betrachten Sie 4 GB als Mindestgröße für einen Testserver. Wie Sie die Werte pro Dienst festlegen, wird unter Speicherlimits in Docker Compose beschrieben.

Ein weiteres Browserdetail kostet häufig einen ganzen Abend. Docker stellt einem Container unter /dev/shm 64 MB Shared Memory bereit. Chromium legt dort Renderer-Puffer ab und stürzt daher bei umfangreichen Seiten ab. Beide Browser-Stacks erhöhen diesen Wert: Die Compose-Datei von Hound enthält shm_size: "1gb". Übernehmen Sie diese Zeile in jedes Image, das Sie auf Basis von Playwright erstellen.

Extraktionsqualität auf JavaScript-lastigen Seiten

Bei statischem HTML, einem serverseitig gerenderten Blog, einer Dokumentationsseite oder einem Nachrichtenartikel liefern alle nahezu identisches Markdown. Die schnellste Variante gewinnt. Der Unterschied zeigt sich bei clientseitig gerenderten Seiten. Dort ist das ausgelieferte HTML nur eine leere Hülle, und der Text wird nach dem Laden durch JavaScript eingefügt.

Draco eskaliert stufenweise. Stufe 0 und Stufe 1 analysieren das HTML vollständig ohne JavaScript. Stufe 2 führt das JavaScript der Seite in einem V8-Isolat innerhalb desselben Prozesses aus. Das ist die JavaScript-Engine ohne umgebenden Browser. Laut README erhält der Seitencode dort keine Bindings für Host-Funktionen. Damit werden viele Single-Page-Anwendungen mit einem Bruchteil des Speicherbedarfs eines Browsers unterstützt. Wenn Draco auf ein unüberwindbares Hindernis trifft, beendet sich draco scrape mit dem Exit-Code 3, needs_browser. Prüfen Sie dies in Skripten. Eine leere Datei mit Exit-Code 0 ist der Fehler, der den Kontext eines Agents unbemerkt unbrauchbar macht:

draco scrape https://example.com > page.md
echo "exit=$?"

Firecrawls playwright-service steuert ein echtes Chromium und rendert daher das, was ein Browser rendert. Der Self-Hosted-Build ist dennoch nicht mit dem gehosteten Produkt gleichzusetzen: Laut Dokumentation haben Self-Hosted-Instanzen keinen Zugriff auf Fire Engine. Damit fehlen die Maßnahmen gegen Blockierungen und die IP-Rotation des Cloud-Dienstes. Außerdem werden die Endpunkte /agent und /browser nicht unterstützt. Hound ist bewusst dazwischen angesiedelt. Es ruft Inhalte über HTTP ab und eskaliert je Anfrage. Sein aufgeheizter Browser wird nach einem Inaktivitäts-Timeout beendet, sodass ein wenig ausgelasteter Host nahe am Grundverbrauch bleibt.

Draco mit einer festgelegten Version installieren

Die README beschreibt ein Installationsskript in einer Zeile. Lesen Sie den Inhalt, bevor Sie ihn an eine Shell weiterleiten: Das Skript installiert nach $HOME/.draco/bin/draco, verwendet immer das Release latest und prüft weder eine Signatur noch einen Hash. Auf einem Server sollten Sie die Version festlegen und den Download verifizieren.

cd /tmp
curl -fsSLO https://github.com/0xchasercat/draco/releases/download/v0.20.5/draco-linux-x86-64.tar.gz
curl -fsSLO https://github.com/0xchasercat/draco/releases/download/v0.20.5/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS

Dieser Befehl gibt draco-linux-x86-64.tar.gz: OK aus. Eine Zeile mit FAILED bedeutet, dass die vorliegenden Bytes nicht den vom Projekt veröffentlichten Bytes entsprechen. Löschen Sie die Datei und beginnen Sie erneut.

mkdir -p draco-v0.20.5
tar -xzf draco-linux-x86-64.tar.gz -C draco-v0.20.5
sudo install -m 755 "$(find draco-v0.20.5 -type f -name draco | head -n1)" /usr/local/bin/draco
draco scrape https://example.com

Der letzte Befehl gibt die Beispielseite als Markdown in deutlich weniger als einer Sekunde aus. find ist keine Dekoration: Das Layout des Archivs gehört nicht zum öffentlichen Vertrag des Projekts, und das offizielle Installationsskript ermittelt die Binärdatei auf dieselbe Weise.

Führen Sie den Daemon unter einem eigenen Konto aus, nicht unter Ihrem Anmeldekonto. Schreiben Sie /etc/systemd/system/draco.service:

[Unit]
Description=Draco fetch daemon
After=network-online.target
Wants=network-online.target

[Service]
User=draco
ExecStart=/usr/local/bin/draco serve --host 127.0.0.1 --port 3002 --max-concurrency 4
Restart=on-failure
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
sudo useradd --system --no-create-home --shell /usr/sbin/nologin draco
sudo systemctl daemon-reload
sudo systemctl enable --now draco
curl -s http://127.0.0.1:3002/health

/health antwortet, sobald der Daemon auf Verbindungen wartet. Connection refused bedeutet, dass dies nicht der Fall ist. Lesen Sie dann journalctl -u draco -n 50. Die häufigste Ursache ist, dass ein anderer Prozess bereits Port 3002 belegt, da dies auch der Standardport von Firecrawl ist. --port ändert einen der beiden Ports. Weitere Informationen zu Unit-Dateien: systemd-Service-Units und Timer.

Rufen Sie den Dienst nun so ab, wie es Ihr Agent tun wird:

curl -X POST http://127.0.0.1:3002/v1/scrape \
  -H 'content-type: application/json' \
  -d '{"url": "https://example.com", "formats": ["markdown"]}'

Halten Sie den Fetch-Daemon vom öffentlichen Internet fern

Eine Fetch-API ohne Authentifizierung ist ein offener Proxy. Jeder, der den Port erreichen kann, veranlasst Ihren Server, beliebige URLs unter Ihrer IP-Adresse abzurufen. Die Missbrauchsmeldung geht dann an Ihren Provider und nicht an diese Person. Die dokumentierten serve-Flags von Draco sehen keinen API-Schlüssel vor. Der Schutz muss daher über das Netzwerk erfolgen. Verwenden Sie die standardmäßige 127.0.0.1-Bind-Adresse, wenn der Agent auf demselben Host läuft. Wenn der Agent auf einem anderen Host läuft, verbinden Sie beide Seiten über einen privaten Tunnel. Ein selbst gehostetes WireGuard-VPN ist dafür die übliche Lösung. Binden Sie den Dienst an die Tunneladresse statt an 0.0.0.0. Prüfen Sie anschließend von einem anderen Rechner aus, dass die öffentliche IP-Adresse keine Antworten liefert. Grundlagen der ufw-Firewall und Benutzerkonten mit den geringsten erforderlichen Rechten behandeln die beiden dafür notwendigen Aspekte.

Ändert sich Ihr Agent-Code? API-Kompatibilität in der Praxis

Draco beantwortet die Firecrawl-v1-Routen: /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape und /v1/search. In der README steht außerdem, dass unbekannte Felder akzeptiert und ignoriert werden. Ein Agent, der bereits Anfragen an /v1/scrape sendet, benötigt eine neue Basis-URL und keine weiteren Änderungen. Prüfen Sie, was sich auf der anderen Seite geändert hat: Die Firecrawl-Dokumentation für das eigene Hosting verwendet jetzt /v2/crawl für Tests, und aktuelle SDKs verwenden v2. Ein v2-Client, der auf Draco zeigt, fordert daher eine Route an, die Draco nicht bereitstellt. Testen Sie jeden Aufruf mit curl, bevor Sie den Agent-Code ändern. Lesen Sie außerdem den JSON-Body statt nur den Statuscode, weil sich die Implementierungen vor allem bei den Feldnamen unterscheiden.

Robots.txt, Rate Limits und die Grenze, die Sie einhalten sollten

Draco liest robots.txt standardmäßig ein, und --ignore-robots deaktiviert dieses Verhalten. Firecrawl dokumentiert denselben Standard. Lassen Sie beide Einstellungen unverändert. Legen Sie anschließend Ihre eigene Geschwindigkeit fest: --delay fügt zwischen den Anfragen Millisekunden ein, und --max-concurrency begrenzt die parallelen Jobs; der Standardwert des Daemons ist 8. Zwei bis vier Anfragen belasten eine gemeinsam genutzte VPS-Verbindung weniger und sind insgesamt selten langsamer, weil eine Website, die für Sie Rate Limiting aktiviert, mehr Zeit kostet als durch die zusätzliche Parallelität eingespart wird. Cachen Sie die abgerufenen Daten, damit ein zweiter Agent-Lauf die Quelle nicht erneut belastet. Das ist zugleich der günstigste Kostenpunkt beim Kontrollieren der Kosten eines AI-Agenten.

Challenge-Seiten sind ein eigenes Thema. Trawl ist genau dafür ausgelegt: Cloudflare Turnstile, reCAPTCHA, hCaptcha und GeeTest. Eine Challenge-Seite bedeutet ausdrücklich, dass eine Website automatisierten Datenverkehr ablehnt. Die Umgehung solcher Mechanismen verstößt gegen die Nutzungsbedingungen der Website und in manchen Regionen auch gegen geltendes Recht. Daher behandelt dieser Leitfaden die Abrufinfrastruktur und endet an dieser Stelle. Die Techniken, mit denen sich eine Challenge-Seite überwinden lässt, werden von Website-Betreibern erkannt und blockiert. Dadurch werden darauf aufgebaute Pipelines nicht nur unhöflich, sondern auch fragil. Wenn eine Quelle so wichtig ist, suchen Sie nach ihrem RSS-Feed, ihrer öffentlichen API oder einem Bulk-Export. Jede dieser Optionen ist im Betrieb günstiger, und keine fällt in der Woche aus, in der die Challenge-Seite geändert wird.

Einen Agenten über MCP anbinden

MCP (Model Context Protocol) ist die Schnittstelle, über die ein Agent ein Tool aufruft. Draco enthält einen MCP-Server in derselben Binärdatei und verwendet dafür stdio:

{ "mcpServers": { "draco": { "command": "draco", "args": ["mcp"] } } }

Die Tools erscheinen beim Agenten anschließend als draco_scrape, draco_search und als Satz draco_interact_*. Stdio funktioniert nur, wenn der Agent-Prozess und die Binärdatei auf demselben Rechner liegen, weil der Transport die Standardeingabe dieses Prozesses verwendet. Für einen Agenten auf einem anderen Host stellt Hound MCP stattdessen über HTTP bereit: hound --http --host 127.0.0.1 --port 8765 veröffentlicht einen Endpunkt unter http://127.0.0.1:8765/mcp, den Sie über den Tunnel erreichen. Die Auswahl des Transports und die Festlegung der bereitzustellenden Dienste werden unter MCP-Server auf einem VPS betreiben beschrieben.

Paare über die Suche abrufen. Ein Agent, der nur Inhalte abrufen kann, wartet darauf, dass Sie ihm URLs vorgeben. Fügen Sie eine selbst gehostete SearXNG-Suchinstanz hinzu, kann er diese selbst finden. Das entspricht dem Browser-Such-Skill auf Basis von SearXNG. Sobald der Daemon läuft, steht er als gemeinsamer Dienst für jeden der von Ihnen betriebenen selbst gehosteten KI-Agenten zur Verfügung.

FAQ

Benötige ich einen Headless-Browser, um Seiten für einen KI-Agenten abzurufen?

Für die meisten Seiten nicht. Serverseitig gerenderte Dokumentationen, Blogs und Nachrichtenartikel werden mit einem einfachen HTTP-Abruf und einer anschließenden HTML-zu-Markdown-Konvertierung vollständig geliefert. Genau das macht Draco in seinen niedrigeren Tarifen laut eigenen Projektangaben mit ungefähr 300 ms pro Seite und ohne Browser. Bei clientseitig gerenderten Anwendungen lohnt sich der Speicherverbrauch eines Browsers, weil das gelieferte HTML dort nur ein leeres Grundgerüst ist. Dracos V8-Isolat deckt einen großen Teil dieses Zwischenbereichs ohne Browserprozess ab. Wenn das nicht möglich ist, wird der Prozess mit dem Exit-Code 3, needs_browser, beendet.

Wie viel RAM benötigt selbst gehostetes Firecrawl auf einem VPS?

Die Compose-Datei setzt ein Limit von 8 GB für den api-Container und 4 GB für den Playwright-Container. Derselbe Stack startet außerdem Redis, RabbitMQ, PostgreSQL und FoundationDB. Planen Sie mit 8 GB. Auf einem System mit 2 GB beendet der Out-of-Memory-Killer des Kernels unter Last Container. Das erste Anzeichen ist ein neu gestarteter Container in docker compose ps, ohne nützliche Meldung im Anwendungslog. Bestätigen Sie den Vorgang mit dmesg -T | tail.

Ist Draco ein direkter Ersatz für die Firecrawl-API?

Für die v1-Endpunkte ist Draco weitgehend kompatibel. Es stellt /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape und /v1/search bereit und ignoriert Anforderungsfelder, die es nicht kennt. Ein Client, der für Firecrawl v1 geschrieben wurde, benötigt daher normalerweise nur eine neue Basis-URL. Draco ist nicht das gehostete Produkt. Dahinter steht kein verwalteter Proxy-Pool, und die neueren v2-Routen von Firecrawl gehören nicht zur verfügbaren API-Oberfläche. Prüfen Sie zuerst jeden Aufruf, den Ihr Agent ausführt, mit curl.

Bedeutet das Self-Hosting eines Scrapers, dass ich robots.txt ignorieren kann?

Nein. Wo der Code ausgeführt wird, ändert nichts daran, was eine Website veröffentlicht hat oder welche Zugriffe ihre Nutzungsbedingungen erlauben. Draco und Firecrawl respektieren robots.txt standardmäßig. Das Override-Flag ist für Websites vorgesehen, die Ihnen gehören oder für deren Crawling Sie eine schriftliche Genehmigung haben. Unabhängig davon werden am Zielsystem Ratenlimits durchgesetzt. Ein höflicher --delay mit niedriger Parallelität sorgt daher dafür, dass Ihre IP-Adresse weiterhin funktioniert. Ein Stack, der nur durch das Umgehen einer Challenge-Wall funktioniert, kann ohne Vorwarnung ausfallen.

#scraping#firecrawl#ai-agents#self-hosting#markdown