
Mecanismo de scraping auto-hospedado — contorna qualquer desafio JS e captcha: Cloudflare, Turnstile, reCAPTCHA, hCaptcha, GeeTest. Alternativa ao FlareSolverr e Byparr e substituto direto para a sua stack *arr.
O TRAWL começa com uma requisição HTTP rápida, reutiliza sessões de navegador já resolvidas e escala para o Camoufox e um proxy residencial opcional quando um site exige mais trabalho. Ele lida com desafios JavaScript e CAPTCHAs suportados e oferece um dashboard local para ver o que teve sucesso, o que falhou e o que levou tempo.
Para usuários existentes do FlareSolverr, o endpoint compatível /v1 funciona com o Prowlarr e outras ferramentas *arr. O roteamento adaptativo e a reutilização de sessões do TRAWL foram projetados para requisições mais rápidas e confiáveis; benchmarks selecionados na mesma máquina mostram respostas mais rápidas do que o FlareSolverr e o Byparr, com resultados variando conforme o site e o estado da sessão.
|
Bright Data - A plataforma mais poderosa para Web Unlocker, SERP API e ferramentas de web scraping. Por que Bright Data? • Web Unlocker - contorne qualquer proteção anti-bot • SERP API - resultados do Google, Bing e mais em tempo real • Scraping Browser e scrapers dedicados • Rede massiva de proxies residenciais • Feito para escala e confiabilidade Comece gratuitamente com o Bright Data! |
|
NodeMaven - O provedor de proxy mais eficiente para Web Scraping e Automação, com os IPs de mais alta qualidade do mercado. Por que NodeMaven? • Segmentação por CEP • 99,9% de uptime • Filtragem de IP: todos os proxies têm pontuação de fraude <97% • Nenhum KYC necessário • Ferramentas gratuitas exclusivas: Proxy Bandwidth Checker, Meta Tag Checker, IP Lookup e outras! Códigos especiais para usuários do TRAWL: • TRAWL35 - 35% de desconto em Proxies Móveis e Residenciais
• - 40% de desconto em Proxies ISP (Estáticos)
|

