Cómo instalar Trawl en Docker - Motor scraping adaptativo que bypasa Cloudflare autohospedado

Trawl | Web Scraping | Docker

Trawl en Docker: Motor scraping adaptativo autohospedado que bypasa Cloudflare y captchas (alternativa FlareSolverr, Byparr)

Motor scraping self-hosted adaptive. Bypass nativo Cloudflare, Turnstile, reCAPTCHA, hCaptcha, GeeTest. Resultados cached 4-15seg. Sub-500ms cached repeats. Redis persistencia. FlareSolverr compatible (drop-in replacement *arr stack). API REST. Bun runtime. Dos tags hardware (latest, baseline). MIT open source.

¿Qué es Trawl?


Trawl es un motor de scraping web self-hosted que resuelve desafíos de protección (Cloudflare, captchas) de forma nativa sin APIs externas, permitiendo raspado de contenido web con total privacidad y cero cuotas/tokens, siendo compatible drop-in con stack *arr (Prowlarr, Jackett, Sonarr, Radarr) como reemplazo de FlareSolverr. Es la solución moderna para automatización web escalable sin limitaciones cloud.

Propuesta clave: Resolución nativa Cloudflare challenges (4-15 segundos). Captchas automáticos (Turnstile, reCAPTCHA, hCaptcha, GeeTest, Imperva experimental). Caching agresivo Redis (sub-500ms repeats). Pool de browsers pooled. Estrategia adaptativa (fetch → Cloudflare → browser). Cero APIs externas. Cero tokens/cuotas. FlareSolverr compatible (reemplazo directo Prowlarr/Jackett/Sonarr/Radarr). API REST simple. Docker compose fácil. Dos tags (latest para hardware moderno, baseline para Synology/kernel 4.4). Multiarch (amd64, arm64). Bun runtime (rápido). Activamente mantenido.

