Как подключить Payload CMS к существующему проекту Next.js

11 августа 2025 г.

Полностью рабочая и проверенная инструкция по подключению Payload CMS к существующему проекту Next.js (App Router).

  1. Создаём в папке app существующего проекта две подпапки (frontend) и (payload).

  2. Переносим исходники существующего проекта из папки app в подпапку (frontend).

  3. Копируем исходники Payload CMS в подпапку (payload). Исходники Payload CMS необходимо скопировать из папки (payload) пустого шаблона Payload CMS на GitHub по ссылке.

  4. Копируем файлы payload.config.ts и payload-types.ts и папку collections из пустого шаблона Payload CMS на GitHub по ссылке выше на один уровень (рядом) с папкой app.

В результате должна получиться примерно такая структура исходников:

src
├─ app
├─── (frontend)
├───── // Исходники существующего проекта
├─── (payload)
├───── // Исходники Payload CMS
├─ collections
├─ payload-types.ts
├─ payload.config.ts
  1. Копируем файл tsconfig.json из корня пустого шаблона Payload CMS на GitHub по ссылке выше в корень существующего проекта (если его нет). Если файл tsconfig.json уже существует – добавляем в него путь к конфигурации Payload CMS:
tsconfig.json
{
  "compilerOptions": {
    // ...
    "paths": {
      "@/*": ["./src/*"],
      "@payload-config": ["./src/payload.config.ts"]
    }
  }
  // ...
}
  1. Добавляем в файл package.json параметр "type": "module":
package.json
{
  "name": "next-payload",
  "version": "0.1.0",
  "type": "module",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  }
  // ...
}
  1. Добавляем к проекту необходимые пакеты Payload CMS:
terminal
npm i payload @payloadcms/next @payloadcms/richtext-lexical sharp graphql
  1. Добавляем адаптер базы данных на примере SQLite:
terminal
npm i @payloadcms/db-sqlite

С инструкциями по установке другого адаптера, например, MongoDB или Postgres, можно ознакомиться по ссылке.

  1. Добавляем плагин Payload CMS в конфигурацию Next.js:
next.config.mjs
import { withPayload } from '@payloadcms/next/withPayload';
 
/** @type {import('next').NextConfig} */
const nextConfig = {};
 
export default nextConfig;
export default withPayload(nextConfig);
  1. Завершаем настройку конфигурации Payload CMS в файле payload.config.ts, который мы скопировали в п. 4 выше:
payload.config.ts
import { mongooseAdapter } from '@payloadcms/db-mongodb';
import { payloadCloudPlugin } from '@payloadcms/payload-cloud';
 
import { sqliteAdapter } from '@payloadcms/db-sqlite';
import { lexicalEditor } from '@payloadcms/richtext-lexical';
import path from 'path';
import { buildConfig } from 'payload';
import { fileURLToPath } from 'url';
import sharp from 'sharp';
 
import { Users } from './collections/Users';
import { Media } from './collections/Media';
 
const filename = fileURLToPath(import.meta.url);
const dirname = path.dirname(filename);
 
export default buildConfig({
  admin: {
    user: Users.slug,
    importMap: {
      baseDir: path.resolve(dirname)
    }
  },
  collections: [Users, Media],
  editor: lexicalEditor(),
  secret: process.env.PAYLOAD_SECRET || '',
  typescript: {
    outputFile: path.resolve(dirname, 'payload-types.ts')
  },
 
  db: mongooseAdapter({
    url: process.env.DATABASE_URI || ''
  }),
  db: sqliteAdapter({
    client: {
      url: process.env.DATABASE_URI || ''
    }
  }),
 
  sharp,
  plugins: [payloadCloudPlugin()]
});
  1. Создаем в корне проекта файл .env или добавляем в существующий файл .env следующие переменные окружения:
.env
DATABASE_URI=file:./.db
PAYLOAD_SECRET=423152346576796780678623

Примечания:

  • файл .db создавать не нужно, он автоматически будет создан при первом обращении к админке в режиме разработчика;
  • PAYLOAD_SECRET необходимо заменить на свои цифры.
  1. Запускаем проект в режиме разработчика:
terminal
npm run dev

и переходим в админку по адресу:

url
http://localhost:3000/admin

Если всё было выполнено правильно – откроется форма для создания первого пользователя.