SSD Nodes Learn 🎉 VPS $5.50/aydan başlayan
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-05

VPS için self-hosted Firecrawl alternatifleri

Draco, Hound ve self-hosted Firecrawl; RAM kullanımı, headless browser gereksinimi ve API uyumluluğuyla karşılaştırılıyor. Sabit kurulum ve MCP bağlantısı anlatılıyor.

Kendi sunucunuzda barındırılan bir Firecrawl alternatifinin yapması gerekenler

Kendi sunucunuzda barındırılan bir Firecrawl alternatifinin tek görevi vardır: Bir URL alıp sayfayı, bir agent'ın okuyabileceği temiz markdown olarak döndürmek. Hosted API'ler sayfa başına ücretlendirildiği için fatura, agent'ınızın ne kadar içerik taradığına bağlı olarak artar. Zaten ücretini ödediğiniz bir VPS aynı işi yapabilir. Projeler tek bir soruda ayrılır: headless browser'ın (pencere açmadan çalışan gerçek bir browser motorunun) sunucunuzda başlatılması gerekiyor mu?

Bu yanıt bellek kullanımını, sayfa başına maliyeti ve boş dönen sayfaları belirler. Bu kılavuzda Draco, Hound ve self-hosted Firecrawl sürümü karşılaştırılır, en hafif seçenek sabitlenmiş bir sürümde kurulur ve MCP (model context protocol) üzerinden bir agent'a bağlanır.

Dört proje ve her birinin gerçekte ne olduğu

Draco, Rust ile yazılmış ve MIT veya Apache-2.0 lisansına sahip tek bir binary dosyadır. v0.20.5 sürümü 16 July 2026 tarihinde yayımlandı. draco scrape <url> markdown çıktısını stdout'a yazar. draco serve, Firecrawl'ın kullandığı port olan 127.0.0.1:3002 üzerinde yanıt veren bir daemon çalıştırır. Herhangi bir container image içermez ve browser başlatmaz.

Firecrawl self-hosted, hosted ürünün arkasındaki ve AGPL-3.0 lisansıyla sunulan motordur. docker-compose.yaml dosyası yedi servis tanımlar: playwright-service, api, redis, rabbitmq, nuq-postgres, foundationdb ve foundationdb-init. Gerçek crawl queue elde edilir; bunun karşılığında küçük bir dağıtık sistemin çalıştırılması gerekir.

Hound, master-fetch repository'sinde bulunur ve PyPI'ye hound-mcp olarak yayımlanır. MIT lisansına sahiptir ve 3 August 2026 itibarıyla sürümü 13.0.1'dir. Python 3.11 veya daha yeni bir sürüm gerekir. Öncelikle bir MCP server, ikinci olarak bir fetcher'dır: plain HTTP'yi dener ve plain fetch engellenmiş olarak döndüğünde Patchright browser başlatır.

Trawl, diğer projeler aranırken karşılaşıldığı ve farklı bir iş yaptığı için burada yer alır. *arr media stack içinde FlareSolverr yerine kullanılmak üzere, fingerprint uygulanmış bir Firefox ile JavaScript challenge'larını ve CAPTCHA'ları çözer. Markdown extractor değildir. Aşağıdaki etik bölümünde bu ayrımın, Trawl'ın agent stack'ine dahil edilip edilmemesi açısından neden belirleyici olduğu açıklanır.

Küçük VPS sunucularında sorun genellikle tarayıcı havuzunda neden çıkar

Açık olan her tarayıcı sekmesi, kendi DOM'unu (document object model) ve kendi JavaScript heap alanını kullanan ayrı bir renderer sürecidir. Bu nedenle bellek kullanımı, gün içinde alınan sayfa sayısına göre değil, aynı anda açık olan sayfa sayısına göre artar. Bu projelerden ikisi bu maliyeti kendi compose dosyalarına yazar.

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

Firecrawl compose dosyası, api container için bellek sınırını 8 GB, Playwright container için ise 4 GB olarak belirler ve swap sınırlarını da buna eşit tutar. Hound compose dosyası, Chromium içeren tek bir container için 3 GB sınır belirler. Bunlar projelerin seçip yayımladığı üst sınırlardır; boşta çalışan bir sistemde yapılan ölçümler değildir. Ayrıca Redis, RabbitMQ, PostgreSQL ve FoundationDB, Firecrawl değerlerine ek olarak kendileri için de bellek ister.

