SSD Nodes Learn 🎉 VPS vanaf $5.50/mnd
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-13

Zelf-hosted Firecrawl alternatieven voor uw eigen VPS

Vergelijk Draco, Hound en Firecrawl op RAM-verbruik en headless browser-eisen. Ontdek hoe u deze tools via MCP koppelt aan uw agent voor efficiënte markdown-conversie op een VPS.

Waar een zelfgehost alternatief voor Firecrawl aan moet voldoen

Een zelfgehost alternatief voor Firecrawl heeft één taak: een URL ophalen en de pagina teruggeven als schone markdown die een agent kan lezen. De gehoste API's rekenen per pagina af, waardoor de kosten stijgen naarmate uw agent nieuwsgieriger wordt. Een VPS waar u toch al voor betaalt, kan hetzelfde werk verrichten. De projecten verschillen op één punt: moet er een headless browser (een echte browser-engine die zonder venster draait) op uw machine worden gestart?

Dat antwoord bepaalt het geheugengebruik, de kosten per pagina en welke pagina's leeg terugkomen. Deze handleiding vergelijkt Draco, Hound en de zelfgehoste Firecrawl-release, installeert de lichtste versie op een vastgezet versienummer en koppelt deze via MCP (model context protocol) aan een agent.

De vier projecten en wat ze precies inhouden

Draco is één binary, geschreven in Rust, onder een MIT- of Apache-2.0-licentie. Release v0.20.5 werd gepubliceerd op 16 juli 2026. draco scrape <url> stuurt markdown naar stdout. draco serve draait een daemon die luistert op 127.0.0.1:3002, de poort die Firecrawl gebruikt. Het project levert geen container-image en start geen browser.

Firecrawl self-hosted is de engine achter het gehoste product, onder de AGPL-3.0-licentie. Het docker-compose.yaml definieert zeven services: playwright-service, api, redis, rabbitmq, nuq-postgres, foundationdb en foundationdb-init. U krijgt de volledige crawl-wachtrij, ten koste van het draaien van een klein gedistribueerd systeem.

Hound bevindt zich in de master-fetch repository en wordt naar PyPI gedistribueerd als hound-mcp, onder een MIT-licentie, versie 13.0.1 per 3 augustus 2026. Het vereist Python 3.11 of nieuwer. Het is in de eerste plaats een MCP-server en in de tweede plaats een fetcher: het probeert standaard HTTP en start pas een Patchright-browser wanneer de standaard fetch geblokkeerd wordt.

Trawl staat hier vermeld omdat mensen het tegenkomen tijdens het zoeken naar de andere projecten, terwijl het een andere taak uitvoert. Het lost JavaScript-uitdagingen en CAPTCHA's op met een fingerprint-gepatchte Firefox, als vervanging voor FlareSolverr in een *arr mediastack. Het is geen markdown-extractor. De onderstaande sectie over etiquette legt uit waarom dat onderscheid bepaalt of het al dan niet in uw agent-stack thuishoort.

Waarom de browser-pool de doodsteek is voor kleine VPS-servers

Elk geopend browsertabblad is een afzonderlijk renderer-proces dat zijn eigen DOM (Document Object Model) en JavaScript-heap vasthoudt. Het geheugengebruik schaalt daarom mee met het aantal pagina's dat op hetzelfde moment geopend is, niet met het aantal pagina's dat per dag wordt opgehaald. Twee van deze projecten verwerken die kosten in hun eigen compose-bestanden.

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
  }
]

Het compose-bestand van Firecrawl begrenst de api-container op 8 GB en de Playwright-container op 4 GB, inclusief bijbehorende swap-limieten. Het compose-bestand van Hound stelt 3 GB in voor één container die een gebundelde Chromium-versie bevat. Dit zijn door de projecten gekozen plafonds; het zijn gepubliceerde cijfers en geen metingen van een inactief systeem. Bovendien eisen Redis, RabbitMQ, PostgreSQL en FoundationDB ook hun deel bovenop de cijfers van Firecrawl.

