Это мой сайт — портфолио и блог, страница, которую вы и читаете. Двуязычный, на русском и английском: сюда я выкладываю проекты и заметки. Весь контент лежит в CMS.
Собрал целиком: фронтенд, настройку CMS и модель контента, обе локали, SEO, деплой.

Почему PayloadCMS
Не хотелось брать WordPress, Drupal или Joomla — хотелось попробовать что-то новое. Писать всё с нуля — тоже не вариант: заодно хотелось попрактиковаться с Next.js и React на сервере. Пока перебирал варианты, наткнулся на PayloadCMS.
Понравилась сама модель разработки: кастомные поля я описываю в коде, фронтенд на Next.js и React, а базу можно выбрать — MongoDB, SQLite или PostgreSQL. Взял PostgreSQL — ради практики с миграциями.
Payload написан на TypeScript, типы генерируются прямо из схемы — и рефакторинг становится безопаснее. Фронтенд при этом целиком мой: Payload отдаёт данные, Next.js рендерит.
Деплой и хостинг
Работает всё на моём VPS, в docker-compose. Сервисов несколько: контейнер с самой CMS (Next.js вместе с Payload) и отдельный — с базой PostgreSQL. Перед сайтом стоит Cloudflare — CDN и кеширование статики.
Отдельно собирается образ для миграций. Прод-версия — это скомпилированный standalone-бандл Next.js: лёгкий, без исходников и dev-инструментов, только то, что нужно для работы сайта. Прогнать из него миграции схемы уже нельзя, поэтому из того же Dockerfile собирается второй образ — с полным кодом и зависимостями. На релизе он применяет миграции (payload migrate) до того, как поднимется новая версия приложения. Через него же я запускаю разовые скрипты, когда надо поправить контент напрямую.
Сейчас на Payload держится всё: посты в блоге, проекты в портфолио, контакты. Админку тоже подогнал под себя.
Технологический стек
- Фронтенд: Next.js 16 (App Router), React 19 Server Components, Tailwind CSS 4
- Бэкенд и CMS: PayloadCMS 3 (Next.js + TypeScript), PostgreSQL
- Хостинг: VPS, Docker Compose
- CDN и edge: Cloudflare
- Почта: письма из контактной формы через SMTP (Brevo)
- Редактор: Lexical в Payload — визуальный, а не голый Markdown



