В продакшене

ivanovo.online

Региональный новостной портал с AI-обработкой контента

Роль
Fullstack Developer
Период
2026 — настоящее время
В продакшене
https://ivanovo.online

Региональный новостной портал Ивановской области, который собирает новости из множества источников, кластеризует похожие сюжеты и синтезирует единую статью на кластер через LLM — с учётом правил цитирования и атрибуции по каждому источнику.

  • Nuxt 3
  • SvelteKit 5
  • Vue 3
  • Node.js
  • Express 5
  • Prisma
  • PostgreSQL
  • Redis
  • MinIO
  • Docker Compose

Архитектура

Всё построено и поддерживается соло. Есть два параллельных полностью рабочих фронта — Nuxt 3 с server routes и server-side sitemap, и SvelteKit 5 на рунах Svelte 5 ($state / $effect / $derived / $props) с Tailwind. Переключение между ними — это изменение конфигурации Docker; оба варианта рабочие, чтобы финальный стек выбирался по реальным метрикам UX и Lighthouse, а не по личным предпочтениям. Сейчас на проде деплоится вариант на SvelteKit.

Отдельная админ-панель (Vue 3 + Vite + Pinia + Vue Router) — SPA с редактором контента на TipTap.

Backend — Node.js + Express 5 с Prisma ORM (11+ миграций, включая отложенную публикацию), JWT в HttpOnly-куках для админки, bcrypt для паролей, Zod-валидация входных данных. Хранилища — PostgreSQL, Redis для кэша/очередей, MinIO (S3-совместимое) для изображений.

AI-пайплайн

Multi-provider LLM-абстракция переключается между OpenAI, Z.ai (GLM), Anthropic, Yandex GPT и GigaChat. Сейчас на проде — Z.ai с моделью glm-5 для текста и GLM-Image для генерации изображений, Tavily — опциональный web-search для подмешивания свежих выдержек.

Cron-задачи собирают новости из источников, кластеризуют похожие сюжеты через нечёткий матчинг заголовков PostgreSQL pg_trgm и передают каждый кластер из 2–5 похожих новостей на этап LLM-синтеза, который возвращает структурированный JSON (title, body, summary, confirmedFacts, differences, contentClass, usedSourceUrls). Отложенная публикация идёт по расписанию.

Модель SourceUsageRule задаёт квоты цитирования по источникам, требования атрибуции и очередь ручного одобрения для аналитических материалов — юридические и редакционные гарантии, необходимые для реального продакшена, а не просто демо.

Деплой

Шесть контейнеров через Docker Compose (admin / frontend / backend / postgres / redis / minio), образы публикуются в Docker Hub, GitHub Actions автоматически деплоит по мерджу PR (docker compose pull && up -d) за Nginx-прокси с отдельными хостами для админки и публичного сайта.

Что это демонстрирует

Продуктовое мышление end-to-end — фронтенд, бэкенд, AI и инфраструктура, с юридически грамотными гарантиями вокруг контента из внешних источников.

Инженерный подход к выбору фреймворка: два рабочих фронта запараллелены и сравниваются по реальным метрикам, а не выбраны по вкусу.

Знание PostgreSQL глубже базового уровня (нечёткий матчинг через pg_trgm), полноценная multi-provider LLM-архитектура вместо одного API-вызова, и полноценный CI/CD с контейнерным деплоем.


← Ко всем проектам