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 тормозят или дают нестабильный ответ. У одного клиента в логистике 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):

МетрикаFirecrawlTavilyМой Rust API
Среднее время ответа1.7 c1.4 c0.61 c
RAM на воркер22 MB17 MB6 MB
Time-outs (%)3.12.90.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.

Read more

Computer-Use-Agenten scheitern an Pixeln: wie Sie auf stabile UI-Referenzen über Accessibility Trees umstellen und fehleranfällige Desktop-Automatisierung nicht mehr ständig reparieren

von Denis Shokhirev, Enterprise AI Architect aus Freiburg im Breisgau Ich bin Denis Shokhirev, Agentic AI Systems Architect in Freiburg im Breisgau, Germany, und bei DennisCraft AI Studio setze ich produktive KI-Systeme für DACH-B2B-Kunden auf Basis von Claude, Supabase, n8n, Doppler und selbst betriebenem Postgres um. Die teuersten Fehler in

By Denis Shokhirev

Компьютерные агенты ломаются на пикселях: как перейти на stable UI refs через accessibility tree и перестать чинить flaky desktop automation

Я Denis Shokhirev, Agentic AI Systems Architect из Freiburg im Breisgau, Germany, и в DennisCraft AI Studio я собираю production AI-системы для DACH B2B на Claude, Supabase, n8n, Doppler и self-hosted Postgres. Самая дорогая поломка в desktop automation, которую я вижу у клиентов, почти никогда не связана с моделью: агент

By Denis Shokhirev