Sahip olduğunuz RAM miktarının üzerindeki bir sınır hiçbir işe yaramaz. Sunucunun belleği tükendiğinde kernel, out-of-memory killer aracılığıyla bir süreci sonlandırır. Bu nedenle bir container, uygulama loguna hata yazılmadan docker compose ps içinden kaybolabilir. Açıklayamadığınız her yeniden başlatma sonrasında dmesg -T | tail değerini okuyun. Firecrawl yığınının tamamı için 8 GB bellek ayırın ve 4 GB'ı test sunucusu için alt sınır kabul edin. Değerlerin servis bazında ayarlanması Docker Compose içinde bellek sınırları bölümünde açıklanır.

Bir tarayıcı ayrıntısı daha çalışma sürecinde saatler kaybettirebilir. Docker, /dev/shm konumunda bir container için 64 MB paylaşımlı bellek sağlar. Chromium renderer buffer alanlarını burada tuttuğu için yoğun sayfalarda çöker. Her iki tarayıcı yığını da bu alanı artırır: Hound compose dosyasında shm_size: "1gb" satırı bulunur. Playwright etrafında oluşturduğunuz tüm image'lara bu satırı ekleyin.

JavaScript ağırlıklı sayfalarda içerik çıkarma kalitesi

Statik HTML, sunucu tarafında oluşturulan blog, dokümantasyon sayfası veya haber makalesi gibi içeriklerin tümü neredeyse aynı markdown çıktısını döndürür; en hızlı olan kazanır. Fark, istemci tarafında oluşturulan sayfalarda ortaya çıkar. Bu sayfalarda gönderilen HTML boş bir kabuktur ve metin, yükleme sonrasında JavaScript tarafından getirilir.

Draco, katmanlar halinde ilerler. Tier 0 ve tier 1, HTML'yi hiç JavaScript çalıştırmadan ayrıştırır. Tier 2, sayfanın kendi JavaScript kodunu, tarayıcı olmadan çalışan JavaScript motoru olan işlem içi bir V8 isolate içinde yürütür. README, sayfa kodunun burada host capability binding erişimi olmadığını belirtir. Bu yöntem, tarayıcının kullanacağı belleğin küçük bir bölümüyle birçok single-page application için yeterlidir. Draco aşamayacağı bir engelle karşılaştığında draco scrape, code 3 ile çıkar needs_browser. Bunu script'lerde kontrol edin. Çünkü zero exit code ile boş bir dosya döndürülmesi, agent context'ini sessizce bozan hatadır:

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

Firecrawl'ın playwright-service bileşeni gerçek bir Chromium çalıştırır. Bu nedenle tarayıcının oluşturduğu içeriği oluşturur. Self-hosted build yine de hosted product ile aynı değildir. Dokümantasyona göre self-hosted instance'lar Fire Engine erişimine sahip değildir. Bu nedenle cloud service'in anti-blocking ve IP rotation özellikleri bulunmaz; ayrıca /agent ve /browser endpoint'leri desteklenmez. Hound ise bilerek bu ikisinin arasında konumlanır. HTTP üzerinden veri alır ve her request için gerektiğinde üst katmana geçer. Warm browser, idle timeout sonrasında kapanır. Böylece düşük trafikli bir sunucu temel kaynak kullanımına yakın kalır.

Sabitlenmiş bir sürümle Draco kurulumu

README bir satırlık bir yükleyici belgelendirir. Shell'e pipe etmeden önce ne yaptığını okuyun: $HOME/.draco/bin/draco konumuna kurulum yapar, her zaman latest sürümünü alır ve herhangi bir imza veya hash doğrulaması yapmaz. Bir sunucuda sürümü sabitleyin ve indirilen dosyayı doğrulayın.

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

Bu komut draco-linux-x86-64.tar.gz: OK çıktısını verir. FAILED satırı, elinizdeki baytların projenin yayımladığı baytlarla aynı olmadığı anlamına gelir; dosyaları silin ve işlemi yeniden başlatın.

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

Son komut, örnek sayfayı bir saniyeden çok daha kısa sürede markdown olarak yazdırır. find yalnızca dekorasyon değildir: arşiv düzeni projenin herkese açık sözleşmesinin bir parçası değildir ve resmi yükleyici de binary dosyasını aynı şekilde bulur.

Daemon'u login kullanıcınız yerine kendi hesabı altında çalıştırın. /etc/systemd/system/draco.service dosyasını yazın:

