28 июл. 2026 г.

Portfolio Platform: личный сайт, блог и админка

Персональный сайт, который вырос в небольшую CMS: Next.js frontend, NestJS backend, auth-service, админка, Markdown-контент, файлы, комментарии, навигация, технологии и Docker-инфраструктура.

TypeScriptNestJSFastifyNext.jsReactRedisDockerDrizzle ORMCQRSJWT

Проект начался как обычный сайт-визитка, но быстро стало понятно, что статической страницы мало. Мне хотелось не просто выложить текст о себе, а собрать платформу, где можно управлять контентом без ручного редактирования кода: hero, about, кейсы, посты, технологии, навигация, комментарии, файлы и настройки сайта.

В итоге проект стал хорошей демонстрацией fullstack-подхода. Снаружи это минималистичный персональный сайт, а внутри - backend, админка, авторизация, роли, файловое хранилище, Markdown-контент, Docker и production-ready конфигурация.

Что я построил

Платформа состоит из нескольких частей:

  • публичный сайт на Next.js с локалями RU/EN;
  • backend на NestJS/Fastify;
  • отдельный auth-service;
  • PostgreSQL и Drizzle ORM;
  • Redis для инфраструктурных задач;
  • админка для управления hero, about, cases, posts, technologies, navigation, settings, contacts и comments;
  • загрузка файлов, cover-изображений и галерей;
  • Markdown-редактор с preview;
  • комментарии с captcha и модерацией;
  • view tracking с дедупликацией;
  • Docker Compose для локального и production-запуска.

Архитектурный подход

Backend построен модульно: команды, запросы, handlers, DTO, мапперы и репозитории разделены по доменным областям. Это немного тяжелее, чем “быстро накидать контроллеры”, но для проекта с админкой, публичными страницами, preview, модерацией и файлами такой подход быстро окупается.

На frontend используется App Router и разделение кода по app, widgets, entities и shared. Публичные страницы остаются тонкими, а админские формы живут в отдельных виджетах. Это помогает не смешивать витрину сайта и рабочий интерфейс администратора.

Что пришлось дорабатывать

В процессе проект из “сайта на пару страниц” превратился в продуктовую систему, поэтому всплыли реальные инженерные задачи:

  • синхронизация данных после admin POST/PATCH/DELETE без ручного refresh;
  • устойчивость авторизации после обновления страницы;
  • загрузка и повторное использование файлов;
  • bulk import технологий и markdown-постов;
  • нормальное отображение внешних иконок технологий;
  • публичная навигация из данных админки;
  • подготовка Docker/Caddy-контура для переноса на отдельный сервер и домен.

Результат

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

Для меня этот проект важен еще и как честный пример собственного подхода: если система начинает расти, я не оставляю ее в состоянии набора временных решений, а постепенно довожу до понятной архитектуры, админского UX и воспроизводимого деплоя.

Комментарии

Пока нет комментариев — будьте первым.