Een plafond dat hoger ligt dan het fysieke RAM-geheugen waarover u beschikt, heeft geen effect. Wanneer de server leegloopt, beëindigt de out-of-memory killer van de kernel een proces, waardoor een container uit docker compose ps verdwijnt zonder dat er een foutmelding in het applicatielogboek wordt geschreven. Raadpleeg dmesg -T | tail na elke herstart die u niet kunt verklaren. Reken op 8 GB voor de volledige Firecrawl-stack en beschouw 4 GB als het absolute minimum voor een testomgeving. Het instellen van de limieten per service wordt behandeld in geheugenlimieten in Docker Compose.

Eén extra browserdetail kost gebruikers vaak een hele avond. Docker geeft een container standaard 64 MB gedeeld geheugen op /dev/shm, en omdat Chromium daar renderer-buffers plaatst, crasht de browser bij zware pagina's. Beide browser-stacks verhogen dit: het compose-bestand van Hound bevat shm_size: "1gb". Kopieer die regel naar elke image die u rondom Playwright bouwt.

Extractiekwaliteit op JavaScript-intensieve pagina's

Bij statische HTML, een server-rendered blog, een documentatiepagina of een nieuwsartikel is de resulterende markdown nagenoeg identiek en wint de snelste methode. Het verschil wordt zichtbaar bij client-rendered pagina's, waarbij de geleverde HTML slechts een lege schil is en de tekst pas na het laden via JavaScript verschijnt.

Draco escaleert in niveaus. Niveau 0 en niveau 1 parsen de HTML volledig zonder JavaScript. Niveau 2 voert de eigen JavaScript van de pagina uit binnen een in-process V8 isolate; dit is de JavaScript-engine zonder browseromgeving. De README vermeldt dat paginacode daar geen toegang heeft tot host-mogelijkheden. Dit dekt veel single-page applicaties voor een fractie van het geheugengebruik van een browser. Wanneer Draco een blokkade tegenkomt die het niet kan passeren, stopt draco scrape met exitcode 3, needs_browser. Controleer dit in scripts, aangezien een leeg bestand met een exitcode nul een fout is die de context van een agent stilletjes kan vervuilen:

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

De playwright-service van Firecrawl stuurt een echte Chromium-instantie aan, waardoor deze rendert wat een browser rendert. De self-hosted build is echter niet gelijk aan het gehoste product: de documentatie stelt dat self-hosted instanties geen toegang hebben tot Fire Engine. Hierdoor ontbreken de anti-blocking en IP-rotatie van de cloudservice, en worden de /agent en /browser endpoints niet ondersteund. Hound bevindt zich bewust in het midden. Het haalt gegevens op via HTTP en escaleert per verzoek, terwijl de actieve browser wordt gesloten na een idle timeout. Hierdoor blijft een rustige server dicht bij het basisverbruik.

Draco installeren met een vastgezette versie

De README beschrijft een installer die met één regel werkt. Lees wat deze doet voordat u de output naar een shell pipe: de installer schrijft naar $HOME/.draco/bin/draco, neemt altijd de latest release en controleert geen handtekening of hash. Zet op een server de versie vast en verifieer de download.

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

Dit print draco-linux-x86-64.tar.gz: OK. Een FAILED regel betekent dat de bytes die u heeft niet overeenkomen met de bytes die het project heeft gepubliceerd; verwijder deze dus en begin opnieuw.

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

Het laatste commando print de voorbeeldpagina als markdown in ruim onder een seconde. De find is geen versiering: de lay-out van het archief maakt geen deel uit van het publieke contract van het project, en de officiële installer lokaliseert de binary op dezelfde manier.

