Отметим: когда доменная логика не вписывается в готовые шаблоны, KeystoneJS становится основой. Это code-first headless CMS, где схемы данных живут в TypeScript, а GraphQL API, админка и Prisma-схема генерируются автоматически. Вы не тратите время на CRUD-обёртку: система создаёт её сама, оставляя вам бизнес-логику. За 7-10 дней получаете готовое решение с кастомными полями, ролевым доступом и интеграцией с любым фронтендом — от Next.js до Angular. Такой подход сокращает стоимость разработки и исключает N+1-запросы через гибкий API. Свяжитесь с нами, чтобы обсудить ваш проект.
В отличие от admin-first CMS, KeystoneJS даёт полный контроль над данными. Вы описываете отношения, хуки, вычисляемые поля — система сама строит миграции через Prisma. Мы используем этот подход в 10+ проектах: от интернет-магазинов с кастомным каталогом до корпоративных порталов с мультисайтовостью. По нашим замерам, KeystoneJS ускоряет создание бэкенда в 1.5 раза по сравнению со Strapi. Закажите консультацию нашего инженера — получите оценку вашего проекта.
Когда выбирать KeystoneJS
KeystoneJS подходит, когда:
- Нужен полный контроль над схемой данных и бизнес-логикой
- Команда комфортно работает с Node.js и TypeScript
- Требуется кастомная логика доступа, сложные вычисляемые поля, хуки на уровне данных
- GraphQL API — первичный интерфейс для фронтенда
Не подходит, если нужен хостинг «из коробки» без DevOps или проект требует богатого UI для нетехнических редакторов (тогда смотрите на Strapi или Payload).
Почему стоит выбрать KeystoneJS?
KeystoneJS превосходит традиционные CMS за счёт code-first подхода. Вы не ограничены фиксированными структурами: любые отношения, вычисляемые поля, крючки (hooks) на создание/обновление. GraphQL API даёт фронтенду ровно те данные, которые нужны, без N+1 query. Согласно документации, KeystoneJS позволяет сократить время разработки бэкенда на 30-40% за счёт автогенерации CRUD-операций.
| Критерий | KeystoneJS | Strapi | Payload CMS |
|---|---|---|---|
| Подход | Code-first | Admin-first | Code-first |
| Типизация | TypeScript | JS/TS частично | TypeScript |
| GraphQL | Полная автогенерация | REST + GraphQL | REST + GraphQL |
| Кастомизация | Максимальная | Средняя | Высокая |
| DevOps | Требуется | Встроенный хостинг | Требуется |
Как мы настраиваем доступ и роли?
В KeystoneJS права доступа задаются на уровне операций (create/read/update/delete) и полей через access в каждом списке. Мы реализуем ролевую модель: администратор, редактор, автор, аноним. Встроенная поддержка сессий через cookie или JWT.
// Пример доступа: только автор может редактировать свой пост access: { operation: { query: allowAll, create: ({ session }) => !!session, update: ({ session, item }) => session?.data?.id === item.authorId, delete: ({ session }) => session?.data?.role === 'admin', }, }, Процесс разработки
- Аналитика: определяем модели, связи, роли, интеграции
- Проектирование: создаём схему TypeScript, настраиваем хранилища (локальные/S3)
- Реализация: пишем списки, hooks, access-правила, настраиваем Admin UI
- Тестирование: GraphQL-запросы, unit-тесты, нагрузочное тестирование
- Деплой: Prisma-миграции, Docker-контейнер, CI/CD
Конфигурация и запуск
// keystone.ts import { config } from '@keystone-6/core'; import { lists } from './schema'; import { withAuth, session } from './auth'; export default withAuth( config({ db: { provider: 'postgresql', url: process.env.DATABASE_URL!, enableLogging: true, idField: { kind: 'uuid' } }, lists, session, ui: { isAccessAllowed: (context) => !!context.session?.data }, server: { cors: { origin: [process.env.FRONTEND_URL!], credentials: true } }, }) ); Пример модели Post
// lists/Post.ts import { list } from '@keystone-6/core'; import { text, relationship, timestamp, select, image, document } from '@keystone-6/core/fields'; export const Post = list({ access: { operation: { query: () => true, create: ({ session }) => !!session, update: ({ session }) => !!session, delete: ({ session }) => session?.data?.role === 'admin', }, }, fields: { title: text({ validation: { isRequired: true } }), slug: text({ validation: { isRequired: true }, isIndexed: 'unique' }), status: select({ options: [ { label: 'Draft', value: 'draft' }, { label: 'Published', value: 'published' }, { label: 'Archived', value: 'archived' }, ], defaultValue: 'draft', }), content: document({ formatting: true, links: true }), author: relationship({ ref: 'Author.posts' }), featuredImage: image({ storage: 'local_images' }), }, }); GraphQL API и работа с фронтендом
После запуска npx keystone dev открывается GraphQL Playground на http://localhost:3000/api/graphql. Пример запроса:
query GetPosts { posts(where: { status: { equals: "published" } }, orderBy: { publishedAt: desc }) { id title slug author { name } } } В Next.js используем Apollo Client:
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client'; export const client = new ApolloClient({ link: createHttpLink({ uri: process.env.KEYSTONE_API_URL }), cache: new InMemoryCache(), }); Что входит в работу
- Создание схемы данных (листы, отношения, хуки)
- Настройка доступа и ролей
- Интеграция с фронтендом (Next.js, Nuxt 3, Gatsby)
- Конфигурация хранилищ (локальные, S3)
- Деплой и миграции
- Документация по API и админке
- Обучение команды редакторов
- Поддержка 1 месяц после запуска
Как KeystoneJS ускоряет разработку?
На практике, code-first подход позволяет нам сократить время на начальную настройку в 2-3 раза по сравнению с admin-first CMS. Мы получаем готовую админку и API сразу после описания схемы. Например, в одном из проектов интернет-магазина мы сэкономили 4 дня только на этапе проектирования, что принесло клиенту значительную экономию на разработке.
Сроки разработки типового сайта
| Этап | Время |
|---|---|
| Установка, конфиг БД, базовые списки | 1 день |
| 3–5 моделей с отношениями | 2–3 дня |
| Настройка доступа и ролей | 1 день |
| Аутентификация + сессии | 0.5 дня |
| Интеграция с фронтендом | 2–3 дня |
| Деплой + миграции | 0.5–1 день |
| Итого для среднего сайта | 7–10 дней |
Для сложных проектов — 3–5 недель. Получите консультацию нашего инженера для оценки вашего проекта.







