ivanovo.online
Региональный новостной портал с AI-обработкой контента
Региональный новостной портал Ивановской области, который собирает новости из множества источников, кластеризует похожие сюжеты и синтезирует единую статью на кластер через LLM — с учётом правил цитирования и атрибуции по каждому источнику.
Архитектура
Всё построено и поддерживается соло. Есть два параллельных полностью рабочих фронта — 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 с контейнерным деплоем.
← Ко всем проектам