A captura de tela usa tráfego ilustrativo. Seu dashboard em http://localhost:8191/dashboard exibe apenas as requisições tratadas pela sua instância do TRAWL. Consulte o guia de métricas para configuração.
git clone https://github.com/germondai/trawl cd trawl cp .env.example .env
docker compose up -d
A primeira inicialização leva de 15 a 30 segundos enquanto o pool de navegadores aquece. As inicializações subsequentes são rápidas.
### Catálogos de aplicações NAS
Prefere uma instalação com um clique? O TRAWL está disponível nos catálogos de aplicações da comunidade tanto para TrueNAS como para Unraid:
- [TrueNAS Community Apps](https://apps.truenas.com/catalog/trawl_community/) —
abra **Apps → Discover Apps** e procure por **TRAWL**.
- [Unraid Community Apps](https://ca.unraid.net/apps/trawl-1o4q23p06utr4h) —
abra o separador **Apps** e procure por **Trawl**.
Agradecimentos aos contribuidores das comunidades TrueNAS e Unraid que empacotaram e publicaram estas integrações.
## API
### Compatível com FlareSolverr (`/v1`)```bash
curl -X POST http://localhost:8191/v1 \
-H 'Content-Type: application/json' \
-d '{"cmd":"request.get","url":"https://nowsecure.nl","maxTimeout":60000}'
/scrape)Retorna metadados mais ricos: tier, timings, sessionCached, lista completa de cookies.```bash
curl -X POST http://localhost:8191/scrape
-H 'Content-Type: application/json'
-d '{"url":"https://nowsecure.nl","maxTimeout":60000}'
### Ferramentas MCP (`/mcp`)
Defina `MCP_ENABLED=true` para expor as ferramentas Streamable HTTP independentes de cliente do TRAWL
para conteúdo legível, HTML, extração estruturada, capturas de ecrã e diagnósticos de navegador a qualquer
aplicação ou agente de IA compatível com MCP. Elas carregam URLs públicos conhecidos; o TRAWL não
fornece pesquisa ou classificação na web. Consulte o
[guia de integração MCP](https://github.com/germondai/trawl/blob/dev/apps/docs/integrations/mcp.md).
### Conectar Prowlarr / Jackett
Defina o URL do FlareSolverr para:```
http://localhost:8191 # running on the same host
http://trawl:8191 # running via Docker Compose on the same network
Alguns sites vinculam a liberação do Cloudflare à impressão digital completa da conexão do navegador que resolveu o desafio. O fluxo /v1 não pode ajudar nesse caso: o Prowlarr mantém apenas o cookie + user-agent e refaz a requisição da página com seu próprio cliente HTTP, o que faz o Cloudflare desafiar novamente — o cookie não é portável. Para esses indexadores, habilite o proxy de encaminhamento do TRAWL e adicione-o ao Prowlarr como um proxy HTTP:```env
MITM_ENABLED=true
MITM_PORT=8192
MITM_CA_DIR=/data/proxy-ca # persist the CA (mount a volume)
MITM_MAX_TIER=4 # cap escalation (e.g. 3 to stay off residential)
MITM_ALWAYS_SCRAPE=false # opt in to bypass the proxy's direct Tier 0 probe
Por padrão, o listener vincula `0.0.0.0` para que clientes em uma rede bridge do Docker possam alcançá-lo; defina `MITM_HOST=127.0.0.1` para restringi-lo ao loopback em um host bare-metal.
1. Instale a CA do proxy no trust store do cliente para que ele aceite os certificados por host:
`curl http://<trawl-host>:8191/proxy-ca.crt` → adicione ao CA store do contêiner Prowlarr
(por exemplo, um script linuxserver `/custom-cont-init.d` que o copia para
`/usr/local/share/ca-certificates/` e executa `update-ca-certificates`).
2. Prowlarr → Settings → Indexer Proxies → **HTTP**, host `<trawl-host>`, porta `8192`.
Atribua uma tag se apenas indexers selecionados devem usá-lo.
Requisições comuns usam um caminho direto HTTP/TLS. Respostas pequenas de HTML, JSON e texto são armazenadas em buffer para detecção de desafios; desafios detectados escalam pelo mesmo pipeline de camadas que `POST /scrape`. Vídeos e respostas binárias grandes são transmitidos diretamente. Requisições Range são encaminhadas de ponta a ponta e podem escalar quando sua resposta é um desafio detectado; upgrades de WebSocket usam um relay direto sem escalonamento para navegador.
Consulte a [documentação completa do proxy](https://github.com/germondai/trawl/blob/dev/apps/docs/proxy/overview.md) para detalhes de roteamento, tráfego suportado, limitações, instalação da CA e exemplos de cliente.
> ⚠️ Um proxy MITM pode se passar por qualquer host para um cliente que confie em sua CA. Exponha-o apenas em uma interface privada (localhost / uma rede Docker privada), nunca publicamente.
### Instalando o certificado CA do proxy
O proxy autogera uma CA raiz na primeira execução. Seu certificado e chave privada são persistidos em `MITM_CA_DIR` (padrão `/data/proxy-ca`). Certificados por host são emitidos e armazenados em cache na memória enquanto o TRAWL é executado; eles não precisam de instalação separada porque são assinados pela raiz persistente. Todo cliente que usa o proxy deve confiar nessa raiz. Sem isso, o HTTPS falha com `ERR_CERT_AUTHORITY_INVALID` (navegadores) ou `PKIX path building failed` (Java).
Baixe a CA uma vez por cliente:```bash
curl http://<trawl-host>:8191/proxy-ca.crt -o trawl-ca.crt
# or in a Docker setup where the API isn't reachable from outside:
docker cp trawl:/data/proxy-ca/ca.crt ./trawl-ca.crt
sudo security add-trusted-cert -d -r trustRoot
-k /Library/Keychains/System.keychain ./trawl-ca.crt
security find-certificate -c "TRAWL MITM Proxy CA"
sudo security delete-certificate -c "TRAWL MITM Proxy CA"
/Library/Keychains/System.keychain
#### Linux (Debian/Ubuntu — em todo o sistema para curl, wget, apt, etc.)```bash
sudo cp trawl-ca.crt /usr/local/share/ca-certificates/trawl-ca.crt
sudo update-ca-certificates
# Verify
awk '/BEGIN/{c++} c==2' /etc/ssl/certs/ca-certificates.crt | grep -c "TRAWL MITM"
sudo cp trawl-ca.crt /etc/pki/ca-trust/source/anchors/trawl-ca.crt sudo update-ca-trust
#### Trust stores do Firefox e do NSS
Instalações do Firefox que não usam raízes do sistema operacional precisam de uma importação NSS por perfil:```bash
# Firefox 115+ uses a file-backed NSS DB; older versions use the legacy libnssdb format.
# The certutil command is the same either way.
certutil -A -n "TRAWL MITM" -t "CT,C,C" -i trawl-ca.crt \
-d sql:$HOME/.mozilla/firefox/<profile-dir>
# Or via Firefox UI: Settings → Privacy & Security → Certificates → View Certificates →
# Authorities → Import… → check "Trust this CA to identify websites".
# Profile dir location: about:profiles in Firefox.
O Chrome usa o armazenamento de confiança do sistema no macOS e Windows, mas tem o seu próprio no Linux:```bash
#### Java (incluindo JDownloader)```bash
# Find the JRE cacerts file for your client.
# JDownloader: <install>/jre/lib/security/cacerts
keytool -importcert -alias trawl -file trawl-ca.crt \
-keystore "<path-to-cacerts>" -storepass changeit
# If `keytool` reports "Certificate already exists in keystore", use -delete first:
# keytool -delete -alias trawl -keystore "<path-to-cacerts>" -storepass changeit
Prowlarr, Sonarr e Radarr são aplicações .NET, não aplicações Java. Para as suas
instalações baseadas em Docker, adicione o CA ao armazenamento de confiança do sistema Linux do contentor. Um padrão comum do LinuxServer é um script /custom-cont-init.d:```yaml
volumes:
| `-s` | `--server` | `SERVER` | `http://localhost:8080` | URL base do servidor |
| `-t` | `--token` | `TOKEN` | | Token de autenticação |
| `-o` | `--output` | `OUTPUT` | | Arquivo de saída |
| `-f` | `--format` | `FORMAT` | `json` | Formato de saída |
| `-v` | `--verbose` | | | Saída detalhada |
| `-q` | `--quiet` | | | Modo silencioso |
| `-d` | `--debug` | | | Modo de depuração |
| `-c` | `--config` | `CONFIG` | | Arquivo de configuração |
| `-n` | `--no-color` | | | Desabilitar saída colorida |
| `-y` | `--yes` | | | Confirmar automaticamente |
| `-h` | `--help` | | | Mostrar mensagem de ajuda |
| `-V` | `--version` | | | Mostrar versão |
### Exemplos
```bash
# Iniciar o servidor
python3 server.py --port 8080
# Executar o cliente
python3 client.py --server http://localhost:8080
# Executar com opções
python3 client.py -s http://localhost:8080 -t mytoken -o output.json -f json -v
# Usar arquivo de configuração
python3 client.py -c config.yaml
# Modo silencioso
python3 client.py -q
# Modo de depuração
python3 client.py -d
project/
├── server.py # Arquivo principal do servidor
├── client.py # Arquivo principal do cliente
├── config.yaml # Arquivo de configuração
├── requirements.txt # Dependências do projeto
├── README.md # Documentação do projeto
├── LICENSE # Arquivo de licença
├── modules/ # Módulos do projeto
│ ├── __init__.py
│ ├── core.py # Módulo principal
│ ├── utils.py # Módulo de utilitários
│ └── handlers.py # Módulo de manipuladores
├── tests/ # Testes do projeto
│ ├── __init__.py
│ ├── test_core.py
│ └── test_utils.py
└── docs/ # Documentação do projeto
├── index.md
└── api.md
# Clonar o repositório
git clone https://github.com/username/project.git
cd project
# Criar ambiente virtual
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# ou
venv\Scripts\activate # Windows
# Instalar dependências
pip install -r requirements.txt
# Instalar dependências de desenvolvimento
pip install -r requirements-dev.txt
# Executar todos os testes
pytest
# Executar com cobertura
pytest --cov=modules --cov-report=html
# Executar testes específicos
pytest tests/test_core.py
# Executar com saída detalhada
pytest -v
# Executar em paralelo
pytest -n auto
# Executar linter
flake8 modules/
# Executar formatador
black modules/
# Executar verificador de tipos
mypy modules/
# Executar verificações de segurança
bandit -r modules/
# Executar todas as verificações
make lint
# Compilar o projeto
python3 -m build
# Compilar pacote wheel
python3 setup.py bdist_wheel
# Compilar pacote source
python3 setup.py sdist
# Limpar artefatos de compilação
make clean
# Compilar imagem Docker
docker build -t project:latest .
# Executar contêiner
docker run -d -p 8080:8080 --name project project:latest
# Executar com variáveis de ambiente
docker run -d -p 8080:8080 \
-e SERVER_PORT=8080 \
-e LOG_LEVEL=info \
--name project project:latest
# Usar docker-compose
docker-compose up -d
# Visualizar logs
docker-compose logs -f
# Parar contêiner
docker-compose down
# Instalar o pacote
pip install .
# Instalar em modo de desenvolvimento
pip install -e .
# Executar o servidor
python3 server.py --port 8080 --host 0.0.0.0
# Executar como serviço
systemctl start project
systemctl enable project
Problema: Porta já em uso
# Verificar processo usando a porta
lsof -i :8080
# Encerrar processo
kill -9 <PID>
# Ou usar porta diferente
python3 server.py --port 8081
Problema: Permissão negada
# Verificar permissões
ls -la
# Alterar permissões
chmod +x server.py
chmod +x client.py
Problema: Módulo não encontrado
# Verificar instalação do Python
python3 --version
# Verificar pacotes instalados
pip list
# Reinstalar dependências
pip install -r requirements.txt --force-reinstall
Problema: Erro de conexão
# Verificar conectividade
ping localhost
# Verificar portas abertas
netstat -tuln
# Verificar firewall
sudo ufw status
# Executar com saída de depuração
python3 server.py --debug
# Executar com nível de log
python3 server.py --log-level DEBUG
# Executar com rastreamento
python3 -m trace --trace server.py
# Mostrar ajuda
python3 server.py --help
# Mostrar versão
python3 server.py --version
# Verificar documentação
man project
# Verificar informações do pacote
pip show project
P: O que é este projeto?
R: Este é um projeto de código aberto que fornece...
P: Qual licença é usada?
R: Este projeto usa a licença MIT. Consulte o arquivo LICENSE para mais detalhes.
P: Como posso contribuir?
R: Consulte o arquivo CONTRIBUTING.md para diretrizes de contribuição.
P: Como posso relatar um problema?
R: Por favor, relate problemas através do GitHub Issues.
P: Quais versões do Python são suportadas?
R: Python 3.8 e superior.
P: Quais sistemas operacionais são suportados?
R: Linux, macOS e Windows.
P: Como posso melhorar o desempenho?
R: Considere usar cache, otimizar consultas e usar processamento assíncrono.
P: Como posso contribuir com código?
R: Faça um fork do repositório, crie um branch de funcionalidade, faça commit das alterações e envie um pull request.
Se você descobrir uma vulnerabilidade de segurança, por favor:
Este software é fornecido "como está", sem garantia de qualquer tipo,
expressa ou implícita, incluindo, mas não se limitando a, garantias de
comercialização, adequação a um propósito específico e não violação.
Este projeto está licenciado sob a Licença MIT - consulte o arquivo LICENSE para mais detalhes.
Aviso Legal: Este projeto é apenas para fins educacionais e de pesquisa. Os usuários são responsáveis por cumprir todas as leis e regulamentos aplicáveis. Os autores não são responsáveis por qualquer uso indevido ou danos causados por este software.```bash #!/usr/bin/with-contenv bash cp /config/trawl-ca.crt /usr/local/share/ca-certificates/trawl-ca.crt update-ca-certificates
O LinuxServer executa scripts em `/custom-cont-init.d/` quando o container inicia. Clientes Java como o
JDownloader requerem a importação separada com `keytool` descrita acima.
#### JDownloader 2 (Windows / macOS / Linux — instalação manual)
O JDownloader inclui a sua própria JRE; a CA deve ser importada nela.
1. Localize a JRE: `Settings → Advanced → Java Path` (no JDownloader) ou procure no diretório de instalação:
- Windows: `C:\Program Files\JDownloader 2\jre\lib\security\cacerts`
- macOS: `/Applications/JDownloader 2.app/Contents/app/jre/lib/security/cacerts`
- Linux: `<install>/jre/lib/security/cacerts`
2. Execute o comando `keytool -importcert` acima contra esse arquivo.
3. Reinicie o JDownloader.
#### Windows (repositório de confiança do sistema)```powershell
# Run PowerShell as Administrator.
Import-Certificate -FilePath .\trawl-ca.crt `
-CertStoreLocation Cert:\LocalMachine\Root
# Remove later
Get-ChildItem Cert:\LocalMachine\Root | Where-Object { $_.Subject -like "*TRAWL MITM*" } | Remove-Item
Todo método de instalação tem um caminho de remoção simétrico. Procure no seu repositório de confiança por
TRAWL MITM Proxy CA (o CN da CA) e exclua essa entrada. O certificado e a chave da CA também ficam em
<MITM_CA_DIR>/ca.crt e ca.key no host do TRAWL. Excluir qualquer um deles faz com que o TRAWL
gere uma nova raiz na próxima inicialização, então os clientes existentes devem instalar o novo certificado.
Request │ ▼ Tier 1: Plain HTTP fetch ────── success ──→ return (< 100ms) │ blocked ▼ Tier 2: Cached session ─────── success ──→ return (~500ms) │ cache miss / expired ▼ Tier 3: Fresh challenge solve ─ success ──→ cache + return │ IP flagged ▼ Tier 4: Residential proxy ──── success ──→ cache + return (15–45s) │ failed ▼ error
## Arquivos Docker Compose
| Arquivo | Descrição |
| ---------------------------- | -------------------------------------------------------- |
| `docker-compose.yml` | Scraper + Redis (padrão) |
| `docker-compose.minimal.yml` | Apenas scraper, sem Redis |
| `docker-compose.prod.yml` | Produção: `restart: always`, limite de memória, healthcheck |
## Imagens Docker (um pacote GHCR, duas variantes de release)
| Tag da imagem | Construída a partir de | Runtime | Caso de uso |
| ---------------------------------- | ------------------------------ | ----------------------------- | ---------------------------------------------------------- |
| `ghcr.io/germondai/trawl:latest` | `apps/api/Dockerfile` | Bun 1.4.2 (moderno, AVX2) | Padrão compacto — fingerprints Linux |
| `ghcr.io/germondai/trawl:baseline` | `apps/api/Dockerfile.baseline` | Bun 1.4.2 baseline (sem AVX2) | CPUs mais antigas / kernels mais antigos (Synology NAS, J4125, era Atom) |
Todas as tags ficam no mesmo pacote `ghcr.io/germondai/trawl` — compartilham o registry, mas diferem na origem do Dockerfile ou nos argumentos de build. Escolha a tag que se adequa ao seu hardware e saída:```yaml
# Modern hardware (most users)
image: ghcr.io/germondai/trawl:latest
# Older CPUs without AVX2 / Synology / older kernels
image: ghcr.io/germondai/trawl:baseline
Nota do Synology: muitas unidades Synology NAS (DSM 7.x em J4125 / hardware mais antigo) vêm com kernel 4.4.x, que o runtime moderno do Bun não consegue lidar totalmente. O Bun padrão requer kernel 5.1+ (5.6+ recomendado); a build baseline degrada graciosamente até o kernel 3.10. A tag :baseline é publicada para esse caso — confirmado funcionando em um Synology DS920+ (Celeron J4125, DSM 7.3.2, kernel 4.4.302): o contêiner inicia limpo, /health reporta saudável, e ele resolve desafios Cloudflare ao vivo via /v1 (veja #1). Publicado por workflows independentes do GitHub Actions: fazer push de uma tag de release como v1.7.0 cria :1.7.0, :latest, :1.7.0-baseline, e :baseline; a build noturna diária às 02:00 UTC cria :nightly e :nightly-<dev-sha> a partir do commit mais recente de dev.
TRAWL segue Semantic Versioning. Fazer push de uma tag git com prefixo v (ex.
v1.0.0) dispara publish.yml, que constrói e faz push da tag Docker correspondente sem prefixo
(ghcr.io/germondai/trawl:1.0.0) junto com :latest. A tag móvel :nightly e as tags imutáveis
:nightly-<shortsha> são construídas a partir da revisão dev verificada mais recente todos os dias às 02:00 UTC
ou em dispatch manual; pushes de branch não publicam imagens.
Veja a página de Releases para o histórico completo de versões
e CHANGELOG.md para o que mudou em cada uma.
Para publicar um commit passado específico que teve uma correção importante sem esperar pela próxima
release do topo da main, marque esse SHA exato e faça push — publish.yml constrói a partir da ref da tag, não do topo
atual da main:```bash
git tag -a v1.0.1 -m "..."
git push origin v1.0.1
## Configuração
O TRAWL suporta proxies HTTP, proxies HTTP autenticados e proxies SOCKS5. Os arquivos Compose
padrão leem as configurações de proxy do arquivo `.env` local:```ini
# Optional Tier 3 datacenter proxy
PROXY_URL=http://user:[email protected]:8080
# Optional Tier 4 residential proxy
RESIDENTIAL_PROXY_URL=socks5://user:[email protected]:1080
| -s | --server | SERVER | http://localhost:8080 | URL do servidor |
| -t | --token | TOKEN | | Token de autenticação |
| -o | --output | OUTPUT | stdout | Arquivo de saída |
| -f | --format | FORMAT | json | Formato de saída |
| -v | --verbose | | | Saída detalhada |
| -q | --quiet | | | Modo silencioso |
| -h | --help | | | Exibir ajuda |
| -V | --version | | | Exibir versão |
# Iniciar o servidor
python -m kitploit.server --port 8080
# Executar uma verificação
python -m kitploit.scan --target example.com
# Exportar resultados
python -m kitploit.export --format json --output results.json
# Clonar o repositório
git clone https://github.com/kitploit/kitploit.git
cd kitploit
# Criar ambiente virtual
python -m venv venv
source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
# Instalar dependências de desenvolvimento
pip install -r requirements-dev.txt
# Instalar hooks de pré-commit
pre-commit install
# Executar todos os testes
pytest
# Executar com cobertura
pytest --cov=kitploit --cov-report=html
# Executar testes específicos
pytest tests/test_scanner.py -v
# Executar linter
ruff check .
# Formatar código
ruff format .
# Verificação de tipos
mypy kitploit/
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Este projeto está licenciado sob a Licença MIT - consulte o arquivo LICENSE para obter detalhes.
Aviso: Esta ferramenta destina-se apenas a testes de segurança autorizados e fins educacionais. Sempre obtenha permissão adequada antes de testar qualquer sistema.```bash docker compose up -d
Deixe qualquer um dos valores vazio para desativar esse nível de proxy. Vários endpoints podem ser separados por
vírgulas; pools maiores podem usar a variável correspondente `*_LIST_FILE`. Consulte
[Configuration → Proxies](https://github.com/germondai/trawl/blob/dev/apps/docs/getting-started/configuration.md#proxies)
para exemplos de pool e de arquivo montado.
| Variável | Padrão | Descrição |
| -------------------------------- | ------------------------ | ----------------------------------------------------------------------------------- |
| `BROWSER_POOL_SIZE` | `1` | Instâncias Camoufox Firefox pré-aquecidas; aumente para resoluções de browser concorrentes |
| `LOG_LEVEL` | `info` | Logs operacionais: `error`, `warn`, `info`, `debug` ou `silent` |
| `METRICS_DASHBOARD_ENABLED` | `false` | Ativa explicitamente o dashboard local sem token; vincula a porta a `127.0.0.1` |
| `METRICS_DASHBOARD_TOKEN` | — | Protege o dashboard, o endpoint JSON e o stream ao vivo com um token de 32+ caracteres |
| `METRICS_DB_PATH` | `/data/metrics/trawl.sqlite` | Caminho SQLite para o histórico local de métricas (monte `/data/metrics` de forma persistente) |
| `BROWSER_ACQUIRE_TIMEOUT_MS` | `15000` | Quanto tempo `acquire()` aguarda por um browser livre antes de retornar HTTP 429 |
| `BROWSER_RECYCLE_AFTER_CONTEXTS` | `8` | Substituição contínua após este número de contextos Tier 3/4; defina `0` para desativar |
| `BROWSER_MAX_CONTENT_PROCESSES` | `2` | Limita os processos de conteúdo do Firefox por browser (`dom.ipc.processCount`); reduz RAM/CPU |
| `SCRAPE_MIN_TIER` | `1` | Nível mais baixo permitido globalmente (`1` HTTP, `2` browser em cache, `3` novo, `4` residencial) |
| `SESSION_CACHE_DRIVER` | `redis` | Backend do cache de sessão: `redis` ou `memory` de processo único |
| `REDIS_SESSION_TTL_SECONDS` | `3600` | TTL da sessão em Redis ou em memória (segundos) |
| `MEMORY_SESSION_CACHE_MAX_ENTRIES` | `1000` | Número máximo de entradas limitadas por LRU para o driver de memória |
| `REDIS_URL` | — | String de conexão Redis; vazio ou não definido desativa o cache Redis |
| `REDIS_CONNECT_TIMEOUT_MS` | `5000` | Tempo máximo para cada tentativa de conexão Redis |
| `REDIS_RETRY_DELAY_MS` | `5000` | Atraso antes de reconectar após falha na inicialização; `0` desativa a nova tentativa |
| `SCRAPE_PROXY_SELECTION` | `failover` | Política do pool: `failover` fixo, `roundrobin` por requisição ou `random` |
| `PROXY_URL` | — | Proxy HTTP ou SOCKS5 opcional de Tier 3, ou pool separado por vírgulas |
| `PROXY_LIST_FILE` | — | Arquivo contendo uma URL de proxy Tier 3 por linha |
| `RESIDENTIAL_PROXY_URL` | — | Ativa a escalada para proxy Tier 4 |
| `RESIDENTIAL_PROXY_LIST_FILE` | — | Arquivo contendo uma URL de proxy Tier 4 por linha |
| `STT_URL` | — | Endpoint Whisper local para reCAPTCHA (opcional) |
| `PORT` | `8191` | Porta de escuta da API |
| `MITM_ENABLED` | `false` | Ativa o proxy HTTP/HTTPS que contorna desafios |
| `MITM_PORT` | `8192` | Porta de escuta do forward-proxy |
| `MITM_HOST` | `0.0.0.0` | Endereço de bind; `127.0.0.1` para apenas loopback |
| `MITM_CA_DIR` | `/data/proxy-ca` | Diretório persistente do certificado raiz CA e da chave privada |
| `MITM_MAX_TIER` | `4` | Limita a escalada usada pelo proxy (ex.: `3` para permanecer fora do residencial) |
| `MITM_ALWAYS_SCRAPE` | `false` | Ignora o Tier 0 do proxy; desativa o caminho direto de streaming de mídia/arquivos grandes |
| `MITM_DEBUG` | `false` | Registra uma linha por requisição proxyficada (erros são sempre registrados) |
Atualizar a partir de uma versão anterior exige renomear várias variáveis de ambiente. Consulte o
[guia de migração de configuração](https://github.com/germondai/trawl/blob/dev/apps/docs/deployment/configuration-migration.md) para o mapeamento completo
de antigo para novo e o comportamento de adesão ao Redis.
## Stack
Construído sobre uma stack moderna e rápida por padrão: Bun + Elysia para a API, Redis para cache,
Camoufox (Firefox reforçado) para automação de browser e Nuxt para a interface web — sem bagagem
legada de Node/Express.
| Camada | Tecnologia |
| ------------- | ---------------------------------- |
| Runtime | Bun |
| API | Elysia |
| Browser | Camoufox Firefox (via camoufox-js) |
| Cache de sessão | Redis 8.8 |
| Landing page | Nuxt 4 |
| Documentação | VitePress |
## Licença
[AGPL-3.0](https://github.com/germondai/trawl/blob/dev/LICENSE)
---
<p align="center">
<span>Feito com ❤️ por</span>
<a href="https://github.com/germondai" target="_blank">@germondai</a>
</p>
TRAWL40
|
Thordata - Proxies Residenciais Premium para Coleta de Dados. A Thordata ajuda desenvolvedores a construir fluxos confiáveis de scraping, automação e dados de IA com IPs residenciais de alta qualidade. 🌍 Mais de 100M de IPs reais | Mais de 195 países 🔄 Sessões rotativas e fixas | Geolocalização precisa ⚡ Alta concorrência | Conexões estáveis Reduza bloqueios e colete dados em escala com confiança. 🎁 Usuários do TRAWL: • Teste gratuito de 3 dias + 10% de desconto Código: TRAWL10
|