[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, daemon listening durumuna gelir gelmez yanıt verir. Connection refused, listening durumunda olmadığı anlamına gelir; bu durumda journalctl -u draco -n 50 dosyasını okuyun. Yaygın neden, başka bir sürecin 3002 portunu zaten kullanıyor olmasıdır; çünkü bu port Firecrawl'un varsayılan portudur. --port ile portu iki süreçten biri için değiştirin. Unit dosyaları hakkında daha fazla bilgi için: systemd service unit'leri ve timer'ları.

Şimdi agent'inizin kullanacağı yöntemi kullanarak indirin:

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

Fetch daemon'ını genel internetten uzak tutun

Kimlik doğrulaması olmayan bir fetch API, açık bir proxy'dir. Porta erişebilen herkes, sunucunuzun IP adresi üzerinden istediği URL'ye istek gönderebilir. Kötüye kullanım bildirimi de bu kişiye değil, servis sağlayıcınıza gider. Draco'nun belgelenmiş serve flag'leri arasında API key bulunmadığından koruma ağ katmanında sağlanmalıdır. Agent aynı makinede çalışıyorsa varsayılan 127.0.0.1 bind ayarını koruyun. Agent farklı bir makinedeyse her iki ucu özel bir tünel üzerinden bağlayın. Kendinizin yönettiği bir WireGuard VPN bu iş için genellikle tercih edilir. Ardından tünel adresine bind edin; 0.0.0.0 adresini kullanmayın. Daha sonra başka bir makineden public IP'nin hiçbir yanıt vermediğini doğrulayın. ufw firewall temelleri ve en az ayrıcalıklı kullanıcı hesapları bu yapılandırmanın iki bölümünü kapsar.

Aracınızın kodu değişecek mi? Uygulamada API uyumluluğu

Draco, Firecrawl v1 rotalarına yanıt verir: /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape ve /v1/search. README dosyasında bilinmeyen alanların kabul edilip yok sayıldığı belirtilir. Halihazırda /v1/scrape adresine POST isteği gönderen bir aracının yalnızca temel URL'si değiştirilmelidir. Karşı tarafta neyin değiştiğine dikkat edilmelidir: Firecrawl'ın kendi self-hosting sayfası artık /v2/crawl ile test yapar ve güncel SDK'lar v2 kullanır. Bu nedenle Draco'ya yönlendirilen bir v2 istemcisi, Draco'nun yayımlamadığı bir rota ister. Agent kodunu değiştirmeden önce her çağrıyı curl ile test edin. Durum kodu yerine JSON gövdesini okuyun. Çünkü bu uygulamalar arasındaki farklılıklar alan adlarında ortaya çıkar.

Robots.txt, rate limitleri ve aşılmaması gereken sınır

Draco varsayılan olarak robots.txt değerini okur ve --ignore-robots bunu devre dışı bırakır. Firecrawl aynı varsayılan davranışı belgeler. Her ikisini de değiştirmeyin. Ardından istek hızını belirleyin: --delay istekler arasına milisaniye cinsinden bekleme süresi koyar ve --max-concurrency paralel işleri sınırlar; daemon varsayılanı 8 değeridir. Paylaşılan bir VPS bağlantısında 2 ile 4 arasındaki değerler daha uygundur ve genel olarak nadiren daha yavaştır. Çünkü rate limiting uygulamaya başlayan bir site, concurrency ile kazanılan süreden daha fazla zaman kaybettirir. Alınan verileri önbelleğe alın. Böylece ikinci bir agent çalıştırması kaynak üzerinde ek yük oluşturmaz. Bu, bir AI agent maliyetini kontrol etme kapsamındaki en düşük maliyetli kalemdir.

Challenge wall konusu ayrıdır ve Trawl tam olarak bunun için geliştirilmiştir: Cloudflare Turnstile, reCAPTCHA, hCaptcha ve GeeTest. Challenge wall, bir sitenin otomatik trafiği açıkça reddetmesidir. Bunu aşmaya çalışmak, sitenin kullanım koşullarına ve bazı yerlerde yasalara aykırı olabilir. Bu nedenle bu kılavuz yalnızca veri alma altyapısını ele alır ve burada sona erer. Bir challenge wall'u aşan teknikler, site sahiplerinin izleyip engellediği tekniklerle aynıdır. Bu nedenle bu teknikler üzerine kurulan her pipeline hem kırılgan hem de uygunsuz olur. Bir kaynak bu kadar önemliyse RSS feed'ini, public API'sini veya toplu dışa aktarma seçeneğini arayın. Bunların her birini çalıştırmak daha ucuzdur ve challenge wall değiştiğinde hiçbiri çalışmaz hale gelmez.

Bir agenti MCP üzerinden bağlama

MCP (model context protocol), bir agent’ın bir tool çağırmak için kullandığı arayüzdür. Draco, aynı binary içinde stdio üzerinden çalışan bir MCP server içerir:

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

Tool’lar daha sonra agent’a draco_scrape, draco_search ve draco_interact_* seti olarak görünür. Stdio yalnızca agent process’i ile binary aynı makinede olduğunda çalışır; çünkü taşıma katmanı, bu process’in standard input akışını kullanır. Başka bir host üzerindeki agent için Hound bunun yerine MCP’yi HTTP üzerinden sunar: hound --http --host 127.0.0.1 --port 8765, http://127.0.0.1:8765/mcp adresinde bir endpoint yayımlar ve bu endpoint’e tunnel üzerinden erişilir. Taşıma seçenekleri ve dışarı açılacak bileşenler için bir VPS üzerinde MCP server’larını çalıştırma sayfasına bakılmalıdır.

Arama ile birlikte sonuç çiftleri alınabilir. Yalnızca fetch yapabilen bir agent, URL’leri kendisine sağlamanızı bekler. Self-hosted bir SearXNG arama instance’ı eklendiğinde bunları kendisi bulabilir; yapı, SearXNG üzerine kurulu browser search skill’i ile aynıdır. Daemon çalışır duruma geldikten sonra bu, çalıştırdığınız self-hosted AI agent’larından hangisi olursa olsun kullanılabilen tek bir ortak servis olur.

FAQ

Bir AI agentinin sayfaları alması için headless browser gerekir mi?

Çoğu sayfa için gerekmez. Sunucu tarafında oluşturulan dokümantasyon, blog ve haber makaleleri, yalnızca bir HTTP fetch işlemi ve HTML-to-markdown adımıyla eksiksiz olarak alınır. Draco, projenin kendi verilerine göre alt katmanlarında bunu browser olmadan sayfa başına yaklaşık 300 ms içinde yapar. Client tarafında oluşturulan uygulamalarda ise browser bellek kullanımını hak eder; çünkü gönderilen HTML yalnızca boş bir shell içerir. Draco'nun V8 isolate yapısı, browser process çalıştırmadan bu kullanım alanının büyük bölümünü kapsar. Bunu yapamadığında çıkış kodu 3 ile sonlanır: needs_browser.

Self-host edilen Firecrawl bir VPS üzerinde ne kadar RAM gerektirir?

Compose dosyası api container için 8 GB, Playwright container için ise 4 GB bellek sınırı belirler. Aynı stack ayrıca Redis, RabbitMQ, PostgreSQL ve FoundationDB servislerini de başlatır. 8 GB RAM planlanmalıdır. 2 GB RAM bulunan bir sistemde kernel out-of-memory killer, yük altında container'ları sonlandırır. İlk belirti, uygulama logunda yararlı bir kayıt bulunmadan docker compose ps içinde yeniden başlatılmış bir container görülmesidir. Durum dmesg -T | tail ile doğrulanmalıdır.

Draco, Firecrawl API için doğrudan kullanılabilir bir alternatif midir?

v1 endpoint'leri için büyük ölçüde uyumludur. /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape ve /v1/search uçlarını sunar. Ayrıca tanımadığı request alanlarını yok sayar. Bu nedenle Firecrawl v1 kullanılarak yazılmış bir client için genellikle yalnızca base URL'nin değiştirilmesi yeterlidir. Ancak hosted product değildir. Arkasında managed proxy pool bulunmaz ve Firecrawl'ın daha yeni v2 route'ları bu kapsamda yer almaz. Agent tarafından yapılan her çağrı önce curl ile doğrulanmalıdır.

Bir scraper'ı self-host etmek robots.txt dosyasını göz ardı edebileceğim anlamına mı gelir?

Hayır. Kodun nerede çalıştırıldığı, sitenin ne yayınladığını veya kullanım koşullarının neye izin verdiğini değiştirmez. Draco ve Firecrawl, varsayılan olarak robots.txt kurallarına uyar. Override flag'i, sahip olunan veya crawl işlemi için yazılı izin alınmış sitelerde kullanılmak üzere vardır. Rate limit'leri uzak uçta uygulanmaya devam eder. Bu nedenle düşük concurrency ile kibar bir --delay kullanılması IP adresinin çalışır durumda kalmasına yardımcı olur. Yalnızca challenge wall aşarak çalışan bir stack, uyarı vermeden çalışmayı durdurabilir.

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