Главное Авторские колонки Вакансии Вопросы
😼
Выбор
редакции
685 0 В избр. Сохранено
Авторизуйтесь
Вход с паролем

Как мы за несколько дней сделали русскоязычный портал с архивами Эпштейна

Информационная повестка иногда подбрасывает сюжеты, которые сложно игнорировать. Архивы, связанные с делом Джеффри Эпштейна, в последние месяцы стали одним из самых обсуждаемых источников документов в мировых медиа. Журналисты ежедневно находят новые файлы, цитаты и фамилии.
Мнение автора может не совпадать с мнением редакции

Нам стало интересно, есть ли в этих архивах, например, Елизавета II? Мы решили посмотреть на ситуацию с инженерной точки зрения.

Проблема

Официальный архив размещён на сайте Министерства юстиции США. Чтобы найти конкретную фамилию, необходимо:

  1. подтвердить 18+,
  2. вручную вводить запросы,
  3. работать с интерфейсом, который периодически сбрасывает сессию,
  4. открывать и самостоятельно изучать 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-модалке

Пользуйтесь. Ищите файлы для работы и для расширения кругозора. Желаем вам не оказаться в этих списках :)

0
В избр. Сохранено
Авторизуйтесь
Вход с паролем