M

Moshub

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

При первом запуске создайте администратора через форму регистрации в админ-панели.

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 необходимо:

  1. Изменить PAYLOAD_SECRET на уникальный ключ
  2. Настроить внешнюю PostgreSQL базу данных
  3. Настроить хранение медиа-файлов (S3/CDN при необходимости)