редакции
Как мы за несколько дней сделали русскоязычный портал с архивами Эпштейна
Нам стало интересно, есть ли в этих архивах, например, Елизавета II? Мы решили посмотреть на ситуацию с инженерной точки зрения.
Проблема
Официальный архив размещён на сайте Министерства юстиции США. Чтобы найти конкретную фамилию, необходимо:
- подтвердить 18+,
- вручную вводить запросы,
- работать с интерфейсом, который периодически сбрасывает сессию,
- открывать и самостоятельно изучать PDF-документы.
При активной работе это превращается в неприятный квест.
Решение
Мы подумали: а что, если сделать русскоязычную версию архива
с нормальным поиском и добавить инструмент, который объясняет содержание
документа человеческим языком? Оказалось, что у меня есть сотрудники, которые
могут развлечь шефа и сделать такой. А заодно встроить ИИ-скрипт, который
позволит коротко изложить в чем смысл документа.
Так родился проект epstein-archive.ru.
И да, нам самим было интересно проверить пару фамилий. (Спойлер: Елизавету II мы там не обнаружили.)
Ключевые технические свойства сайта
1. Обход Akamai-защиты — автоматическое решение
Proof-of-Work челленджа justice.gov: парсинг JS-токена, вычисление PoW, POST
верификация, подстановка сессионных кук и ретрай
2. AI-анализ документов — локальная LLM развёрнута через Ollama на собственной машине; стриминг ответа через SSE, очередь запросов, отображение прогресса (downloading → analyzing → streaming)
3. Клиентская квота на AI — 5 анализов / 30 мин, трекинг в localStorage, broadcast между вкладками через кастомные события
4. Rate-limiting — sliding window per-IP (30 req / 5 мин), in-memory, с countdown-таймером на клиенте
5. Dual-формат ответов DOJ — поддержка и Elasticsearch-формата, и legacy flat-массива; нормализация в единую структуру
6. Стриминг прогресса загрузки — chunk-by-chunk трекинг при получении данных от DOJ
7. Тёмная/светлая тема — CSS-переменные, определение системных предпочтений, персистенция в localStorage
8. Мемоизация и ленивая загрузка — React.memo с кастомным comparator для карточек, dynamic import AI-модалки (no SSR), loading="lazy" для изображений
9. SEO и аналитика — sitemap.xml, robots.txt, Яндекс.Метрика (webvisor, heatmap, click tracking)
10. Юридический compliance — 18+ дисклеймер, cookie-баннер, страницы Privacy/Terms
Выполненный бекенд:
— Next.js API Routes — серверная логика внутри того же приложения
— Node.js 20 (Alpine)
— Nginx — реверс-прокси, rate-limit (10 req/s), gzip, SSL (Let’s Encrypt)
— Docker — мультистейдж-сборка, docker-compose (dev/prod)
— Отдельный AI-микросервис (Fastify, порт 3001) — анализ PDF через локальную LLM (Ollama)
Фронтенд выполнен:
— Next.js 16 (App Router, Server Components, React 19)
— TypeScript 5 (strict mode)
— Tailwind CSS v4
— Zod — валидация ввода на клиенте и сервере
— Lucide React — иконки
— react-markdown — рендер markdown в AI-модалке
Пользуйтесь. Ищите файлы для работы и для расширения кругозора. Желаем вам не оказаться в этих списках :)