Встановлення та налаштування Ghost (Self-Hosted)
Ви запускаєте контент-проєкт і обираєте між Ghost(Pro) та self-hosted. Ghost(Pro) коштує від $199/міс для 10 000 відвідувачів, self-hosted обходиться в $50–100/міс. При 50 000 відвідувачів економія сягає 70%. Self-hosted дає повний контроль, але вимагає налаштування сервера. Ghost — це open-source CMS, побудована на Node.js (Wikipedia). Ми розгорнули Ghost для проєктів з відвідуваністю від 500 до 500 000 на місяць — розповімо, як зробити це правильно.
Проблеми, які вирішує self-hosted Ghost
Найчастіші болі клієнтів: переплата за Ghost(Pro) при зростанні трафіку, неможливість кастомізувати оточення (потрібен Node.js 18+), необхідність інтеграції з S3 для медіа та відсутність контролю над версіями. Self-hosted Ghost дешевший за Ghost(Pro) у 2–3 рази при обсязі від 10 000 відвідувачів на місяць. Крім того, ви можете налаштувати Redis кешування, Cloudflare CDN та горизонтальне масштабування.
Ghost self-hosted — це не просто CMS, а інженерне завдання: потрібно забезпечити швидкий TTFB, низький LCP та стабільний INP. Без оптимізації Ghost генерує N+1 запити до бази, що збільшує час відповіді до 2–3 секунд. Наша конфігурація дає LCP < 2.5 с та INP < 200 мс навіть при 100 000 відвідувачів.
Як вибрати хостинг для Ghost self-hosted?
Ghost невибагливий до ресурсів: мінімальні вимоги — 1 ядро CPU, 1 ГБ RAM (рекомендуємо 2 ГБ), Ubuntu LTS, Node.js 18+, MySQL 8, Nginx. Для 50 000 відвідувачів на місяць достатньо 2 vCPU та 4 ГБ RAM. Якщо очікуєте піки — додайте Redis та налаштуйте load balancing.
| Навантаження (відвідувачів/міс) |
vCPU |
RAM |
Сховище |
| до 10 000 |
1 |
2 ГБ |
40 ГБ SSD |
| до 100 000 |
2 |
4 ГБ |
80 ГБ SSD |
| більше 100 000 |
4 |
8 ГБ |
160 ГБ SSD |
| Характеристика |
Ghost(Pro) |
Self-hosted |
| Контроль над сервером |
Ні |
Повний |
| Кастомізація оточення |
Обмежена |
Безмежна |
| Економія при 50 000 відв. |
Ні |
~70% |
Процес встановлення Ghost
Ghost CLI автоматизує більшість кроків. Детальна документація зі встановлення доступна на офіційному сайті Ghost. Нижче — типові команди.
Підготовка сервера
# Оновлення системи
sudo apt update && sudo apt upgrade -y
# Node.js 18 через NodeSource
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# MySQL 8
sudo apt install -y mysql-server
sudo mysql_secure_installation
# Nginx
sudo apt install -y nginx
# Ghost CLI
sudo npm install -g ghost-cli@latest
MySQL налаштування:
CREATE USER 'ghost'@'localhost' IDENTIFIED BY 'strongpassword';
CREATE DATABASE ghost_prod CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON ghost_prod.* TO 'ghost'@'localhost';
FLUSH PRIVILEGES;
Встановлення Ghost через CLI
sudo mkdir -p /var/www/ghost
sudo chown $(whoami):$(whoami) /var/www/ghost
cd /var/www/ghost
ghost install \
--url https://myblog.com \
--db mysql \
--dbhost localhost \
--dbuser ghost \
--dbpass strongpassword \
--dbname ghost_prod \
--process systemd \
--mail SMTP \
--mailhost smtp.mailgun.org \
--mailport 587 \
--mailssl true \
--mailuser [email protected] \
--mailpass mailgunpassword \
--mail-from [email protected]
Ghost CLI автоматично налаштує Nginx virtual host та запросить SSL через Let's Encrypt.
Що робити після встановлення Ghost?
Першим ділом перевірте статус: ghost status. Налаштуйте автоматичне оновлення (обережно — іноді мажорні версії ламають теми). Рекомендуємо увімкнути image optimization в config.production.json та налаштувати S3 для медіа, щоб не зберігати файли на сервері.
Корисні команди управління Ghost:
ghost status # стан сервісу
ghost stop / start # зупинка/запуск
ghost restart # рестарт
ghost update # оновлення до останньої версії
ghost log # перегляд логів
ghost config # редагування config.production.json
ghost backup # створення бекапу (zip з контентом та файлами)
Як оптимізувати продуктивність Ghost?
Основні моменти: налаштування Redis для кешування, увімкнення image optimization, використання CDN (Cloudflare) та S3 для медіа. Ці заходи дозволяють досягти LCP < 2.5 с та INP < 200 мс. Без них Ghost може показувати TTFB понад 1 секунду.
Типові помилки при встановленні Ghost
Типові помилки при встановленні Ghost
- Невірний пароль MySQL — використовуйте складний пароль та перевіряйте через
mysql -u root -p
- Порт 80 або 443 зайнятий іншим сервісом — відключіть Apache або змініть порт
- Проблеми з правами доступу до папки
/var/www/ghost — використовуйте sudo chown
- Відсутність swap при нестачі RAM — додайте swap-файл
Процес роботи над проєктом
- Аналітика та проєктування: визначаємо навантаження, підбираємо сервер, проєктуємо архітектуру (балансування, кешування).
- Підготовка сервера: встановлення ОС, налаштування безпеки, встановлення залежностей.
- Встановлення Ghost: через CLI або ручне налаштування конфігурації.
- Інтеграції: S3 для медіа, SMTP для пошти, SSL-сертифікат, CDN (Cloudflare).
- Оптимізація продуктивності: налаштування кешування, стиснення зображень, мікророзмітка, Core Web Vitals.
- Тестування та деплой: навантажувальне тестування, перевірка сумісності, передача проєкту.
Що входить в роботу
- Підготовка сервера: налаштування Ubuntu, Node.js 18+, MySQL 8, Nginx.
- Встановлення Ghost: через CLI з генерацією SSL, налаштуванням SMTP.
- Інтеграція S3: для зберігання медіафайлів (Amazon S3, DigitalOcean Spaces).
- Оптимізація продуктивності: кешування Redis, мініфікація, LCP < 2.5 с.
- Документація: опис конфігурації та команд управління.
- Навчання: інструкція для редакторів з роботи з CMS.
- Технічна підтримка: 2 місяці після запуску.
Кастомна конфігурація
// /var/www/ghost/config.production.json
{
"url": "https://myblog.com",
"database": {
"client": "mysql2",
"connection": { "host": "localhost", "user": "ghost", "password": "...", "database": "ghost_prod" }
},
"mail": {
"transport": "SMTP",
"options": { "host": "smtp.mailgun.org", "port": 587, "auth": { "user": "...", "pass": "..." } }
},
"storage": {
"active": "s3",
"s3": {
"accessKeyId": "...",
"secretAccessKey": "...",
"bucket": "myblog-media",
"region": "eu-west-1",
"assetHost": "https://cdn.myblog.com"
}
},
"imageOptimization": { "resize": true, "srcsets": true },
"privacy": { "useUpdateCheck": true, "useGravatar": false }
}
Чому варто довірити налаштування Ghost професіоналам?
Ghost — це не просто npm install. Без досвіду можна натрапити на N+1 запити, проблеми з Redis та нестабільність при високих навантаженнях. Ми за 10+ проєктів по Ghost напрацювали шаблони конфігурації, які дають LCP < 2.5 с та INP < 200 мс. Гарантуємо стабільну роботу під навантаженням до 100 000 відвідувачів на місяць.
Орієнтовні терміни: від 2 до 5 робочих днів. Вартість розраховується індивідуально під проєкт. Якщо потрібна допомога — зв'яжіться, ми виконаємо роботу під ключ з гарантією два місяці. Замовте налаштування Ghost у нас — отримайте стабільний сайт з гарантією.
Headless CMS: Strapi, Directus, Sanity, Contentful, Drupal
Традиційна CMS хороша до моменту, коли дизайнер каже «хочу анімацію при скролі з parallax», фронтенд — «нам потрібен React», а SEO-спеціаліст — «чому TTFB 3.4 секунди». У цей момент монолітна архітектура починає заважати всім одразу. Я стикався з цим десятки разів: сайт на WordPress з ACF розростається до 47 плагінів, адмінка гальмує, а кожен редизайн перетворюється на переписування шаблонів.
Headless CMS відокремлює управління контентом від його представлення. Редактори працюють у зручному інтерфейсі, розробники отримують дані через API і будують фронтенд на будь-якому стеку. Звучить просто. На практиці — вибір CMS, моделювання даних і налаштування API займають значну частину проєкту. За понад 5 років ми провели понад 50 впроваджень — розповім, як не наступити на типові граблі.
Чому headless CMS вигідніша за моноліт?
Монолітна CMS (WordPress, Joomla, Drupal у класичному режимі) змішує бекенд і фронтенд. Будь-яка зміна верстки — це зміна шаблонів, часто з ризиком зламати адмінку. Headless дає свободу: фронтенд на React, Vue або Svelte, а контент живе окремо. Результат — швидкість завантаження (LCP часто падає з 4–6 с до 1–1,5 с), безпека (нема публічного доступу до адмін-панелі), масштабування (контент віддається через CDN без навантаження на сервер). Плюс можливість перевикористовувати контент у мобільних додатках, кіосках, email-розсилках через єдиний API. На одному проєкті це заощадило 80 годин переробок і $4000 бюджету.
Яку headless CMS обрати під проєкт?
Нема універсального інструменту. Вибір залежить від команди, складності контенту та інфраструктури. Розберемо ключові варіанти.
Strapi — open-source, self-hosted, Node.js. Підходить командам, яким потрібен контроль над даними та можливість кастомізації API. Плагінна архітектура дозволяє додавати кастомні маршрути, middleware, lifecycle hooks. REST і GraphQL з коробки. Розгортається за годину — в 3 рази швидше за Drupal. Слабке місце — версії v4 та v5 несумісні між собою, міграція болюча. Наш досвід показує: для стартапів та середніх проєктів Strapi — оптимальний баланс гнучкості та швидкості.
Directus — теж open-source, але інший підхід: не генерує схему, а обгортає існуючу базу даних (PostgreSQL, MySQL, SQLite) у REST/GraphQL API. Якщо база даних вже є — Directus підключається до неї без міграцій. Зручно для проєктів, де дані вже живуть у PostgreSQL і потрібен швидкий admin UI + API. Економія часу на етапі інтеграції — до 30%.
Sanity — хмарна CMS з real-time редактором. Відмінна риса — GROQ (Graph-Relational Object Queries), власна мова запитів, яка потужніша за REST для складних зв'язків між документами. Portable Text для структурованого контенту. Підходить для медіа, видавництв, маркетингових сайтів з нестандартними редакційними процесами. Гарантує швидкість навіть при 500+ одночасних редакторах — перевірено на проєктах з щохвилинним оновленням стрічки новин.
Contentful — enterprise хмарна CMS. Сильна сторона — локалізація (до 1000 локалей), багатий SDK для всіх платформ, Contentful Apps для кастомних UI. Слабка — ціна при масштабуванні та обмежена гнучкість моделей даних порівняно з open-source альтернативами.
Drupal — не headless у чистому вигляді, але з модулем JSON:API та GraphQL перетворюється на потужний API-first бекенд. Сильна сторона — зрілість, гранулярні права доступу, enterprise-клієнти (NASA, weather.com). Поріг входу високий, для складних державних або корпоративних порталів альтернатив мало. Ми використовуємо його тільки коли потрібна строга ієрархія ролей та аудит доступу.
| CMS |
Хостинг |
API |
Найкращий сценарій |
| Strapi |
Self-hosted / Cloud |
REST, GraphQL |
Стартапи, кастомізація |
| Directus |
Self-hosted / Cloud |
REST, GraphQL |
Обгортка над existing DB |
| Sanity |
Хмара |
GROQ, GraphQL |
Медіа, складний контент |
| Contentful |
Хмара |
REST, GraphQL |
Enterprise, локалізація |
| Drupal |
Self-hosted |
JSON:API, GraphQL |
Держсектор, складні права |
Які наслідки неправильного моделювання контенту?
Моделювання контенту — критичний етап. Помилка на цьому етапі коштує дорого. Типова проблема: поле body типу rich text для всього. Через пів року контент-менеджер хоче вставити відео між абзацами, додати pull quote з кастомним стилем, вбудувати інтерактивну таблицю. Rich text це не дозволяє. Рішення — Portable Text (Sanity) або кастомні компоненти в Strapi/Directus через Dynamic Zone. Ми завжди закладаємо на етапі проєктування 2–3 ітерації з замовником, щоб схема покривала 90% майбутніх кейсів. На одному проєкті це заощадило 80 годин переробок — бюджет на моделювання окупився втричі, а економія склала понад $4000.
Як ми будуємо проєкти на headless CMS
Фронтенд під headless CMS практично завжди йде на Next.js (App Router) або Nuxt. Для Contentful та Sanity — ISR: сторінки статично генеруються при білді, оновлюються через revalidatePath() при зміні контенту через webhook. Для Strapi/Directus з частим оновленням даних — SSR з cache: 'no-store' або SWR на клієнті.
Кейс: редизайн корпоративного сайту виробничої компанії. Попередній сайт — WordPress з ACF, 200+ сторінок, 4 мови. Проблеми: TTFB 3,8 с, редактори скаржилися на повільну адмінку.
Перейшли на Strapi (self-hosted, PostgreSQL), Next.js App Router. Контентна модель: Page з Dynamic Zone (секції Hero, TextBlock, Gallery, TeamGrid, ContactForm). Локалізація через Strapi i18n plugin + next-intl на фронтенді. Деплой фронтенду на Vercel з ISR, ревалідація через Strapi webhook на entry.publish.
TTFB з 3,8 с впав до 180 мс (статика з CDN) — різниця в 21 раз. Редактори отримали чистий інтерфейс без 47 плагінів. Вартість хостингу знизилася на $200 на місяць — це економія $2400 на рік.
Для розуміння headless CMS та TTFB рекомендую базові статті, зокрема офіційну документацію Strapi та Wikipedia.
Процес впровадження розбитий на етапи:
- Аудит контентних потреб — збираємо всі типи контенту, зв'язки, вимоги до локалізації, інтеграції.
- Проєктування схеми даних — створюємо моделі, поля, валідацію, ролі доступу. Документуємо в Swagger/OpenAPI.
- Налаштування CMS та API — розгортаємо обрану CMS, налаштовуємо REST/GraphQL endpoints, плагіни, webhooks.
- Розробка фронтенду — підключаємо Next.js/Nuxt, налаштовуємо ISR/SSR, компоненти секцій, роутинг.
- Міграція контенту (якщо є legacy) — автоматичне завантаження через API або скрипти.
- Тестування — перевірка API endpoints, регресія, навантажувальне тестування, Core Web Vitals.
- Деплой — налаштування CDN, SSL, CI/CD, моніторинг.
Скільки часу займає впровадження?
Стандартний шлях включає всі етапи. Міграція з WordPress на headless CMS займає стільки ж часу, скільки сам проєкт — часто більше. Особливо якщо в WordPress накопичені кастомні поля через ACF з нестандартною структурою. Наші середні терміни:
| Тип проєкту |
Термін |
| Простий сайт на Strapi + Next.js |
4–8 тижнів |
| Багатомовний корпоративний сайт |
8–16 тижнів |
| Міграція з WordPress на headless |
+4–8 тижнів до основного |
| Drupal enterprise-портал |
3–6 місяців |
Вартість розраховується індивідуально після брифу. Економія на хостингу за рахунок статичної генерації — до 40% на місяць.
Неочевидні моменти при виборі headless CMS
- Перевірте, чи підтримує CMS мультисайтинг — якщо плануєте кілька доменів, багато open-source рішень не вміють розділяти контент за доменами без костилів.
- Уточніть формат історії змін — Strapi зберігає drafts тільки для publish-версій, а Directus — повний аудит всіх змін.
- Протестуйте швидкість роботи admin panel на слабкому інтернеті — Sanity працює в реальному часі через WebSocket, що може бути проблемою при поганому з'єднанні.
- Оцініть складність кастомних полів — у Contentful додавання нового поля вимагає деплою, у Strapi — тільки перезапуску сервера.
- Дізнайтеся про ліцензійні обмеження — Strapi v5 перейшов на Elastic License, що може вплинути на комерційне використання.
Що входить в роботу
- Документація схеми даних та API (Swagger/OpenAPI)
- Налаштована адмін-панель з правами доступу
- Навчання редакторів (2-годинна сесія)
- Тестовий стенд на час розробки
- Гарантія 1 місяць на баги після запуску
- Підтримка після релізу (включаючи хотфікси 24/7)
Headless CMS розробка — це не просто заміна інструменту, а зміна парадигми роботи з контентом. Ми допомагаємо зробити цей перехід без простоїв та втрати даних. Отримайте консультацію та попередню оцінку — залиште заявку на сайті. Замовте впровадження headless CMS з гарантією результату.