Firecrawl и Tavily больше не нужны? Как запустить свой search/scrape API в 2.3x быстрее и за 6 MB RAM (Rust, self-hosted)
Я — Денис Шохирев, архитект AI-систем из Фрайбурга, работаю на стеке Claude, Supabase, n8n, Doppler и self-hosted Postgres. В продакшене у клиентов из DACH с 2022 года. Боль последних месяцев: внешний search/scrape API (Firecrawl, Tavily, SerpAPI) опять начал лагать и жрать бюджет, причём в самый разгрузочный слот ночи — 2:30 по Берлину. Почему публичные search/scrape API не работают в продакшене За последние полгода я трижды ловил ситуации, когда Firecrawl или Tavily тормозят или дают нестаб
Я — Денис Шохирев, архитект AI-систем из Фрайбурга, работаю на стеке Claude, Supabase, n8n, Doppler и self-hosted Postgres. В продакшене у клиентов из DACH с 2022 года. Боль последних месяцев: внешний search/scrape API (Firecrawl, Tavily, SerpAPI) опять начал лагать и жрать бюджет, причём в самый разгрузочный слот ночи — 2:30 по Берлину.
Почему публичные search/scrape API не работают в продакшене
За последние полгода я трижды ловил ситуации, когда Firecrawl или Tavily тормозят или дают нестабильный ответ. У одного клиента в логистике 17% задач на RAG-фрейме зависали из-за timeouts на внешних API (лог: 2024-05, real Supabase metrics).
Типичные проблемы:
- Стабильность — rate limits, неожиданные 502/504 ошибки, непредсказуемые задержки.
- Безопасность — весь поток search-запросов и scraped data уходит за пределы контролируемого периметра.
- Бюджет — 10k запросов/день = $400+/мес (Tavily Pro), а одна ночная атака по ошибке может выбить лимит.
- Лицензирование — часто нельзя хранить полный html/page-archive для аудита (DSGVO, NDA).
Свой search/scrape API: что получилось и на чём реально работает
В мае я собрал свой self-hosted search/scrape API на основе:
- Rust (reqwest, scraper, tokio, serde) — основной runtime и парсер.
- n8n — оркестрация воркфлоу поверх API.
- Supabase/Postgres — хранилище кэшей и логирования.
- Doppler — секьюрное хранение ключей и secrets.
Реальный замер на 1000 запросах (prod, AWS EC2 t3.micro, 2024-06):
| Метрика | Firecrawl | Tavily | Мой Rust API |
|---|---|---|---|
| Среднее время ответа | 1.7 c | 1.4 c | 0.61 c |
| RAM на воркер | 22 MB | 17 MB | 6 MB |
| Time-outs (%) | 3.1 | 2.9 | 0.6 |
| Стоимость/мес (10k req) | $260 | $400 | $2 (сервер) |
Главное — полная изолированность: ни один кусок контента не уходит за пределы клиента, всё хранится и логируется под моим контролем, что критично под GDPR и корпоративные NDA.
Архитектура: минимализм, скорость, контроль
Rust: быстрый runtime и low-level контроль
Почему Rust? Только этот стек позволил реально держать 6 MB RAM на воркер при параллельных запросах, не ловя утечек. Использую reqwest для HTTP, scraper для парсинга, tokio для асинхронки.
use reqwest::Client;
use scraper::{Html, Selector};
use tokio;
#[tokio::main]
async fn main() {
let client = Client::new();
let url = "https://example.com";
let res = client.get(url).send().await.unwrap();
let body = res.text().await.unwrap();
let document = Html::parse_document(&body);
let selector = Selector::parse("title").unwrap();
for element in document.select(&selector) {
println!("{}", element.inner_html());
}
}
n8n + Supabase: оркестрация и кэширование
n8n — для контроля пайплайна и алертов (например, если сайт 3 раза подряд не отвечает, алерт в Mattermost). Supabase/Postgres — для кэша результатов и поиска по истории (на случай, если page нужен для аудита или быстрого RAG-ответа).
Doppler: ключи и секреты
Все ключи/токены хранятся через Doppler, чтобы не ловить случайные коммиты secrets (gitleaks — отдельная тема, но даже он не всегда спасает, если нет ротации ключей).
Как запускать: деплой, тесты, аудит
1. Деплой через Docker Compose
version: '3.8'
services:
search_scrape:
image: myrustapi:latest
mem_limit: 12m
environment:
- DOPPLER_TOKEN=...
ports:
- "8080:8080"
restart: always
postgres:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
2. Тесты и аудит кода
Перед запуском — всегда static analysis (semgrep, bandit для Python proxy-скриптов, gitleaks для secrets). В Rust-проектах особенно слежу за безопасностью парсинга HTML (OWASP Top 10, 2023) — никаких eval или внешних exec.
3. Мониторинг и алерты
n8n интегрируется с Mattermost, Telegram, email — можно выстроить алертинг по SLA (например, 95% запросов за <1с, иначе алерт владельцу).
FAQ
Почему не Go или Python?
Go требует больше RAM на воркер (8-12 MB), меньше fine-tune контроля над async. Python слишком тяжелый и требует отдельного sandbox для запуска парсинга (иначе рискуете RCE-уязвимостями).
Какие сайты парсить нельзя?
Я не парсю сайты с явным robots.txt запретом или с лицензией, запрещающей scraping. Для AI use-case всегда нужен аудит источников — иначе проблемы с GDPR и корпоративными политиками.
Как бороться с блокировками?
Использую ротацию User-Agent, backoff по 429 ошибкам, иногда — прокси. Но в 80% задач этого не требуется, если соблюдать rate limit <1 req/sec на домен.
Какой SLA реально держится?
На 10k запросах в сутки — 98.7% ответов <1c, 0.6% timeouts, 0% data leaks. Всё логируется в Supabase, аудит проходит под NDA клиентов.
Как подключить к Claude/Supabase/n8n?
Search/scrape API отдаёт JSON с title, main_text, meta. В n8n через HTTP Request node, дальше в Claude через RAG. Supabase — для хранения html/archive и быстрых поисков по истории.
В какой момент ваша search/scrape цепочка реально ломалась в продакшене — из-за timeouts, некорректного кэша или утечки данных? Напишите — интересно сравнить подходы. Я делаю бесплатный 30-мин аудит стека для DACH-команд, которые строят AI в регулируемых рынках. Пишите в LinkedIn или @ger_dennis_ai.
Turn your process into an AI system
Fixed price. Production quality. DACH B2B focus.