SSD Nodes Learn 🎉 VPS desde $5.50/mes
Guías Matt ConnorPor Matt Connor · Actualizado 2026-08-07

Alternativas autoalojadas a Firecrawl para un VPS

Compara Draco, Hound y Firecrawl autoalojado por RAM, navegador headless y compatibilidad API. Incluye instalación fijada y conexión MCP para agentes.

Qué debe hacer una alternativa autoalojada a Firecrawl

Una alternativa autoalojada a Firecrawl tiene una sola función: recibir una URL y devolver la página como Markdown limpio que un agente pueda leer. Las API alojadas cobran por página, por lo que la factura aumenta cuanto más explora el agente. Un VPS que ya paga puede realizar el mismo trabajo. Los proyectos se diferencian en una cuestión: ¿es necesario iniciar en su servidor un navegador sin interfaz gráfica, es decir, un motor de navegador real que se ejecuta sin ventana?

La respuesta determina el consumo de memoria, el coste de cada página y qué páginas se devuelven vacías. Esta guía compara Draco, Hound y la versión autoalojada de Firecrawl, instala la opción más ligera en una versión fijada y la conecta a un agente mediante MCP (model context protocol).

Los cuatro proyectos y qué es realmente cada uno

Draco es un único binario escrito en Rust, con licencia MIT o Apache-2.0. La versión v0.20.5 se publicó el 16 de julio de 2026. draco scrape <url> imprime markdown en stdout. draco serve ejecuta un daemon que responde en 127.0.0.1:3002, el puerto que usa Firecrawl. No incluye una imagen de contenedor ni inicia ningún navegador.

Firecrawl self-hosted es el motor del producto alojado, con licencia AGPL-3.0. Su docker-compose.yaml define siete servicios: playwright-service, api, redis, rabbitmq, nuq-postgres, foundationdb y foundationdb-init. Incluye la cola de rastreo real, pero requiere ejecutar un pequeño sistema distribuido.

Hound se encuentra en el repositorio master-fetch y se distribuye en PyPI como hound-mcp, con licencia MIT y versión 13.0.1 a fecha del 3 de agosto de 2026. Requiere Python 3.11 o posterior. Es principalmente un servidor MCP y, en segundo lugar, un fetcher: intenta usar HTTP sin más y sólo inicia un navegador Patchright cuando la descarga HTTP simple devuelve una respuesta bloqueada.

Trawl aparece aquí porque los usuarios lo encuentran al buscar los otros proyectos, pero realiza una tarea diferente. Resuelve desafíos de JavaScript y CAPTCHAs mediante un Firefox con el fingerprint modificado, como sustituto de FlareSolverr en una pila multimedia *arr. No extrae markdown. La sección sobre buenas prácticas explica por qué esta diferencia determina si debe formar parte de la pila de agentes.

Por qué el grupo de navegadores acaba con los VPS pequeños

Cada pestaña abierta del navegador es un proceso renderer independiente que mantiene su propio DOM (modelo de objetos del documento) y su propio heap de JavaScript. Por tanto, la memoria aumenta según las páginas abiertas al mismo tiempo, no según las páginas descargadas al día. Dos de estos proyectos reflejan ese coste en sus propios archivos compose.

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

El archivo compose de Firecrawl limita el contenedor api a 8 GB y el contenedor Playwright a 4 GB, con límites de swap equivalentes. El compose de Hound establece 3 GB para un contenedor que incluye Chromium. Estos son límites máximos definidos por los proyectos. Son cifras publicadas, no mediciones de un sistema en reposo. Además, Redis, RabbitMQ, PostgreSQL y FoundationDB también necesitan su parte, aparte de las cifras de Firecrawl.

Un límite superior a la RAM disponible no sirve de nada. Cuando el servidor se queda sin memoria, el kernel termina un proceso mediante el out-of-memory killer. Por eso, un contenedor puede desaparecer de docker compose ps sin que aparezca ningún error en el registro de la aplicación. Consulte dmesg -T | tail después de cualquier reinicio cuya causa no pueda explicar. Reserve 8 GB para la pila completa de Firecrawl y considere 4 GB el mínimo para un servidor de pruebas. La configuración de los límites por servicio se explica en límites de memoria en Docker Compose.

Hay otro detalle del navegador que puede consumir toda una tarde. Docker asigna 64 MB de memoria compartida a un contenedor en /dev/shm, y Chromium coloca allí los búferes de los procesos renderer. Por eso puede bloquearse al procesar páginas pesadas. Ambas pilas de navegador aumentan ese valor: el compose de Hound incluye shm_size: "1gb". Copie esa línea en cualquier imagen que compile alrededor de Playwright.

Calidad de extracción en páginas con mucho JavaScript

En HTML estático, un blog renderizado en el servidor, una página de documentación o un artículo de noticias devuelven markdown casi idéntico, y gana la opción más rápida. La diferencia aparece en las páginas renderizadas en el cliente, donde el HTML entregado es una estructura vacía y el texto llega mediante JavaScript después de la carga.

