자체 호스팅 Firecrawl 대안 비교 및 설치 가이드
Draco, Hound, Firecrawl 자체 호스팅 버전을 RAM 사용량과 헤드리스 브라우저 필요성 기준으로 비교합니다. VPS 환경에서 최적의 크롤링 도구를 선택하고 MCP를 통해 에이전트와 연결하는 실무적인 설치 방법을 상세히 안내합니다.
자체 호스팅 Firecrawl 대안이 갖추어야 할 기능
자체 호스팅 Firecrawl 대안의 역할은 명확합니다. URL을 입력받아 에이전트가 읽을 수 있는 깔끔한 markdown 형식으로 변환하여 반환하는 것입니다. 호스팅된 API는 페이지당 비용을 청구하므로 에이전트의 탐색 범위가 넓어질수록 비용이 증가하지만, 이미 사용 중인 VPS를 활용하면 동일한 작업을 수행할 수 있습니다. 프로젝트들은 한 가지 질문을 기준으로 나뉩니다. 바로 헤드리스 브라우저(창 없이 실행되는 실제 브라우저 엔진)를 서버에서 직접 구동해야 하는가 하는 점입니다.
이 질문에 대한 답에 따라 메모리 점유율, 페이지당 처리 비용, 그리고 빈 페이지가 반환되는지 여부가 결정됩니다. 이 가이드에서는 Draco, Hound, 그리고 자체 호스팅 Firecrawl 릴리스를 비교하고, 가장 가벼운 버전을 특정 버전으로 설치한 뒤 MCP(Model Context Protocol)를 통해 에이전트와 연결하는 방법을 다룹니다.
네 가지 프로젝트와 각 프로젝트의 실체
Draco는 Rust로 작성된 단일 바이너리이며 MIT 또는 Apache-2.0 라이선스를 따릅니다. 2026년 7월 16일에 릴리스 v0.20.5가 배포되었습니다. draco scrape <url>은 마크다운을 stdout으로 출력합니다. draco serve는 Firecrawl이 사용하는 포트인 127.0.0.1:3002에서 응답하는 데몬을 실행합니다. 컨테이너 이미지를 제공하지 않으며 브라우저를 실행하지도 않습니다.
Firecrawl self-hosted는 호스팅 제품의 기반이 되는 엔진이며 AGPL-3.0 라이선스를 따릅니다. docker-compose.yaml에는 playwright-service, api, redis, rabbitmq, nuq-postgres, foundationdb, foundationdb-init 등 7개의 서비스가 정의되어 있습니다. 소규모 분산 시스템을 운영해야 한다는 대가로 실제 크롤링 큐를 사용할 수 있습니다.
Hound는 master-fetch 저장소에 위치하며 hound-mcp이라는 이름으로 PyPI에 배포됩니다. MIT 라이선스를 따르며 2026년 8월 3일 기준 버전은 13.0.1입니다. Python 3.11 이상이 필요합니다. 이 도구는 MCP 서버로서의 역할이 우선이며 페처(fetcher)로서의 역할이 그다음입니다. 일반 HTTP 요청을 먼저 시도하고, 일반적인 가져오기가 차단되었을 때만 Patchright 브라우저를 실행합니다.
Trawl은 다른 프로젝트를 검색하다가 마주치는 경우가 많아 여기에 포함되었으며, 수행하는 작업이 다릅니다. 이 도구는 *arr 미디어 스택에서 FlareSolverr를 대체하기 위해 핑거프린트가 패치된 Firefox를 사용하여 JavaScript 챌린지와 CAPTCHA를 해결합니다. 마크다운 추출기가 아닙니다. 아래의 에티켓 섹션에서는 이러한 차이점이 왜 에이전트 스택에 이 도구를 포함할지 여부를 결정하는 기준이 되는지 설명합니다.
브라우저 풀이 소규모 VPS의 성능을 저하시키는 이유
열려 있는 각 브라우저 탭은 고유한 DOM(Document Object Model)과 JavaScript 힙을 가진 별도의 렌더러 프로세스입니다. 따라서 메모리 사용량은 하루에 가져오는 페이지 수가 아니라, 동시에 열려 있는 페이지 수에 따라 증가합니다. 이 프로젝트 중 두 곳은 이러한 비용을 자체 compose 파일에 명시하고 있습니다.
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 파일은 api 컨테이너의 메모리 제한을 8 GB로, Playwright 컨테이너는 4 GB로 설정하며, 이에 맞춰 스왑 제한도 설정합니다. Hound의 compose 파일은 Chromium이 포함된 컨테이너 하나에 3 GB를 할당합니다. 이는 프로젝트 측에서 선택한 상한선이며, 유휴 상태의 측정값이 아닌 공개된 수치입니다. 또한 Redis, RabbitMQ, PostgreSQL, FoundationDB는 Firecrawl 수치와 별개로 추가적인 메모리를 요구합니다.
보유한 RAM보다 높은 상한선은 아무런 의미가 없습니다. 서버의 메모리가 부족해지면 커널의 OOM(out-of-memory) killer가 프로세스를 강제 종료하므로, 애플리케이션 로그에 오류 기록 없이 컨테이너가 docker compose ps에서 사라집니다. 원인을 알 수 없는 재시작이 발생하면 dmesg -T | tail을 확인하십시오. 전체 Firecrawl 스택을 운영하려면 8 GB의 메모리를 예산으로 잡고, 4 GB를 테스트 환경의 최소 사양으로 간주하십시오. 서비스별 메모리 설정 방법은 Docker Compose의 메모리 제한에서 다룹니다.
브라우저와 관련된 또 다른 세부 사항 하나가 사용자들의 시간을 낭비하게 만듭니다. Docker는 기본적으로 컨테이너에 /dev/shm의 공유 메모리를 제공하는데, Chromium은 이곳에 렌더러 버퍼를 배치하므로 무거운 페이지를 로드할 때 충돌이 발생합니다. 두 브라우저 스택 모두 이 값을 높여 사용합니다. Hound의 compose 파일에는 shm_size: "1gb" 설정이 포함되어 있습니다. Playwright를 기반으로 이미지를 빌드할 때는 해당 라인을 복사하여 적용하십시오.
JavaScript가 많은 페이지에서의 추출 품질
정적 HTML, 서버 사이드 렌더링 블로그, 문서 페이지, 뉴스 기사 등은 모두 거의 동일한 마크다운을 반환하므로 가장 빠른 도구가 유리합니다. 차이는 클라이언트 사이드 렌더링 페이지에서 나타나는데, 이 경우 전달되는 HTML은 빈 껍데기이며 텍스트는 로드 후 JavaScript를 통해 도착하기 때문입니다.
Draco는 단계별로 대응합니다. Tier 0과 Tier 1은 JavaScript 없이 HTML을 파싱합니다. Tier 2는 브라우저가 없는 JavaScript 엔진인 프로세스 내 V8 isolate 안에서 페이지 자체의 JavaScript를 실행합니다. README에 따르면 해당 환경의 페이지 코드는 호스트 기능 바인딩에 접근할 수 없습니다. 이는 브라우저 메모리의 일부만 사용하여 많은 단일 페이지 애플리케이션(SPA)을 처리할 수 있게 합니다. Draco가 통과할 수 없는 장벽을 만나면 draco scrape는 needs_browser 코드로 종료됩니다. 빈 파일이 0 종료 코드를 반환하면 에이전트의 컨텍스트를 조용히 오염시키는 실패가 되므로 스크립트에서 이를 확인해야 합니다.
draco scrape https://example.com > page.md
echo "exit=$?"Firecrawl의 playwright-service는 실제 Chromium을 구동하므로 브라우저가 렌더링하는 그대로를 렌더링합니다. 자체 호스팅 빌드는 호스팅되는 제품과는 다릅니다. 문서에 따르면 자체 호스팅 인스턴스는 Fire Engine에 접근할 수 없으므로 클라우드 서비스의 안티 블로킹 및 IP 로테이션 기능을 사용할 수 없으며, /agent 및 /browser 엔드포인트도 지원되지 않습니다. Hound는 의도적으로 그 중간에 위치합니다. HTTP를 통해 데이터를 가져오고 요청마다 단계를 높이며, 유휴 시간 초과 후에는 준비된 브라우저를 종료하므로 조용한 서버는 기준 성능을 유지할 수 있습니다.
고정된 버전으로 Draco 설치하기
README에는 한 줄짜리 설치 명령어가 기재되어 있습니다. 이를 셸로 파이프하기 전에 어떤 작업을 수행하는지 확인하십시오. 이 명령어는 $HOME/.draco/bin/draco에 설치를 진행하며, 항상 latest 릴리스를 가져오고, 서명이나 해시 검증을 수행하지 않습니다. 서버 환경에서는 버전을 고정하고 다운로드 파일을 검증해야 합니다.
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이 명령은 draco-linux-x86-64.tar.gz: OK를 출력합니다. FAILED 줄이 나타난다면 현재 보유한 바이트가 프로젝트에서 배포한 바이트와 일치하지 않는다는 의미이므로, 파일을 삭제하고 다시 시작하십시오.
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마지막 명령은 예제 페이지를 1초 이내에 마크다운 형식으로 출력합니다. find은 단순한 장식이 아닙니다. 아카이브 구조는 프로젝트의 공개 계약에 포함되지 않으며, 공식 설치 프로그램도 동일한 방식으로 바이너리 위치를 찾습니다.
데몬은 로그인한 사용자 계정이 아닌 전용 계정으로 실행하십시오. /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가 응답합니다. Connection refused이 출력되면 수신 대기 중이 아니라는 뜻이므로 journalctl -u draco -n 50을 읽어보십시오. 일반적으로는 다른 프로세스가 이미 3002 포트를 점유하고 있을 때 발생합니다. 이는 Firecrawl의 기본 포트이기도 하므로, --port를 사용하여 둘 중 하나를 변경하십시오. 유닛 파일에 대한 자세한 내용은 systemd 서비스 유닛 및 타이머를 참조하십시오.
이제 에이전트가 사용할 방식으로 데이터를 가져오십시오.
curl -X POST http://127.0.0.1:3002/v1/scrape \
-H 'content-type: application/json' \
-d '{"url": "https://example.com", "formats": ["markdown"]}'fetch 데몬을 공용 인터넷에 노출하지 마십시오
인증이 없는 fetch API는 오픈 프록시와 같습니다. 해당 포트에 접근할 수 있는 사람은 누구나 귀하의 서버를 통해 임의의 URL을 요청하게 만들 수 있으며, 이로 인한 악용 신고는 공격자가 아닌 귀하의 호스팅 제공업체로 전달됩니다. Draco의 문서화된 serve 플래그에는 API 키 설정이 포함되어 있지 않으므로, 네트워크 수준에서 보호해야 합니다. 에이전트가 동일한 서버에서 실행 중이라면 기본값인 127.0.0.1 바인딩을 유지하십시오. 에이전트가 다른 곳에 있다면 양쪽 끝을 사설 터널로 연결하십시오. 직접 호스팅하는 WireGuard VPN이 일반적인 해결책이며, 0.0.0.0 대신 터널 주소로 바인딩해야 합니다. 그 후 다른 기기에서 공용 IP로 아무런 응답이 오지 않는지 확인하십시오. ufw 방화벽 기초와 최소 권한 사용자 계정 설정이 이 보안의 두 가지 핵심 요소입니다.
에이전트 코드를 변경해야 합니까? 실무에서의 API 호환성
Draco는 Firecrawl v1 경로인 /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape, /v1/search에 응답하며, README에는 알 수 없는 필드는 허용되고 무시된다고 명시되어 있습니다. 이미 /v1/scrape로 요청을 보내는 에이전트는 새로운 base URL만 설정하면 됩니다. 상대 측의 변경 사항을 확인하십시오. Firecrawl의 자체 호스팅 페이지는 현재 /v2/crawl로 테스트를 수행하며, 최신 SDK는 v2를 사용합니다. 따라서 Draco를 가리키는 v2 클라이언트는 Draco가 제공하지 않는 경로를 호출하게 됩니다. 에이전트 코드를 수정하기 전에 curl으로 각 호출을 테스트하십시오. 또한 상태 코드보다는 JSON 본문을 읽어야 합니다. 이러한 구현체들의 차이는 주로 필드 이름에서 발생하기 때문입니다.
Robots.txt, 속도 제한, 그리고 지켜야 할 선
Draco는 기본적으로 robots.txt를 읽으며, --ignore-robots를 사용하면 이를 비활성화할 수 있습니다. Firecrawl도 동일한 기본 설정을 따릅니다. 두 설정 모두 그대로 두는 것이 좋습니다. 그 후 적절한 속도를 설정하십시오. --delay은 요청 간의 간격을 밀리초 단위로 설정하며, --max-concurrency은 병렬 작업 수를 제한합니다. 데몬의 기본값은 8입니다. 공유 VPS 환경에서는 2에서 4 정도로 설정하는 것이 더 원만하며, 전체적인 속도 면에서도 크게 느려지지 않습니다. 사이트에서 속도 제한을 걸기 시작하면 병렬 처리로 얻는 이득보다 더 많은 시간이 소요되기 때문입니다. 가져온 데이터는 캐싱하여 두 번째 에이전트 실행 시 원본 사이트에 부하를 주지 않도록 하십시오. 이는 AI 에이전트 비용 제어에서 가장 저렴하게 비용을 절감하는 방법이기도 합니다.
챌린지 월(Challenge wall)은 별개의 주제이며, Trawl은 바로 이를 위해 설계되었습니다. Cloudflare Turnstile, reCAPTCHA, hCaptcha, GeeTest 등이 이에 해당합니다. 챌린지 월은 사이트가 자동화된 트래픽을 명시적으로 거부하는 상태입니다. 이를 우회하는 것은 사이트 이용 약관에 위배되며, 일부 지역에서는 법적 문제가 될 수 있으므로 이 가이드는 데이터 수집 인프라 구축까지만 다룹니다. 챌린지 월을 통과하는 기술은 사이트 운영자가 상시 모니터링하고 차단하는 대상이므로, 이를 기반으로 구축된 파이프라인은 취약할 뿐만 아니라 무례한 방식입니다. 특정 소스가 매우 중요하다면 RSS 피드, 공개 API, 또는 대량 내보내기(bulk export) 기능을 찾으십시오. 이러한 방식이 운영 비용이 더 저렴하며, 챌린지 월이 변경되더라도 서비스가 중단되지 않습니다.
MCP를 통해 에이전트와 연결하기
MCP(model context protocol)는 에이전트가 도구를 호출할 때 사용하는 인터페이스입니다. Draco는 동일한 바이너리 내에 MCP 서버를 포함하고 있으며 stdio를 통해 통신합니다:
{ "mcpServers": { "draco": { "command": "draco", "args": ["mcp"] } } }그러면 도구는 에이전트에게 draco_scrape, draco_search 및 draco_interact_* 세트로 나타납니다. Stdio는 에이전트 프로세스와 바이너리가 동일한 머신에 있을 때만 작동합니다. 전송 방식이 해당 프로세스의 표준 입력이기 때문입니다. 다른 호스트에 있는 에이전트의 경우, Hound가 대신 HTTP를 통해 MCP를 제공합니다: hound --http --host 127.0.0.1 --port 8765은 http://127.0.0.1:8765/mcp에 엔드포인트를 게시하며, 터널을 통해 이 엔드포인트에 접근할 수 있습니다. 전송 방식 선택 및 노출할 항목에 대한 내용은 VPS에서 MCP 서버 실행하기를 참조하십시오.
검색을 통해 쌍 가져오기. 가져오기만 가능한 에이전트는 사용자가 URL을 제공할 때까지 기다립니다. 자체 호스팅 SearXNG 검색 인스턴스를 추가하면 에이전트가 스스로 URL을 찾을 수 있으며, 이는 SearXNG 기반 브라우저 검색 기술과 동일한 형태입니다. 데몬이 실행되면, 이는 사용 중인 자체 호스팅 AI 에이전트 중 무엇이든 공유하여 사용할 수 있는 하나의 서비스가 됩니다.
FAQ
AI 에이전트가 페이지를 가져올 때 헤드리스 브라우저가 필요한가요?
대부분의 페이지에서는 필요하지 않습니다. 서버에서 렌더링된 문서, 블로그, 뉴스 기사는 일반적인 HTTP 요청과 HTML-to-markdown 변환만으로도 충분한 정보를 얻을 수 있습니다. Draco는 하위 계층에서 브라우저 없이 페이지당 약 300 ms의 속도로 이를 처리합니다. 브라우저는 전달받은 HTML이 빈 껍데기인 클라이언트 렌더링 애플리케이션에서만 메모리 자원을 소모합니다. Draco의 V8 isolate는 브라우저 프로세스 없이도 이러한 중간 영역을 대부분 처리하며, 처리가 불가능할 경우 needs_browser 코드 3으로 종료됩니다.
VPS에서 Firecrawl을 직접 호스팅하려면 RAM이 얼마나 필요한가요?
compose 파일은 api 컨테이너에 8 GB, Playwright 컨테이너에 4 GB의 메모리 제한을 설정합니다. 동일한 스택에서 Redis, RabbitMQ, PostgreSQL, FoundationDB도 함께 실행됩니다. 8 GB를 확보하십시오. 2 GB 환경에서는 부하가 걸릴 때 커널의 OOM(out-of-memory) 킬러가 컨테이너를 강제 종료합니다. 이때 첫 징후는 docker compose ps에서 컨테이너가 재시작되는 것이며 애플리케이션 로그에는 유용한 정보가 남지 않으므로, dmesg -T | tail를 통해 이를 확인해야 합니다.
Draco는 Firecrawl API를 그대로 대체할 수 있나요?
v1 엔드포인트의 경우 거의 유사합니다. Draco는 /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape 및 /v1/search을 제공하며, 알 수 없는 요청 필드는 무시합니다. 따라서 Firecrawl v1을 기반으로 작성된 클라이언트는 일반적으로 기본 URL만 변경하면 됩니다. 다만 호스팅 서비스와는 다르므로 관리형 프록시 풀이 없으며, Firecrawl의 최신 v2 경로는 지원하지 않습니다. 에이전트가 수행하는 각 호출을 먼저 curl로 검증하십시오.
스크레이퍼를 직접 호스팅하면 robots.txt를 무시해도 되나요?
아닙니다. 코드가 어디에서 실행되든 사이트가 게시한 내용이나 이용 약관은 변하지 않습니다. Draco와 Firecrawl 모두 기본적으로 robots.txt를 준수합니다. 직접 소유하거나 크롤링 허가를 받은 사이트를 위해 무시(override) 플래그가 존재할 뿐입니다. 속도 제한은 상대 서버에서 강제로 적용되므로, 낮은 동시성으로 --delay을 설정하여 예의를 갖추어야 IP 주소가 차단되지 않습니다. 챌린지 월(challenge wall)을 우회해야만 작동하는 스택은 예고 없이 중단될 수 있습니다.