Alternatif Firecrawl Self-Hosted untuk VPS
Bandingkan Draco, Hound, dan Firecrawl self-hosted berdasarkan RAM, kebutuhan headless browser, kompatibilitas API, instalasi versi tetap, serta koneksi MCP.
Hal yang harus dilakukan alternatif Firecrawl yang di-host sendiri
Alternatif Firecrawl yang di-host sendiri memiliki satu tugas: menerima URL dan mengembalikan halaman sebagai markdown bersih yang dapat dibaca agen. API hosted mengenakan biaya per halaman, sehingga tagihan bertambah seiring agen Anda mengambil lebih banyak halaman. VPS yang sudah Anda bayar dapat melakukan pekerjaan yang sama. Proyek-proyek ini berbeda pada satu pertanyaan: apakah headless browser (mesin browser sungguhan yang berjalan tanpa jendela) harus dijalankan di server Anda?
Jawaban tersebut menentukan jejak memori, biaya setiap halaman, dan halaman mana yang dikembalikan dalam keadaan kosong. Panduan ini membandingkan Draco, Hound, dan rilis Firecrawl yang di-host sendiri, memasang opsi paling ringan pada versi yang ditetapkan, serta menghubungkannya ke agen melalui MCP (model context protocol).
Keempat proyek ini, dan fungsi sebenarnya masing-masing
Draco adalah satu binary yang ditulis dalam Rust dan dilisensikan di bawah MIT atau Apache-2.0. Rilis v0.20.5 diterbitkan pada 16 July 2026. draco scrape <url> mencetak markdown ke stdout. draco serve menjalankan daemon yang menjawab pada 127.0.0.1:3002, yaitu port yang digunakan Firecrawl. Proyek ini tidak menyediakan container image dan tidak menjalankan browser.
Firecrawl self-hosted adalah engine di balik produk hosted, dengan lisensi AGPL-3.0. docker-compose.yaml-nya mendefinisikan tujuh service: playwright-service, api, redis, rabbitmq, nuq-postgres, foundationdb, dan foundationdb-init. Anda mendapatkan antrean crawl yang sebenarnya, dengan konsekuensi harus menjalankan sistem terdistribusi skala kecil.
Hound berada di repository master-fetch dan dirilis ke PyPI sebagai hound-mcp, dengan lisensi MIT dan versi 13.0.1 per 3 August 2026. Hound memerlukan Python 3.11 atau yang lebih baru. Hound terutama merupakan server MCP dan baru kemudian fetcher: Hound mencoba HTTP biasa dan hanya menjalankan browser Patchright jika fetch biasa diblokir.
Trawl dicantumkan di sini karena orang menemukannya saat mencari proyek lain, tetapi fungsinya berbeda. Trawl menyelesaikan tantangan JavaScript dan CAPTCHA menggunakan Firefox yang fingerprint-nya telah dipatch, sebagai pengganti FlareSolverr dalam stack media *arr. Trawl bukan markdown extractor. Bagian tentang etika di bawah menjelaskan mengapa perbedaan ini menentukan apakah Trawl layak dimasukkan ke dalam agent stack Anda.
Mengapa kumpulan browser menjadi titik kegagalan VPS kecil
Setiap tab browser yang terbuka merupakan proses renderer terpisah yang menyimpan DOM (document object model) dan heap JavaScript-nya sendiri. Karena itu, penggunaan memori bertambah berdasarkan jumlah halaman yang terbuka pada saat yang sama, bukan jumlah halaman yang diambil per hari. Dua proyek ini menetapkan biaya tersebut dalam file compose masing-masing.
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
}
]File compose Firecrawl membatasi container api hingga 8 GB dan container Playwright hingga 4 GB, dengan batas swap yang sama. Compose Hound menetapkan 3 GB untuk satu container yang membawa Chromium terbundel. Batas ini ditentukan oleh proyek dan merupakan angka yang dipublikasikan, bukan hasil pengukuran pada sistem yang tidak sibuk. Redis, RabbitMQ, PostgreSQL, dan FoundationDB tetap membutuhkan bagian memorinya di atas angka Firecrawl tersebut.
Batas yang lebih tinggi daripada RAM yang Anda miliki tidak memberikan manfaat. Saat kapasitas VPS habis, kernel menjalankan out-of-memory killer untuk menghentikan sebuah proses. Akibatnya, container menghilang dari docker compose ps tanpa error yang ditulis ke log aplikasi. Baca dmesg -T | tail setelah restart yang penyebabnya tidak dapat Anda jelaskan. Sediakan anggaran 8 GB untuk seluruh stack Firecrawl dan anggap 4 GB sebagai batas minimum untuk server pengujian. Pengaturan angka per service dibahas dalam batas memori di Docker Compose.
Ada satu detail browser lain yang dapat menghabiskan waktu berjam-jam. Docker memberikan 64 MB shared memory kepada container di /dev/shm, dan Chromium menempatkan buffer renderer di sana sehingga dapat crash saat memproses halaman yang berat. Kedua stack browser meningkatkan nilai ini. Compose Hound menyertakan shm_size: "1gb". Salin baris tersebut ke image apa pun yang Anda bangun di sekitar Playwright.
Kualitas ekstraksi pada halaman yang banyak menggunakan JavaScript
Pada HTML statis, blog yang dirender server, halaman dokumentasi, dan artikel berita, semuanya menghasilkan markdown yang hampir identik, sehingga opsi tercepat menjadi pilihan terbaik. Perbedaannya terlihat pada halaman yang dirender client. Pada halaman ini, HTML yang dikirim hanya berupa kerangka kosong, sedangkan teks dimuat oleh JavaScript setelah halaman selesai dimuat.
Draco melakukan eskalasi berdasarkan tingkat. Tier 0 dan tier 1 mengurai HTML tanpa JavaScript sama sekali. Tier 2 menjalankan JavaScript milik halaman di dalam isolate V8 dalam proses yang sama. Isolate ini adalah engine JavaScript tanpa browser, dan README menyatakan bahwa kode halaman tidak memperoleh binding kemampuan host di dalamnya. Pendekatan ini mendukung banyak aplikasi single-page dengan penggunaan memori yang jauh lebih kecil dibandingkan browser. Jika Draco menemui hambatan yang tidak dapat dilewati, draco scrape keluar dengan kode 3, needs_browser. Periksa kondisi ini dalam skrip, karena file kosong dengan kode keluar 0 dapat menyebabkan kegagalan yang secara diam-diam merusak konteks agent:
draco scrape https://example.com > page.md
echo "exit=$?"playwright-service milik Firecrawl menggunakan Chromium nyata, sehingga merender halaman seperti yang dirender browser. Namun, build self-hosted tetap berbeda dari produk hosted. Dokumentasi menyatakan bahwa instance self-hosted tidak memiliki akses ke Fire Engine. Karena itu, fitur anti-blocking dan rotasi IP pada layanan cloud tidak tersedia, dan endpoint /agent serta /browser tidak didukung. Hound sengaja berada di antara kedua pendekatan tersebut. Hound mengambil konten melalui HTTP dan melakukan eskalasi untuk setiap request. Browser yang tetap aktif akan ditutup setelah timeout idle, sehingga server yang tidak sibuk tetap mendekati penggunaan resource baseline.
Instal Draco dengan versi yang ditetapkan
README mendokumentasikan penginstal satu baris. Baca tindakan yang dilakukannya sebelum meneruskannya ke shell: penginstal tersebut memasang Draco ke $HOME/.draco/bin/draco, selalu menggunakan rilis latest, dan tidak memeriksa tanda tangan atau hash. Pada server, tetapkan versinya dan verifikasi hasil unduhan.
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 SHA256SUMSPerintah tersebut mencetak draco-linux-x86-64.tar.gz: OK. Baris FAILED berarti byte yang Anda miliki berbeda dari byte yang dipublikasikan proyek. Hapus file tersebut, lalu mulai lagi.
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.comPerintah terakhir mencetak halaman contoh dalam format markdown dalam waktu jauh di bawah satu detik. find bukan hiasan: tata letak arsip bukan bagian dari kontrak publik proyek, dan penginstal resmi menemukan binary dengan cara yang sama.
Jalankan daemon menggunakan akun khusus, bukan akun login Anda. Tulis /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.targetsudo 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 memberikan respons segera setelah daemon mulai listening. Connection refused berarti daemon belum listening, jadi baca journalctl -u draco -n 50. Penyebab yang umum adalah proses lain sudah menggunakan port 3002, karena port tersebut juga merupakan port default Firecrawl, dan --port memindahkan salah satunya. Pelajari unit file lebih lanjut di sini: unit dan timer service systemd.
Sekarang lakukan pengambilan dengan cara yang akan digunakan agent Anda:
curl -X POST http://127.0.0.1:3002/v1/scrape \
-H 'content-type: application/json' \
-d '{"url": "https://example.com", "formats": ["markdown"]}'Jauhkan daemon fetch dari Internet publik
API fetch tanpa autentikasi merupakan open proxy. Siapa pun yang dapat menjangkau port tersebut dapat membuat server Anda meminta URL apa pun menggunakan alamat IP Anda, sedangkan laporan penyalahgunaan akan dikirim kepada provider Anda, bukan kepada pelakunya. Flag serve yang didokumentasikan untuk Draco tidak mencakup API key, sehingga perlindungannya harus berasal dari jaringan. Pertahankan bind default 127.0.0.1 ketika agent berjalan pada mesin yang sama. Jika agent berada di mesin lain, hubungkan kedua sisi melalui tunnel privat. VPN WireGuard yang Anda host sendiri biasanya merupakan pilihan yang tepat. Bind agent ke alamat tunnel, bukan ke 0.0.0.0. Kemudian, periksa dari mesin lain bahwa tidak ada respons pada IP publik tersebut. dasar-dasar firewall ufw dan akun pengguna dengan hak minimum membahas kedua aspek tersebut.
Apakah kode agent Anda akan berubah? Kompatibilitas API dalam praktik
Draco merespons route Firecrawl v1: /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape, dan /v1/search. README-nya menyatakan bahwa field yang tidak dikenal diterima dan diabaikan. Agent yang sudah mengirim permintaan ke /v1/scrape hanya memerlukan base URL baru. Tidak ada perubahan lain yang diperlukan. Perhatikan perubahan di sisi lain: halaman self-hosting Firecrawl kini melakukan pengujian dengan /v2/crawl, dan SDK saat ini menggunakan v2. Karena itu, client v2 yang diarahkan ke Draco akan meminta route yang tidak disediakan Draco. Uji setiap pemanggilan dengan curl sebelum mengubah kode agent. Baca body JSON, bukan hanya status code, karena perbedaan implementasi biasanya terletak pada nama field.
Robots.txt, batas laju, dan batas yang harus dipatuhi
Secara default, Draco membaca robots.txt, sedangkan --ignore-robots menonaktifkan perilaku tersebut. Firecrawl mendokumentasikan default yang sama. Biarkan keduanya apa adanya. Setelah itu, atur kecepatan Anda sendiri: --delay menambahkan jeda dalam milidetik di antara permintaan, dan --max-concurrency membatasi pekerjaan paralel, dengan 8 sebagai default daemon. Nilai dua hingga empat lebih ringan bagi koneksi VPS bersama dan jarang lebih lambat secara keseluruhan, karena situs yang mulai membatasi laju Anda memerlukan waktu lebih lama daripada waktu yang dihemat melalui konkurensi. Simpan hasil yang diambil dalam cache agar proses agent kedua tidak menambah beban pada sumber. Ini juga merupakan pos biaya termurah dalam mengendalikan biaya yang ditimbulkan agent AI bagi Anda.
Dinding challenge adalah topik yang berbeda, dan Trawl dibuat khusus untuk mengatasinya: Cloudflare Turnstile, reCAPTCHA, hCaptcha, dan GeeTest. Dinding challenge berarti situs secara eksplisit menolak trafik otomatis. Menghindarinya berarti melanggar ketentuan penggunaan situs, dan di beberapa tempat juga melanggar hukum. Karena itu, panduan ini hanya membahas infrastruktur pengambilan data. Teknik yang dapat melewati dinding tersebut juga merupakan teknik yang dipantau dan diblokir oleh pemilik situs. Akibatnya, pipeline yang dibangun berdasarkan teknik tersebut rapuh sekaligus tidak menghormati situs. Jika sebuah sumber sangat penting, cari RSS feed, API publik, atau ekspor massal miliknya. Setiap opsi lebih murah untuk dijalankan, dan tidak ada yang berhenti berfungsi pada minggu ketika dinding tersebut berubah.
Hubungkan ke agent melalui MCP
MCP (model context protocol) adalah antarmuka yang digunakan agent untuk memanggil tool. Draco menyertakan server MCP dalam binary yang sama, melalui stdio:
{ "mcpServers": { "draco": { "command": "draco", "args": ["mcp"] } } }Tool tersebut kemudian muncul pada agent sebagai draco_scrape, draco_search, dan set draco_interact_*. Stdio hanya berfungsi jika proses agent dan binary berada pada mesin yang sama, karena transport-nya menggunakan input standar proses tersebut. Untuk agent pada host lain, Hound menyediakan MCP melalui HTTP: hound --http --host 127.0.0.1 --port 8765 memublikasikan endpoint pada http://127.0.0.1:8765/mcp, yang diakses melalui tunnel. Pilihan transport dan hal-hal yang perlu diekspos dijelaskan dalam menjalankan server MCP pada VPS.
Ambil pasangan data melalui pencarian. Agent yang hanya dapat melakukan fetch akan menunggu Anda memberikan URL. Tambahkan instance pencarian SearXNG yang di-host sendiri agar agent dapat menemukannya sendiri, dengan pola yang sama seperti skill pencarian browser yang dibangun di atas SearXNG. Setelah daemon berjalan, layanan ini dapat digunakan bersama oleh agent AI yang di-host sendiri mana pun yang Anda jalankan.
FAQ
Apakah saya memerlukan browser tanpa antarmuka grafis untuk mengambil halaman bagi agen AI?
Tidak untuk sebagian besar halaman. Dokumentasi, blog, dan artikel berita yang dirender di server biasanya dikembalikan secara lengkap melalui pengambilan HTTP biasa yang dilanjutkan dengan proses HTML ke Markdown. Draco menggunakan pendekatan ini pada tier yang lebih rendah, dengan waktu sekitar 300 ms per halaman tanpa browser menurut angka dari proyek tersebut. Browser bermanfaat untuk aplikasi yang dirender di sisi klien, karena HTML yang dikirim hanya berupa kerangka kosong. Isolate V8 milik Draco menangani banyak kasus di antara kedua kondisi tersebut tanpa proses browser. Jika tidak dapat melakukannya, Draco keluar dengan kode 3, needs_browser.
Berapa banyak RAM yang diperlukan Firecrawl yang di-host sendiri pada VPS?
File compose menetapkan batas 8 GB untuk container api dan 4 GB untuk container Playwright. Stack yang sama juga menjalankan Redis, RabbitMQ, PostgreSQL, dan FoundationDB. Siapkan RAM sebesar 8 GB. Pada mesin dengan RAM 2 GB, kernel akan menghentikan container saat beban tinggi karena kehabisan memori. Tanda pertama biasanya berupa container yang dimulai ulang di docker compose ps tanpa informasi yang berguna dalam log aplikasi. Konfirmasikan kondisi tersebut dengan dmesg -T | tail.
Apakah Draco merupakan pengganti langsung untuk Firecrawl API?
Untuk endpoint v1, fungsinya hampir setara. Draco menyediakan /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape, dan /v1/search. Draco juga mengabaikan field permintaan yang tidak dikenalnya. Karena itu, klien yang dibuat untuk Firecrawl v1 biasanya hanya memerlukan perubahan base URL. Draco bukan produk hosted. Tidak ada kumpulan proxy terkelola di belakangnya, dan route v2 yang lebih baru dari Firecrawl tidak termasuk dalam antarmukanya. Verifikasi setiap panggilan yang dibuat agen Anda dengan curl terlebih dahulu.
Apakah self-hosting scraper berarti saya dapat mengabaikan robots.txt?
Tidak. Lokasi eksekusi kode tidak mengubah konten yang dipublikasikan situs atau hal yang diizinkan oleh ketentuannya. Draco dan Firecrawl sama-sama mematuhi robots.txt secara default. Flag override tersedia untuk situs yang Anda miliki atau yang telah memberikan izin tertulis kepada Anda untuk melakukan crawling. Batas laju tetap diberlakukan oleh server tujuan. Karena itu, --delay yang sopan dengan konkurensi rendah membantu menjaga alamat IP Anda tetap dapat digunakan. Stack yang hanya berfungsi dengan melewati challenge wall akan berhenti berfungsi tanpa peringatan.