Платформа для публикации IT-статей: лента, редактор, профили авторов, комментарии и поиск. Fullstack-пет-проект с разделением на API и SPA-подобный фронтенд на Next.js, готовый к деплою в Docker.
🚧 Демо и скриншоты появятся после деплоя — ссылку добавлю в этот раздел.
- О проекте
- Возможности
- В разработке
- Стек
- Архитектура
- Структура репозитория
- Быстрый старт
- Переменные окружения
- Скрипты
- Что интересно в коде
- Автор
IT Blog — это учебно-боевой pet-проект: полноценная платформа для технических статей с акцентом на UX редактора, SEO и предсказуемую серверную архитектуру.
Проект демонстрирует:
- проектирование REST API и схемы БД под реальные сценарии (посты, голоса, подписки, уведомления);
- современный фронтенд на Next.js App Router с серверными компонентами и кешированием;
- организацию кода по Feature-Sliced Design на клиенте и модульной структуре на сервере;
- production-ready деплой: Docker Compose, reverse proxy Caddy, HTTPS из коробки.
| Область | Что реализовано |
|---|---|
| Статьи | Rich-text редактор (TipTap), превью, черновики и публикация, slug, категории и теги, просмотры |
| Лента и поиск | Главная с пагинацией, фильтры, страница поиска, лента по тегу |
| Комментарии | Древовидные ответы, голосование за комментарии |
| Профили | Публичная страница автора, «О себе», список комментариев, подписки (follow) |
| Аутентификация | Регистрация, вход по email или username, JWT + refresh в cookie |
| Настройки | Аккаунт, профиль, безопасность, уведомления |
| SEO | metadata, Open Graph, sitemap.xml, robots.txt, серверный эндпоинт для карты сайта |
| Инфраструктура | Rate limiting, дедупликация просмотров через Redis, загрузка изображений, роли (USER / MODERATOR / ADMIN) |
Ниже — план развития проекта. Список отражает текущие приоритеты и направления, над которыми ведётся работа.
- Обложка профиля — загрузка и редактирование баннера на странице автора.
- Плавные анимации — микроинтеракции и переходы между экранами без рывков в интерфейсе.
- Уведомления в реальном времени — доставка событий (подписки, ответы, голоса) через WebSocket или SSE; модель в БД уже заложена.
- Личные сообщения — чаты между пользователями.
- Подсветка в поиске — визуальное выделение совпадений в тексте статей на странице результатов.
- Якорь на комментарий — подсветка и прокрутка к нужному комментарию при переходе по прямой ссылке.
- Админ-панель — отдельное приложение для модераторов и администраторов: управление контентом, пользователями и ролями.
| Технология | Назначение |
|---|---|
| Next.js 16 | App Router, RSC, standalone-сборка |
| React 19 | UI |
| TypeScript | Типизация |
| Tailwind CSS 4 | Стили |
| TanStack Query | Клиентский кеш и мутации |
| Zustand | Локальное состояние редактора |
| TipTap | WYSIWYG-редактор статей и комментариев |
| React Hook Form + Zod | Формы и валидация |
| Biome | Линтинг и форматирование |
| Технология | Назначение |
|---|---|
| Node.js + Express | REST API |
| TypeScript | Типизация |
| Prisma 7 | ORM, миграции |
| PostgreSQL 15 | Основное хранилище |
| Redis | Кеш уникальных просмотров постов |
| JWT + bcrypt | Аутентификация |
| Zod | Валидация env и DTO |
| express-rate-limit | Защита от злоупотреблений |
- Docker — multi-stage образы для frontend и backend
- Docker Compose — dev-инфра и production-стек
- Caddy — reverse proxy, TLS, маршрутизация
/api→ backend
flowchart TB
subgraph Client["Браузер"]
UI[Next.js App]
end
subgraph Proxy["Caddy"]
RP[Reverse Proxy]
end
subgraph App["Приложение"]
FE[Frontend :3000]
BE[Backend API :3005]
end
subgraph Data["Данные"]
PG[(PostgreSQL)]
RD[(Redis)]
end
UI --> RP
RP -->|"/"| FE
RP -->|"/api/*"| BE
FE -->|SSR / Server Actions| BE
UI -->|Client fetch| BE
BE --> PG
BE --> RD
Поток запросов в production: Caddy принимает HTTPS-трафик, отдаёт статику и SSR с Next.js, а запросы к /api проксирует на Express. Frontend в рантайме ходит в API по внутреннему URL http://backend:3005/api, браузер — по публичному NEXT_PUBLIC_API_URL.
it-blog/
├── frontend/ # Next.js (FSD: app, views, widgets, features, entities, shared)
│ └── src/
│ ├── app/ # Роуты App Router, layouts, providers
│ ├── views/ # Страничные композиции
│ ├── widgets/ # Крупные UI-блоки (Header, Footer, формы настроек)
│ ├── features/ # Сценарии (создание статьи, комментарии, auth)
│ ├── entities/ # Доменные сущности (article, user, comment)
│ └── shared/ # UI-kit, API-клиент, утилиты
├── backend/ # Express API
│ ├── prisma/ # Схема и миграции
│ └── src/
│ ├── modules/ # auth, post, comments, profile, follow, tag, category, upload, seo
│ ├── middlewares/ # errors, rate-limit, post views
│ └── shared/ # prisma, redis, base repository
├── compose.dev.yml # Postgres + Redis + pgAdmin (локальная разработка)
├── compose.infra.yml # Caddy + Postgres + Redis (production)
├── compose.app.yml # Frontend + Backend (production)
├── Caddyfile
└── .env.example
Из корня репозитория:
npm run dev:startПоднимутся:
| Сервис | Адрес |
|---|---|
| PostgreSQL | localhost:5432 (user/pass/db: postgres) |
| Redis | localhost:6379 |
| pgAdmin | http://localhost:5050 |
cd backend
cp .env.example .env # создайте файл вручную, если его ещё нет — см. раздел ниже
pnpm install
pnpm db:deploy # миграции + generate
pnpm db:init # сид: админ, категории, теги
pnpm devAPI по умолчанию: http://localhost:3005/api
Пример backend/.env для локальной разработки:
NODE_ENV=development
PORT=3005
PUBLIC_URL=http://localhost:3005
CORS_ORIGIN=http://localhost:3000
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres?schema=public
REDIS_HOST=localhost
REDIS_PORT=6379
JWT_SECRET=<минимум 64 символа — например: node -e "console.log(require('crypto').randomBytes(64).toString('hex'))">
REFRESH_SECRET=<минимум 64 символа>cd frontend
cp .env.example .env
pnpm install
pnpm devПриложение: http://localhost:3000
| Поле | Значение |
|---|---|
admin@example.com |
|
| Пароль | admin123! |
⚠️ Используйте только в dev-окружении. Перед production смените пароль и секреты.
- Скопируйте
.env.exampleв.envв корне и заполните домен, секреты и пароль БД. - Соберите и запустите стек:
npm run prod:build
npm run prod:startCaddy поднимет HTTPS для DOMAIN, проксирует фронт и API. Миграции Prisma выполняются при старте backend-контейнера.
Полезные команды:
npm run logs # логи всех сервисов
npm run down # остановка
npm run clean # остановка + удаление volumes| Переменная | Описание |
|---|---|
DOMAIN |
Домен для Caddy |
NEXT_PUBLIC_SITE_URL |
Публичный URL фронтенда |
NEXT_PUBLIC_API_URL |
Публичный URL API (обычно {SITE}/api) |
JWT_SECRET, REFRESH_SECRET |
Секреты токенов (≥ 64 символов) |
POSTGRES_* |
Учётные данные PostgreSQL |
| Переменная | Описание |
|---|---|
NEXT_PUBLIC_SITE_URL |
URL сайта для клиента |
NEXT_PUBLIC_API_URL |
URL API для браузера |
API_URL |
URL API для SSR и Server Actions |
| Команда | Действие |
|---|---|
npm run dev:start |
Docker: Postgres, Redis, pgAdmin |
npm run prod:build |
Сборка production-образов |
npm run prod:start |
Запуск полного production-стека |
npm run down |
Остановка production |
npm run clean |
Остановка + очистка volumes |
| Команда | Действие |
|---|---|
pnpm dev |
API в watch-режиме |
pnpm build |
Сборка через tsup |
pnpm db:deploy |
prisma migrate deploy + generate |
pnpm db:init |
Заполнение БД тестовыми данными |
pnpm studio |
Prisma Studio |
| Команда | Действие |
|---|---|
pnpm dev |
Dev-сервер Next.js |
pnpm build |
Production-сборка |
pnpm lint |
Проверка Biome |
pnpm format |
Форматирование Biome |
Если смотрите репозиторий как на code review, обратите внимание на:
- FSD на фронте — чёткое разделение
entities/features/widgets/views, переиспользуемый TipTap-редактор вshared/ui. - Кеширование Next.js —
cacheTag,revalidateTag, server actions для инвалидации после публикации и правок постов. - Модульный backend — роуты → контроллеры → сервисы → Prisma; общий
BaseRepositoryи транзакции. - Просмотры постов — middleware с Redis и TTL, чтобы не накручивать счётчик при повторных заходах.
- Схема БД — snake_case в PostgreSQL, связи постов/тегов, голосования, подписки, типизированные уведомления (модель готова под развитие фичи).
- Безопасность — rate limit на мутации, удаление и загрузку файлов; CORS с credentials; валидация env через Zod при старте.
| Префикс | Модуль |
|---|---|
/api/auth |
Регистрация, вход, refresh |
/api/posts |
CRUD статей, голоса, просмотры |
/api/comments |
Комментарии и ответы |
/api/profile, /api/users |
Профили и пользователи |
/api/follow |
Подписки |
/api/tags, /api/categories |
Справочники |
/api/upload |
Загрузка изображений |
/api/seo/sitemap |
Данные для sitemap |
Alexander Nelyubov · @AlexandrNel
Контакты и ссылки — в README профиля GitHub.
Pet-проект для портфолио и практики fullstack-разработки. Код открыт для просмотра; коммерческое использование без согласования с автором не предполагается.