Draco escala por niveles. Los niveles 0 y 1 analizan el HTML sin ejecutar JavaScript. El nivel 2 ejecuta el JavaScript de la página dentro de un aislamiento V8 en el mismo proceso. Es decir, usa el motor JavaScript sin un navegador alrededor, y el README indica que el código de la página no obtiene enlaces de capacidades del host en ese entorno. Esto cubre muchas aplicaciones de página única con una fracción de la memoria de un navegador. Cuando Draco encuentra un obstáculo que no puede superar, draco scrape termina con el código 3, needs_browser. Compruébelo en los scripts, porque un archivo vacío con un código de salida 0 es el fallo que contamina silenciosamente el contexto de un agente:

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

El servicio playwright-service de Firecrawl controla un Chromium real, por lo que renderiza lo mismo que renderiza un navegador. La versión autoalojada sigue sin ser el producto alojado: la documentación indica que las instancias autoalojadas no tienen acceso a Fire Engine. Por tanto, no incluyen las funciones de evasión de bloqueos ni la rotación de IP del servicio en la nube, y los endpoints /agent y /browser no son compatibles. Hound se sitúa deliberadamente entre ambas opciones. Obtiene el contenido mediante HTTP y escala por petición. Además, su navegador activo se cierra después de un tiempo de inactividad, por lo que un servidor sin actividad se mantiene cerca del consumo normal.

Instalar Draco con una versión fijada

El README documenta un instalador de una sola línea. Lea lo que hace antes de enviarlo a un shell: instala en $HOME/.draco/bin/draco, siempre obtiene la versión latest y no comprueba ninguna firma ni hash. En un servidor, fije la versión y verifique la descarga.

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

Ese comando muestra draco-linux-x86-64.tar.gz: OK. Una línea FAILED significa que los bytes que tiene no coinciden con los publicados por el proyecto, así que elimínelos y vuelva a empezar.

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

El último comando muestra la página de ejemplo como Markdown en bastante menos de un segundo. find no es decorativo: la estructura del archivo no forma parte del contrato público del proyecto, y el instalador oficial localiza el binario de la misma manera.

Ejecute el daemon con su propia cuenta en lugar de usar su usuario de inicio de sesión. Escriba /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 responde en cuanto el daemon está escuchando. Connection refused significa que no está escuchando, así que lea journalctl -u draco -n 50. La causa habitual es que otro proceso ya esté usando 3002, porque ese también es el puerto predeterminado de Firecrawl, y --port cambia uno de los dos. Más información sobre los archivos de unidad: unidades de servicio y temporizadores de systemd.

Ahora obtenga el contenido de la forma en que lo hará su agente:

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

Mantenga el daemon de fetch fuera de Internet público

Una API de fetch sin autenticación es un proxy abierto. Cualquiera que pueda alcanzar el puerto puede hacer que su servidor solicite cualquier URL desde su dirección IP. El informe de abuso llegará a su proveedor, no al responsable. Los flags documentados de Draco, serve, no incluyen una API key, por lo que la protección debe estar en la red. Mantenga el bind predeterminado, 127.0.0.1, cuando el agente se ejecute en el mismo equipo. Si el agente está en otro equipo, conecte ambos extremos mediante un túnel privado. Una VPN de WireGuard alojada por usted es la opción habitual. En ese caso, haga bind a la dirección del túnel en lugar de 0.0.0.0. Después, compruebe desde otro equipo que la IP pública no responda. Los conceptos básicos del firewall ufw y las cuentas de usuario con privilegios mínimos cubren las dos partes de esta configuración.

¿Cambiará el código de su agente? Compatibilidad de API en la práctica

Draco responde a las rutas de Firecrawl v1: /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape y /v1/search, y su README indica que acepta e ignora los campos desconocidos. Un agente que ya envía solicitudes a /v1/scrape sólo necesita una nueva URL base. No es necesario cambiar nada más. Compruebe qué cambió en el otro extremo: la página de autoalojamiento de Firecrawl ahora realiza las pruebas con /v2/crawl, y los SDK actuales usan v2. Por tanto, un cliente v2 apuntado a Draco solicita una ruta que Draco no publica. Pruebe cada llamada con curl antes de editar el código del agente y lea el cuerpo JSON en lugar del código de estado, porque las diferencias entre estas implementaciones suelen estar en los nombres de los campos.

Robots.txt, límites de tasa y el límite que no debe superar

Draco lee robots.txt de forma predeterminada, y --ignore-robots desactiva ese comportamiento. Firecrawl documenta el mismo valor predeterminado. No cambie ninguno de los dos. Después, establezca su propio ritmo: --delay introduce milisegundos entre las peticiones y --max-concurrency limita los trabajos en paralelo, con 8 como valor predeterminado del daemon. Un valor de dos a cuatro es más considerado con el enlace compartido de un VPS y rara vez resulta más lento en conjunto, porque un sitio que empieza a aplicar límites de tasa consume más minutos de los que se ahorran con la concurrencia. Almacene en caché lo que descargue para que una segunda ejecución del agente no genere carga adicional en el origen. Esa es también la partida más barata de controlar cuánto le cuesta un agente de IA.