Características principales: Resolución adaptativa de 5 tiers: fetch simple (headers reales, UA Chrome) → Cloudflare cached (cookies Redis warmpool) → Cloudflare fresh (CF managed-mode 4-15s) → Browser context (captchas automáticos) → Custom headers. Soporta Cloudflare Interstitial, Turnstile, reCAPTCHA v2/v3, hCaptcha, GeeTest, Imperva (experimental). Caching redis por dominio. Session pooling per-domain. API v1 (metadata enriquecida: tier usado, timings, sessionCached, cookies) + API scrape simple. FlareSolverr compatible (url http://trawl:8191). Health checks. Soporte Docker secrets. Dos builds (latest AVX2, baseline kernel 4.4+). Logging detallado. Métricas debug. Open source MIT.

Para *arr stacks: Reemplazo FlareSolverr sin cuotas. Bypasa Cloudflare nativo. Caching inteligente. Setup simple Docker.

Características principales

Bypass nativo Cloudflare

Resuelve challenges en 4-15 seg. Sin APIs externas. Cero cuotas.

Captchas automáticos

Turnstile, reCAPTCHA, hCaptcha, GeeTest. Solución integrada.

Caching agresivo

Sub-500ms repeats. Redis persistencia. Por dominio session pooling.

Estrategia adaptativa

Fetch → CF cached → CF fresh → Browser. Escalata inteligente.

FlareSolverr compatible

Drop-in replacement Prowlarr, Jackett, Sonarr, Radarr (*arr stack).

API REST simple

v1 (metadata enriquecida) + scrape endpoint. JSON request/response.

Dos builds hardware

:latest (modern AVX2) + :baseline (kernel 4.4+, Synology compatible).

Browser pool + warmup

Boot 15-30s. Subsecuentes rápido. Pooled browsers reutilizables.

Multiarch Docker

amd64, arm64. Raspberry Pi, Synology, x86 server compatible.

Logging + métricas debug

Verbose logs. Timing data. Tier utilizado visible.

Docker Compose simple

Scraper + Redis included. .env config. Un comando up.

MIT open source

Código abierto. Activamente mantenido. GitHub community.

Requisitos del sistema

  • Docker & Docker Compose v2+
  • 2 GB - 8 GB RAM mínimo (browser pool, Redis)
  • 10 GB espacio disco (imagen + cache + logs)
  • Puerto 8191 (configurable, API scraping)
  • Redis integrado (para caching sesiones)
  • CPU moderno (AVX2) O baseline kernel 4.4+ (dos builds disponibles)
  • Conexión red estable (HTTP/HTTPS outbound)
  • Opcional: Prowlarr/Jackett/Sonarr/Radarr (para integración *arr)
Boot time: Primera ejecución 15-30 seg (browser pool warms). Ejecutiones subsecuentes rápidas (cached).

Instalación con Docker Compose

Opción 1: Git clone + docker compose (recomendado)

git clone https://github.com/germondai/trawl.git cd trawl cp .env.example .env docker compose up -d # Verificar health check curl http://localhost:8191/health

Opción 2: Docker Compose manual (si quieres control manual)

cat > docker-compose.yml << 'EOF' version: '3.8' services: trawl: image: ghcr.io/germondai/trawl:latest container_name: trawl restart: unless-stopped ports: - "8191:8191" environment: - TRAWL_PORT=8191 # Redis connection (local container por defecto) - REDIS_URL=redis://redis:6379 # Logging level: debug, info, warn, error - LOG_LEVEL=info depends_on: - redis volumes: - trawl_cache:/tmp/trawl redis: image: redis:7-alpine container_name: trawl_redis restart: unless-stopped volumes: - redis_data:/data command: redis-server --appendonly yes volumes: trawl_cache: redis_data: EOF docker compose up -d

Opción 3: Hardware antiguo (Synology, kernel 4.4+)

cat > docker-compose.yml << 'EOF' services: trawl: image: ghcr.io/germondai/trawl:baseline # :baseline instead of :latest ... rest same as above ... EOF

Acceder (API disponible)

http://localhost:8191/health - Health check

Primer test (scraping simple)

curl -X POST http://localhost:8191/v1 \ -H 'Content-Type: application/json' \ -d '{ "cmd":"request.get", "url":"https://nowsecure.nl", "maxTimeout":60000 }' # Respuesta incluye: tier usado, html, cookies, timings, sessionCached

Primeros pasos

1. Verificar health (container running)

curl http://localhost:8191/health # Respuesta: {"status":"ok"} si OK

2. Test scraping simple (sin protección)

curl -X POST http://localhost:8191/v1 \ -H 'Content-Type: application/json' \ -d '{ "cmd":"request.get", "url":"https://example.com", "maxTimeout":60000 }'

3. Test con Cloudflare (captcha automático)

curl -X POST http://localhost:8191/v1 \ -H 'Content-Type: application/json' \ -d '{ "cmd":"request.get", "url":"https://nowsecure.nl", "maxTimeout":60000 }' # Primera ejecución: bypasa CF (4-15seg) # Segunda ejecución: resultado cached (<500ms span="">

4. Simpler scrape endpoint (si Prowlarr/Jackett espera)

curl -X POST http://localhost:8191/scrape \ -H 'Content-Type: application/json' \ -d '{ "url":"https://example.com", "maxTimeout":60000 }'

5. Integrar con Prowlarr (reemplazo FlareSolverr)

  1. Prowlarr → Settings → Clients
  2. Busca "FlareSolverr" (Trawl es compatible)
  3. URL: http://trawl:8191 (si en Docker Compose) o http://localhost:8191 (if docker bridge)
  4. Guarda
  5. Prowlarr ahora usa Trawl para bypasear Cloudflare

6. Integrar con Jackett

  1. Jackett → Indexer Proxy Settings
  2. Proxy: "Flaresolverr"
  3. Host: http://trawl:8191
  4. Trawl resuelve CF antes retornar resultados

7. Ver logs detallados

docker logs -f trawl # Mostrará tier usado, timings, browsers activity

8. Configuración avanzada (.env)

cat > .env << 'EOF' TRAWL_PORT=8191 REDIS_URL=redis://redis:6379 LOG_LEVEL=debug BROWSER_POOL_SIZE=5 SESSION_CACHE_TTL=3600 EOF

9. Monitorear consumo (browser pool)

docker stats trawl trawl_redis # Trawl: típicamente 300-500MB RAM (browsers) + Redis

Casos de uso

  • *arr stack (Prowlarr, Jackett, Sonarr, Radarr): Bypass Cloudflare nativo. Reemplaza FlareSolverr. Cero cuotas.
  • Web scraping automatizado: Sitios con Cloudflare. Datos públicos. Automatización inteligente.
  • Data collection: APIs bloqueadas por CF. Scraping escalable. Caching eficiente.
  • Reverse proxy scraping: Integrable en cualquier stack web. API REST simple.
  • Testing web apps: Simula interacción usuario. Resuelve captchas automático. QA automation.

HTTPS con Caddy (si expones remoto)

Caddyfile (exponer scraper remoto seguro)

trawl.tudominio.com { reverse_proxy localhost:8191 # Opcional: proteger con basic auth basicauth / { usuario contraseña_fuerte_hash } }

Acceso remoto seguro

https://trawl.tudominio.com con HTTPS automático + auth

IMPORTANTE: Seguridad

Trawl NO debe exponerse sin autenticación. Usar Caddy basic_auth o firewall network-level. Limitar acceso solo *arr stack.

Gestión y mantenimiento

Ver logs detallados

docker logs -f trawl # Muestra tier usado, timings, bypass strategies

Limpiar cache Redis (si needed)

docker exec trawl_redis redis-cli FLUSHALL # ⚠️ Limpia TODO cache. Siguiente requests serán lentos.

Limpieza selectiva por dominio

docker exec trawl_redis redis-cli KEYS "example.com*" | xargs docker exec trawl_redis redis-cli DEL

Reiniciar containers

docker compose restart # O solo Trawl docker compose restart trawl

Actualizar a versión más reciente

docker compose pull docker compose up -d # O en repo clonado cd trawl && git pull && docker compose pull && docker compose up -d

Monitorear consumo (browsers + Redis)

docker stats trawl trawl_redis # Trawl: 300-500MB RAM (pools), Redis: 50-200MB (cache)

Backup Redis cache (importante)

docker exec trawl_redis redis-cli BGSAVE docker cp trawl_redis:/data/dump.rdb ./redis-backup-$(date +%Y%m%d).rdb

Comparativa con alternativas

vs FlareSolverr

Trawl gana: Bypass más rápido, captchas automáticos, caching inteligente, estrategia adaptativa, desarrollo activo. FlareSolverr gana: Más maduro, más comunidad histórica, Docker bien documentado.

vs Byparr

Trawl gana: Cero cuotas, self-hosted puro, performance, desarrollo activo. Byparr gana: Cloud simplicity, managed infrastructure.

vs requests-html + Selenium

Trawl gana: Cloudflare nativo, caching, optimizado. Selenium gana: Control fino browsers, custom scripts.

vs Bright Data / Residential Proxies

Trawl gana: Costo bajo/cero, self-hosted, privacidad. Bright gana: Escala masiva, IP rotation, support enterprise.

Mejor para: *arr stacks, pequeño-mediano scraping. Cero cuotas. Performance. Privacidad total.

Comentarios

Entradas populares de este blog

Cómo Instalar y configurar SERVIDOR VPN WIREGUARD en MIKROTIK 🔐 #VPN #Wireguard #Mikrotik #RouterOS

Cómo instalar y configurar DSM SYNOLOGY 7.2.2 en PC | Guía completa, instalación, RAID 1, SMB

Cómo INSTALAR y CONFIGURAR OpenVPN en MIKROTIK. Guía completa paso a paso.