Draai de daemon onder een eigen account in plaats van onder uw eigen gebruikersaccount. Schrijf /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 geeft antwoord zodra de daemon luistert. Connection refused betekent dat dit niet het geval is; lees daarom journalctl -u draco -n 50. De gebruikelijke oorzaak is een ander proces dat poort 3002 al bezet houdt, aangezien dit ook de standaardpoort van Firecrawl is, en --port verplaatst een van beide. Meer diepgang over unit-bestanden: systemd service units en timers.

Haal nu de data op zoals uw agent dat zal doen:

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

Houd de fetch-daemon buiten het publieke internet

Een fetch API zonder authenticatie is een open proxy. Iedereen die de poort kan bereiken, kan uw server elke URL laten opvragen onder uw IP-adres. De meldingen van misbruik gaan vervolgens naar uw provider, niet naar de aanvaller. De gedocumenteerde serve flags van Draco bevatten geen API-sleutel, dus de beveiliging moet op netwerkniveau worden geregeld. Gebruik de standaard 127.0.0.1 bind wanneer de agent op dezelfde machine draait. Wanneer de agent zich elders bevindt, plaatst u beide uiteinden in een privétunnel; een zelfgehoste WireGuard VPN is hiervoor de gebruikelijke oplossing. Bind de service vervolgens aan het tunneladres in plaats van aan 0.0.0.0. Controleer daarna vanaf een andere machine of het publieke IP-adres op geen enkele aanvraag reageert. Basisprincipes van ufw firewall en gebruikersaccounts met minimale rechten behandelen de twee helften van deze beveiliging.

Zal uw agentcode veranderen? API-compatibiliteit in de praktijk

Draco beantwoordt de Firecrawl v1-routes: /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape en /v1/search, en de README vermeldt dat onbekende velden worden geaccepteerd en genegeerd. Een agent die al naar /v1/scrape post, heeft enkel een nieuwe base URL nodig. Monitor wat er aan de andere kant is gewijzigd: de eigen self-hosting pagina van Firecrawl test nu met /v2/crawl, en huidige SDK's gebruiken v2. Een v2-client die naar Draco wijst, vraagt dus om een route die Draco niet publiceert. Test elke aanroep met curl voordat u de agentcode bewerkt, en lees de JSON-body in plaats van de statuscode, omdat veldnamen de punten zijn waarop deze implementaties van elkaar afwijken.

Robots.txt, rate limits en de grens die u moet respecteren

Draco leest standaard robots.txt en --ignore-robots schakelt dit uit. Firecrawl documenteert hetzelfde standaardgedrag. Laat beide ongewijzigd. Bepaal vervolgens uw eigen tempo: --delay voegt milliseconden toe tussen verzoeken en --max-concurrency begrenst parallelle taken, waarbij 8 de standaardwaarde is voor de daemon. Twee tot vier is vriendelijker voor een gedeelde VPS-verbinding en is zelden trager in het totaal, omdat een site die u begint te beperken in snelheid meer tijd kost dan de besparing door gelijktijdigheid oplevert. Cache wat u ophaalt, zodat een tweede agent-run de bron niets kost. Dat is tevens de goedkoopste post in het beheersen van de kosten van een AI-agent.

Challenge-muren zijn een apart onderwerp, en Trawl is specifiek gebouwd voor: Cloudflare Turnstile, reCAPTCHA, hCaptcha en GeeTest. Een challenge-muur is een site die geautomatiseerd verkeer simpelweg weigert. Het omzeilen hiervan brengt u in strijd met de gebruiksvoorwaarden van de site, en op sommige plaatsen zelfs met de wet, dus deze handleiding behandelt de infrastructuur voor het ophalen en stopt daar. Dezelfde technieken die een muur passeren, zijn de technieken waar site-eigenaren op letten en die ze blokkeren, wat elke pipeline die daarop is gebouwd zowel fragiel als onbeleefd maakt. Wanneer een bron zo belangrijk is, zoek dan naar de RSS-feed, de publieke API of een bulkexport. Elk van deze is goedkoper in het onderhoud en geen van deze gaat kapot op het moment dat de muur verandert.

Verbind het met een agent via MCP