Las páginas de desafío son un tema aparte, y Trawl está diseñado precisamente para ellas: Cloudflare Turnstile, reCAPTCHA, hCaptcha y GeeTest. Una página de desafío es la forma explícita en que un sitio rechaza el tráfico automatizado. Evitarla implica incumplir las condiciones de uso del sitio y, en algunos lugares, también la ley, por lo que esta guía se limita a la infraestructura de descarga. Las mismas técnicas que permiten superar una página de desafío son las que los propietarios de sitios detectan y bloquean, así que cualquier canalización basada en ellas también resulta frágil, además de inapropiada. Cuando una fuente es tan importante, busque su feed RSS, su API pública o una exportación masiva. Cada opción es más barata de ejecutar y ninguna deja de funcionar durante la semana en que cambia la página de desafío.

Conéctelo a un agente mediante MCP

MCP (model context protocol) es la interfaz que usa un agente para llamar a una herramienta. Draco incluye un servidor MCP en el mismo binario y lo ejecuta mediante stdio:

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

Las herramientas aparecen entonces en el agente como draco_scrape, draco_search y el conjunto draco_interact_*. Stdio sólo funciona cuando el proceso del agente y el binario están en la misma máquina, porque el transporte utiliza la entrada estándar de ese proceso. Para un agente en otro host, Hound ofrece MCP mediante HTTP: hound --http --host 127.0.0.1 --port 8765 publica un endpoint en http://127.0.0.1:8765/mcp, al que se accede a través del túnel. Las opciones de transporte y los elementos que se deben exponer se describen en ejecución de servidores MCP en un VPS.

Obtención de pares mediante búsquedas. Un agente que sólo puede obtener contenido espera a que le proporcione las URL. Añada una instancia de búsqueda SearXNG autoalojada para que pueda encontrarlas por sí mismo, con la misma estructura que la habilidad de búsqueda del navegador basada en SearXNG. Cuando el daemon está activo, es un servicio compartido para cualquiera de los agentes de IA autoalojados que ejecute.

FAQ

¿Necesito un navegador sin interfaz gráfica para obtener páginas para un agente de IA?

No para la mayoría de las páginas. La documentación, los blogs y los artículos de noticias renderizados en el servidor se reciben completos mediante una solicitud HTTP normal y un paso de conversión de HTML a Markdown. Eso es lo que Draco hace en sus niveles inferiores, con unos 300 ms por página sin navegador, según las cifras del propio proyecto. Un navegador justifica su consumo de memoria en las aplicaciones renderizadas en el cliente, donde el HTML entregado es un contenedor vacío. El aislamiento V8 de Draco cubre gran parte de ese punto intermedio sin iniciar un proceso de navegador y devuelve el código de salida 3, needs_browser, cuando no puede hacerlo.

¿Cuánta RAM necesita Firecrawl autohospedado en un VPS?

Su archivo compose establece un límite de 8 GB para el contenedor api y de 4 GB para el contenedor Playwright. La misma pila también inicia Redis, RabbitMQ, PostgreSQL y FoundationDB. Planifique 8 GB. En un equipo con 2 GB, el kernel elimina contenedores bajo carga mediante el OOM killer. El primer indicio es un contenedor reiniciado en docker compose ps sin información útil en el registro de la aplicación. Confírmelo con dmesg -T | tail.

¿Draco es un reemplazo directo de la API de Firecrawl?

Para los endpoints v1, la compatibilidad es alta. Sirve /v1/scrape, /v1/map, /v1/crawl, /v1/batch/scrape y /v1/search. Además, ignora los campos de solicitud que no conoce. Por eso, un cliente escrito para Firecrawl v1 normalmente sólo necesita una nueva URL base. No es el producto alojado: no incluye un conjunto de proxies administrado y las rutas v2 más recientes de Firecrawl no forman parte de la interfaz disponible. Verifique primero cada llamada que realice su agente con curl.

¿El autohospedaje de un scraper significa que puedo ignorar robots.txt?

No. El lugar donde se ejecuta el código no cambia lo que un sitio ha publicado ni lo que permiten sus condiciones. Draco y Firecrawl respetan robots.txt de forma predeterminada. La opción para omitirlo existe para los sitios que usted administra o para los que tiene permiso escrito de rastreo. Los límites de tasa se aplican en el extremo remoto de todos modos. Por eso, un --delay moderado con una concurrencia baja mantiene operativa su dirección IP. Una pila que sólo funciona al eludir una pantalla de desafío es una pila que puede dejar de funcionar sin aviso.

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