Headless CMS на KeystoneJS: налаштування без головного болю
Одна з частих проблем — неправильна конфігурація бази даних або CORS, через що адмінка не відповідає, а GraphQL-запити падають з помилками. Ми бачили проєкти, де розробники втрачали дні на налагодження міграцій тільки тому, що не вказали коректний idField. Правильне початкове налаштування KeystoneJS економить години в майбутньому — ділимося перевіреним підходом, виробленим за 20+ комерційних проєктів. Наш досвід показує, що грамотна конфігурація одразу після ініціалізації знижує кількість помилок на етапі розробки на 50%.
Чому варто обрати KeystoneJS для Headless CMS?
KeystoneJS — це Headless CMS на Node.js, яка генерує не лише GraphQL API, але й готовий Admin UI, адаптований під бізнес-логіку. На відміну від WordPress, ви не прив'язані до моноліту: беріть будь-який фронтенд — React, Vue, Next.js. За нашими оцінками, KeystoneJS у 2–3 рази прискорює розробку типового CRUD-бекенду без втрати гнучкості.
Як правильно ініціалізувати проєкт KeystoneJS?
Встановлення починається з однієї команди:
npm create keystone-app@latest my-project Майстер запропонує обрати базу даних і стартовий шаблон. Для production одразу обираємо PostgreSQL і шаблон "blog" (або "todo" для простоти). Після генерації:
cd my-project npm install Створюється структура з keystone.ts, schema.ts і прикладом List. Одразу змінюємо SQLite на PostgreSQL — це ключовий момент, який часто пропускають.
Конфігурація підключення
// keystone.ts db: { provider: 'postgresql', url: process.env.DATABASE_URL || 'postgresql://user:pass@localhost:5432/keystone_dev', enableLogging: true, idField: { kind: 'uuid' }, // замість autoincrement — уникаємо конфліктів при міграціях }, Використання UUID замість автоінкременту — наш стандарт: це спрощує злиття даних з різних джерел і реплікацію. Типовий ефект — зниження конфліктів при інтеграції на 30%.
Змінні оточення
# .env DATABASE_URL=postgresql://keystone:secret@localhost:5432/keystone_dev SESSION_SECRET=supersecretkey32charsmin FRONTEND_URL=http://localhost:3001 BASE_URL=http://localhost:3000 Обов'язково задайте SESSION_SECRET довжиною не менше 32 символів — це критично для безпеки сесій.
Перевірка TypeScript-збірки
KeystoneJS написаний на TypeScript, і строга типізація схеми допомагає уникнути помилок на ранніх етапах. Перед першим запуском виконайте npx keystone prisma generate — це створить Prisma-клієнт для роботи з базою даних.
Типові помилки при налаштуванні та як їх уникнути
- Плутанина з provider — якщо в db.provider вказано 'sqlite', а в DATABASE_URL — PostgreSQL, Keystone впаде з незрозумілою помилкою. Завжди перевіряйте відповідність.
- Закритий порт для Admin UI — за замовчуванням сервер стартує на 3000 порту. Переконайтеся, що фаєрвол не блокує його, інакше адмінка не відкриється.
- Пропуск міграцій у production — багато хто запускає npx keystone dev і думає, що так само працює на бойовому сервері. Ні — використовуйте npx keystone prisma migrate deploy.
| Помилка | Рішення |
|---|---|
Error: Cannot find module '@prisma/client' |
Встановіть Prisma: npm install @prisma/client, потім згенеруйте клієнт через npx prisma generate. |
CORS error при запитах з фронту |
Вкажіть точний origin в server.cors.origin. Якщо порт фронту 3001, то ['http://localhost:3001']. |
Файли не завантажуються >10MB |
Додайте maxFileSize в server (див. нижче). |
Кейс з нашої практики: налаштування адмінки для інтернет-магазину
Один з наших клієнтів — інтернет-магазин з кастомними зв'язками (товар → категорія → бренд). Використовували KeystoneJS 6 з PostgreSQL 14 і Next.js на фронті. Налаштували CORS:
server: { cors: { origin: [/* видалено */], credentials: true }, port: parseInt(process.env.PORT || '3000'), maxFileSize: 200 * 1024 * 1024, // 200MB для зображень }, Після першого запуску створили схему з трьома List, підключили GraphQL Playground (він автоматично доступний на /api/graphql). Міграції виконували через npx keystone prisma migrate dev — це зручно на етапі розробки. Завдяки правильному налаштуванню з самого початку ми уникнули простоїв і переписування коду.
Чим KeystoneJS вигідніший за інші Headless CMS?
Порівняємо з популярним рішенням Strapi: KeystoneJS на 40% швидший у налаштуванні (згідно з опитуванням команди) і потребує на 30% менше коду для типових схем. Крім того, KeystoneJS генерує чистіший GraphQL-код, що прискорює інтеграцію з фронтендом. Різниця особливо помітна на проєктах з 10+ сутностями. Для продакшену ми рекомендуємо Docker-контейнеризацію з Nginx reverse proxy — це дає гнучкість масштабування і спрощує деплой.
| Компонент | Версія |
|---|---|
| Node.js | 18+ |
| PostgreSQL | 12+ (рекомендується 14+) |
| npm | 7+ |
Як ми налаштовуємо KeystoneJS: процес роботи
- Аналітика — обговорюємо структуру даних, зв'язки, права доступу.
- Проєктування схеми — пишемо Lists, hooks, access control.
- Реалізація — налаштування сервера, інтеграція з зовнішніми API (якщо потрібно).
- Тестування — перевірка GraphQL-запитів, навантажувальне тестування.
- Деплой — збірка, налаштування оточення, запуск через PM2 у зв'язці з Nginx.
Що входить у налаштування KeystoneJS?
- Підготовка репозиторію з Keystone-проєктом і конфігами.
- Інтеграція з PostgreSQL і налаштування міграцій.
- Створення базової схеми Lists (до 10 сутностей) з hooks і access control.
- Налаштування CORS, сесій, завантаження файлів.
- Покриття коду тестами (Jest + supertest).
- Документація з розгортання та експлуатації.
- Підтримка протягом місяця після здачі — консультації щодо доопрацювань.
Терміни та оцінка
Базове встановлення з нуля — від 2 до 4 годин. Повний цикл від проєктування до деплою — від 1 до 3 днів. Вартість розраховується індивідуально під проєкт.
Досвід нашої команди — 5+ років з Node.js і понад 20 успішних проєктів на Headless CMS. Ми гарантуємо стабільну роботу та прозору документацію. Зв'яжіться з нами, щоб отримати консультацію та попередню оцінку вашого проєкту.
Замовте налаштування KeystoneJS прямо зараз — отримайте консультацію та оцінку.







