MosHub
Next.js проект с интегрированной CMS на базе Payload CMS.
Технологии
- Next.js 16 — React фреймворк
- Payload CMS 2.x — Headless CMS с админ-панелью
- PostgreSQL — База данных
- Sharp — Оптимизация изображений (WebP, AVIF)
Начало работы
1. Установка зависимостей
yarn install
Получение архива с зависимостями:
./scripts/pack-offline-cache.sh linux-x64-gnu
2. Настройка окружения
Скопируйте .env.example в .env и заполните переменные:
cp .env.example .env
Основные переменные для Payload CMS:
-
DATABASE_URL— строка подключения к PostgreSQL -
PAYLOAD_SECRET— секретный ключ (измените в production!) -
PAYLOAD_PUBLIC_SERVER_URL— URL сервера
3. Запуск PostgreSQL (локальная разработка)
yarn db:postgres
Это запустит PostgreSQL в Docker контейнере с настройками:
- Host: localhost:5432
- User: moshub
- Password: moshub_secret
- Database: moshub_cms
4. Запуск dev сервера
yarn dev
- Сайт: http://localhost:3000
- Админ-панель: http://localhost:3000/admin
При первом запуске создайте администратора через форму регистрации в админ-панели.
Payload CMS
Коллекции
| Коллекция | Описание |
|---|---|
| Users | Пользователи с ролями (admin, editor, viewer) |
| Media | Изображения с автоматической оптимизацией |
| Documents | PDF, Word, Excel и другие документы |
| Videos | Видео файлы |
| Articles | Статьи с rich text редактором |
| Pages | Страницы сайта с блоками контента |
| Events | События с датами и локацией |
| Article Categories | Категории для статей |
Глобальные настройки
- Site Settings — общие настройки сайта
- Global SEO — SEO настройки по умолчанию
Роли пользователей
| Роль | Права |
|---|---|
| Admin | Полный доступ ко всем функциям |
| Editor | Создание и редактирование контента |
| Viewer | Только просмотр |
Оптимизация изображений
При загрузке изображений автоматически создаются варианты:
| Размер | WebP | AVIF |
|---|---|---|
| thumbnail | 150x150 | 150x150 |
| small | 400x300 | 400x300 |
| medium | 800x600 | 800x600 |
| large | 1200x900 | 1200x900 |
| veryLarge | 1920x1440 | 1920x1440 |
SEO
Каждая статья, страница и событие имеет SEO поля:
- Meta Title
- Meta Description
- Keywords
- OG Image
- Canonical URL
- noindex/nofollow
Если SEO не заполнено, используются значения из Global SEO.
Скрипты
yarn dev # Запуск dev сервера
yarn build # Сборка для production
yarn start # Запуск production сервера
yarn db:postgres # Запуск PostgreSQL в Docker
yarn db:postgres:stop # Остановка PostgreSQL
yarn generate:types # Генерация TypeScript типов Payload
yarn lint # Проверка кода
yarn format # Форматирование кода
API
REST API доступен по адресу /api:
GET /api/articles # Список статей
GET /api/articles/:id # Статья по ID
GET /api/pages # Список страниц
GET /api/events # Список событий
GET /api/media # Список медиа
GET /api/globals/global-seo # Глобальные SEO настройки
Структура проекта
src/
├── app/
│ ├── (payload)/ # Payload admin routes
│ │ ├── admin/ # Admin panel
│ │ └── layout.tsx
│ ├── api/
│ │ └── (payload)/ # Payload REST API
│ └── [locale]/ # Локализованные страницы
├── payload/
│ ├── collections/ # Коллекции Payload
│ ├── globals/ # Глобальные настройки
│ ├── fields/ # Переиспользуемые поля
│ ├── access/ # Правила доступа
│ ├── payload.config.ts # Конфигурация Payload
│ └── payload-types.ts # Сгенерированные типы
└── ...
Production
Для production необходимо:
- Изменить
PAYLOAD_SECRETна уникальный ключ - Настроить внешнюю PostgreSQL базу данных
- Настроить хранение медиа-файлов (S3/CDN при необходимости)