Разработка сайта на CMS Payload

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка сайта на CMS Payload
Средняя
~1-2 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Разработка сайта на Payload CMS

Payload CMS — headless CMS на Node.js с TypeScript-first подходом. Конфигурация — код, а не GUI: коллекции, поля, хуки, контроль доступа описываются в TypeScript-файлах. Это означает type safety, рефакторинг через IDE, code review в git. База данных — MongoDB или PostgreSQL через Drizzle ORM. Admin panel генерируется автоматически из конфигурации.

Архитектура проекта

Payload работает как монолит (CMS + frontend в одном Next.js приложении) или в режиме standalone API:

Монолит (рекомендовано):
├── app/                   # Next.js App Router
│   ├── (frontend)/        # Публичные страницы
│   └── (payload)/         # Admin panel: /admin
├── payload.config.ts      # Конфигурация CMS
├── collections/           # Типы контента
└── globals/               # Глобальные настройки

Standalone режим: Payload как Express/Node.js сервер, фронтенд — отдельный Next.js/Nuxt/Remix.

Создание проекта

npx create-payload-app@latest my-site
# Выбрать: template = website, database = PostgreSQL или MongoDB

cd my-site
npm install
npm run dev
# Admin: http://localhost:3000/admin

Коллекции

Коллекция — тип контента с полями. Аналог модели в Laravel или content type в Drupal:

// collections/Posts.ts
import { CollectionConfig } from 'payload/types'

const Posts: CollectionConfig = {
  slug: 'posts',
  admin: {
    useAsTitle: 'title',
    defaultColumns: ['title', 'status', 'publishedAt'],
  },
  access: {
    read: () => true,           // публичное чтение
    create: ({ req }) => req.user?.role === 'admin',
    update: ({ req }) => req.user?.role === 'admin',
    delete: ({ req }) => req.user?.role === 'admin',
  },
  fields: [
    {
      name: 'title',
      type: 'text',
      required: true,
    },
    {
      name: 'slug',
      type: 'text',
      unique: true,
      admin: { position: 'sidebar' },
    },
    {
      name: 'content',
      type: 'richText',
    },
    {
      name: 'status',
      type: 'select',
      options: ['draft', 'published'],
      defaultValue: 'draft',
      admin: { position: 'sidebar' },
    },
    {
      name: 'publishedAt',
      type: 'date',
      admin: { position: 'sidebar', condition: (_, { status }) => status === 'published' },
    },
    {
      name: 'featuredImage',
      type: 'upload',
      relationTo: 'media',
    },
  ],
  hooks: {
    beforeChange: [
      ({ data }) => {
        // Автогенерация slug
        if (!data.slug && data.title) {
          data.slug = data.title.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]/g, '')
        }
        return data
      }
    ],
  },
}

export default Posts

Регистрация в payload.config.ts

// payload.config.ts
import { buildConfig } from 'payload/config'
import { postgresAdapter } from '@payloadcms/db-postgres'
import { lexicalEditor } from '@payloadcms/richtext-lexical'
import Posts from './collections/Posts'
import Pages from './collections/Pages'
import Media from './collections/Media'
import Users from './collections/Users'
import Settings from './globals/Settings'

export default buildConfig({
  serverURL: process.env.PAYLOAD_PUBLIC_SERVER_URL,
  admin: {
    user: Users.slug,
    bundler: webpackBundler(),
  },
  editor: lexicalEditor({}),
  collections: [Posts, Pages, Media, Users],
  globals: [Settings],
  db: postgresAdapter({
    pool: {
      connectionString: process.env.DATABASE_URL,
    },
  }),
  typescript: {
    outputFile: path.resolve(__dirname, 'payload-types.ts'),
  },
  graphQL: {
    schemaOutputFile: path.resolve(__dirname, 'generated-schema.graphql'),
  },
})

Рендеринг страниц в Next.js

// app/(frontend)/[slug]/page.tsx
import { getPayloadHMR } from '@payloadcms/next/utilities'
import configPromise from '@payload-config'
import { notFound } from 'next/navigation'

export default async function Page({ params }: { params: { slug: string } }) {
  const payload = await getPayloadHMR({ config: configPromise })

  const result = await payload.find({
    collection: 'pages',
    where: {
      slug: { equals: params.slug },
      status: { equals: 'published' },
    },
    limit: 1,
  })

  const page = result.docs[0]
  if (!page) notFound()

  return (
    <main>
      <h1>{page.title}</h1>
      <RichText content={page.content} />
    </main>
  )
}

export async function generateStaticParams() {
  const payload = await getPayloadHMR({ config: configPromise })
  const pages = await payload.find({ collection: 'pages', limit: 1000 })
  return pages.docs.map(page => ({ slug: page.slug }))
}

Типичный стек проекта

Слой Технология
CMS + Admin Payload CMS 2.x
Frontend Next.js 14 App Router
База данных PostgreSQL + Drizzle
Медиафайлы Cloudflare R2 / AWS S3
Поиск Payload built-in / Algolia
Email Resend / Nodemailer
Деплой Vercel / Railway / самохост

Сроки

Базовый сайт с 3–5 типами контента, медиатекой и Next.js фронтендом — 2–3 недели. Сложный проект с кастомными полями, многоязычностью, версионированием и живым превью — 4–8 недель.