Portfolio Platform: личный сайт, блог и админка
Персональный сайт, который вырос в небольшую CMS: Next.js frontend, NestJS backend, auth-service, админка, Markdown-контент, файлы, комментарии, навигация, технологии и Docker-инфраструктура.
Проект начался как обычный сайт-визитка, но быстро стало понятно, что статической страницы мало. Мне хотелось не просто выложить текст о себе, а собрать платформу, где можно управлять контентом без ручного редактирования кода: 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 и воспроизводимого деплоя.