MCP (model context protocol) is de interface die een agent gebruikt om een tool aan te roepen. Draco bevat een MCP-server in hetzelfde binaire bestand, via stdio:

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

De tools verschijnen vervolgens voor de agent als draco_scrape, draco_search en de draco_interact_*-set. Stdio werkt alleen wanneer het agentproces en het binaire bestand zich op dezelfde machine bevinden, omdat het transport de standaardinvoer van dat proces is. Voor een agent op een andere host serveert Hound MCP in plaats daarvan via HTTP: hound --http --host 127.0.0.1 --port 8765 publiceert een endpoint op http://127.0.0.1:8765/mcp, dat u via de tunnel bereikt. Keuzes voor transport en wat er moet worden blootgesteld, staan in het draaien van MCP-servers op een VPS.

Paren ophalen met search. Een agent die alleen kan ophalen, wacht tot u URL's aanlevert. Voeg een zelf-gehoste SearXNG-zoekinstantie toe en de agent kan ze zelf vinden, in dezelfde vorm als de browser-zoekvaardigheid gebouwd op SearXNG. Zodra de daemon actief is, fungeert deze als één gedeelde service voor elk van de zelf-gehoste AI-agents die u draait.

FAQ

Heb ik een headless browser nodig om pagina's op te halen voor een AI-agent?

Voor de meeste pagina's niet. Documentatie, blogs en nieuwsartikelen die aan de serverzijde worden gegenereerd, worden volledig opgehaald met een standaard HTTP-verzoek, gevolgd door een conversie van HTML naar markdown. Dit is wat Draco in zijn lagere niveaus doet, met een snelheid van ongeveer 300 ms per pagina zonder browser, volgens de eigen cijfers van het project. Een browser is pas nodig voor applicaties die aan de clientzijde worden gegenereerd, waarbij de geleverde HTML slechts een lege huls is. De V8-isolate van Draco dekt het grootste deel van dit middenveld zonder browserproces; als dit niet lukt, sluit het af met code 3, needs_browser.

Hoeveel RAM heeft zelfgehoste Firecrawl nodig op een VPS?

Het compose-bestand stelt een limiet van 8 GB in voor de api-container en 4 GB voor de Playwright-container. Dezelfde stack start ook Redis, RabbitMQ, PostgreSQL en FoundationDB. Houd rekening met 8 GB. Op een server met 2 GB RAM zal de out-of-memory killer van de kernel containers onder belasting beëindigen. Het eerste teken hiervan is een herstartende container in docker compose ps zonder nuttige informatie in het applicatielogboek; controleer dit daarom met dmesg -T | tail.

Is Draco een directe vervanging voor de Firecrawl API?

Voor de v1-endpoints komt het aardig in de buurt. Het ondersteunt /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape en /v1/search en negeert verzoekvelden die het niet herkent. Een client die is geschreven voor Firecrawl v1 heeft daarom meestal alleen een nieuwe base URL nodig. Het is echter niet hetzelfde als het gehoste product: er is geen beheerde proxy-pool aanwezig en de nieuwere v2-routes van Firecrawl maken geen deel uit van het aanbod. Controleer elke aanroep die uw agent doet eerst met curl.

Betekent het zelf hosten van een scraper dat ik robots.txt kan negeren?

Nee. Waar de code wordt uitgevoerd, verandert niets aan wat een site publiceert of wat de voorwaarden toestaan. Zowel Draco als Firecrawl respecteren standaard robots.txt. De override-vlag is bedoeld voor sites die u zelf beheert of waarvoor u schriftelijke toestemming heeft om ze te crawlen. Rate limits worden aan de ontvangende kant hoe dan ook afgedwongen, dus een beleefde --delay met lage gelijktijdigheid zorgt ervoor dat uw IP-adres bruikbaar blijft. Een stack die alleen functioneert door een beveiligingsmuur te omzeilen, is een stack die zonder waarschuwing zal falen.

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