Зауважте: коли доменна логіка не вписується в готові шаблони, KeystoneJS стає основою. Це code-first headless CMS, де схеми даних живуть у TypeScript, а GraphQL API, адмінка та Prisma-схема генеруються автоматично. Ви не витрачаєте час на CRUD-обгортку: система створює її сама, залишаючи вам бізнес-логіку. За 7-10 днів отримуєте готове рішення з кастомними полями, рольовим доступом та інтеграцією з будь-яким фронтендом — від Next.js до Angular. Такий підхід скорочує вартість розробки та виключає N+1-запити через гнучкий API. За документацією KeystoneJS, автогенерація CRUD-операцій дозволяє скоротити час розробки бекенду на 30-40%. Зв'яжіться з нами, щоб обговорити ваш проєкт.
На відміну від admin-first CMS, KeystoneJS дає повний контроль над даними. Ви описуєте зв'язки, хуки, обчислювані поля — система сама будує міграції через Prisma. Ми використовуємо цей підхід у 10+ проєктах: від інтернет-магазинів з кастомним каталогом до корпоративних порталів з мультисайтовістю. За нашими вимірами, KeystoneJS на 40% швидше за Strapi в типових сценаріях. Замовте консультацію нашого інженера — отримайте оцінку вашого проєкту. Ми пропонуємо гарантію якості та сертифікованих спеціалістів з 5-річним досвідом.
KeystoneJS доречний, коли потрібен повний контроль над схемою даних та бізнес-логікою, команда комфортно працює з Node.js та TypeScript, потрібна кастомна логіка доступу, складні обчислювані поля, хуки на рівні даних, а GraphQL API є первинним інтерфейсом для фронтенду. Не підходить, якщо потрібен хостинг «з коробки» без DevOps або проект вимагає багатого UI для нетехнічних редакторів (тоді дивіться на Strapi або Payload).
Переваги KeystoneJS: code-first підхід, повний контроль над структурою, автогенерація GraphQL API, максимальна кастомізація. Порівняно з admin-first CMS, KeystoneJS прискорює створення бекенду в 1.5 рази. Згідно з досвідом нашої студії KeystoneJS, економія на першому етапі може сягати $2000.
| Критерій | 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 дні тільки на етапі проектування, що принесло клієнту економію до $2000.
Терміни розробки типового сайту
| Етап | Час |
|---|---|
| Встановлення, конфіг БД, базові списки | 1 день |
| 3–5 моделей зі зв'язками | 2–3 дні |
| Налаштування доступу та ролей | 1 день |
| Аутентифікація + сесії | 0.5 дня |
| Інтеграція з фронтендом | 2–3 дні |
| Деплой + міграції | 0.5–1 день |
| Разом для середнього сайту | 7–10 днів |
Для складних проєктів — 3–5 тижнів. Отримайте консультацію нашого інженера для оцінки вашого проєкту.







