Ghost
Своя платформа публикаций: профессиональный блог, платные подписки и email-рассылки в одном. Self-host замена связке WordPress + Substack. Развернули актуальную версию в боевом режиме, замерили и проверили вживую: сайт, админка и вход владельца работают.
Вердикт
- нужен профессиональный блог/издание на своем сервере, а не в чужом облаке
- хотите платные подписки и членство без комиссии платформы за подписчиков
- нужна встроенная email-рассылка постов аудитории
- нужен универсальный CMS-конструктор с плагинами на все - это к WordPress
- не готовы подключать внешний SMTP/Mailgun ради рассылок
- нужна приватная база знаний команды, а не публичное издание - берите Outline
Что это и какую задачу решает
Ghost - open-source платформа для публикаций: профессиональное издание, где из коробки есть блог, платные подписки и членство, а также email-рассылки. Вы пишете посты в чистом редакторе, собираете аудиторию по подписке, шлете ей письма с новыми материалами и берете деньги за платный контент. По сути это self-host замена связке WordPress + Substack + Mailchimp - только аудитория и данные остаются на вашем сервере, без комиссии платформы за каждого подписчика.
В отличие от универсального CMS вроде WordPress, Ghost сфокусирован на одном сценарии - издание с монетизацией - и делает его хорошо: быстрый движок на Node.js, встроенные members и newsletter, чистые темы, SEO и RSS без плагинов.
Чем отличается от WordPress и Substack
Сравнение по тому, что влияет на выбор для издания с подпиской.
| Параметр | Ghost (self-hosted) | Substack / облако |
|---|---|---|
| Где данные и аудитория | на вашем сервере | у платформы |
| Комиссия за подписчиков | нет (только Stripe-комиссия) | процент с выручки |
| Подписки и членство | встроены | встроены |
| Дизайн и темы | свои темы, полный контроль | ограничен |
| Рассылка | встроена, нужен свой SMTP/Mailgun | встроена |
Тех-стек и архитектура
Ghost - приложение на Node.js: публичный сайт (тема на Handlebars, по умолчанию Casper), админка `/ghost/` и два API (Admin и Content), порт 2368. Для прода обязательна база MySQL 8 - Ghost 6 в production на встроенной SQLite официально не поддерживается. Наружу приложение слушает только localhost, публичный доступ - через Caddy обратным прокси с авто-TLS.
Данные лежат в двух томах: MySQL (посты, подписчики, настройки) и content (загруженные картинки, темы). Прием денег за платные подписки - через ваш аккаунт Stripe; массовая email-рассылка - через внешний почтовый провайдер (Mailgun/SMTP).
Минимальная конфигурация
Реальные требования против официального минимума.
| Минимум для теста | CPU2-RAM4-DISK50 |
| Реально в простое (весь стек) | ~0.69 GB RAM (ghost 201 + mysql 474 + caddy 13 MiB) |
| Образы на диске | ~2.66 GB (ghost 1.45 + mysql 1.12 + caddy 0.09) |
| Рекомендуем тариф | CPU2-RAM4-DISK50 |
Важно: основная память уходит на MySQL 8 (~470 МиБ). Само приложение Ghost легкое (~200 МиБ). Тарифа CPU2-RAM4 хватает с запасом; на 2 ГБ стек стартует, но MySQL под нагрузкой будет тесно.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий домен, валидный TLS и уже созданный аккаунт владельца - вход паролем сервера.
Рекомендуемая конфигурация: CPU2-RAM4-DISK50
Развертывание на Fatmetal
Базовый путь - Cloud Server + Ubuntu 24.04 + Docker за Caddy.
Создать VM
Ubuntu 24.04 с Docker. Тариф CPU2-RAM4 - с запасом под MySQL 8.
Задать переменные
url=https://ваш-домен database__client=mysql database__connection__host=mysql database__connection__password=...urlобязан совпадать с публичным адресом, иначе ссылки и админка ведут на localhost - это главная грабля.Поднять стек
docker compose pull docker compose up -dДва контейнера:
ghostиmysql. Проверка:curl localhost:2368/.Закрыть TLS
Caddy обратным прокси на :2368 - автоматический сертификат Let's Encrypt на ваш домен.
Что измерили после запуска
Цифры со свежей установки, весь стек без нагрузки.
| Контейнеров | 3 (ghost + mysql + Caddy) |
| RAM в простое (весь стек) | ~0.69 GB (mysql ~474 MiB) |
| Образы на диске | ~2.66 GB |
| Health-check | сайт / -> 200; /ghost/ -> 200 |
| Внешний отклик | https 200, валидный Let's Encrypt |
Вход проверили предметно: создали аккаунт владельца через setup API, затем зашли в админ-консоль - открылся дашборд Analytics с постами и подписчиками, а название сайта сменилось на заданное. То есть вход владельца действительно пускает в консоль, а не просто отдает мастер.
Проверено на версии 6.55.0, август 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Реальные грабли Ghost за прокси и с почтой.
Причина. Не задан или неверен url: Ghost строит по нему абсолютные адреса, и за прокси они уезжают на внутренний.
Решение. Задайте url=https://ваш-домен и перезапустите контейнер. В карте маркетплейса это уже настроено.
MySQL 8 обязателен. Ghost 6 в production на SQLite не поднимется. В карте база - MySQL 8 из коробки.
Рассылка требует внешней почты. Массовые письма подписчикам и транзакционные (инвайты, сброс пароля) уходят только через внешний SMTP/Mailgun. Сайт, посты и подписки работают и без почты - но перед запуском рассылок подключите провайдера.
Безопасность и обновления
Сразу смените пароль владельца (в карте он равен паролю сервера) в Settings -> Staff. Порт 2368 наружу не публикуйте - только через прокси с TLS. Для платных подписок подключайте свой Stripe. Приглашайте соавторов с ограниченными ролями, а не общим владельцем.
Обновление - смена тега образа:
docker compose pull && docker compose up -d
Бэкап - оба тома (база и контент):
docker exec ghost-mysql-1 mysqldump -u root -p ghost > ghost-db.sql
Перед продом закройте: смену пароля владельца, TLS на прокси, внешний SMTP для писем, свой Stripe и регулярный бэкап томов базы и контента.
Связь с другими стеками
- Почта - внешний Mailgun или свой SMTP для рассылок и транзакционных писем.
- Обратный прокси - Caddy или Nginx Proxy Manager для TLS и единого домена.
- Аналитика - Plausible или Umami рядом, чтобы считать трафик издания без Google.
- Мониторинг - Prometheus и Grafana по метрикам контейнеров и MySQL.
Когда это НЕ ваш выбор
Нужен универсальный сайт-конструктор
Если задача - интернет-магазин, форум или лендинг с кучей плагинов, Ghost узок. Это к WordPress или профильному движку.
Не готовы к внешней почте
Без SMTP/Mailgun рассылки и инвайты не уходят. Если email-рассылка - ключевая цель, заложите почтового провайдера сразу.
Нужна приватная база знаний
Ghost - публичное издание. Для внутренней вики команды берите Outline, а не Ghost.
Частые вопросы
Почему у меня ссылки ведут на localhost?
Не задан или неверен `url`. Укажите его как публичный https-адрес и перезапустите Ghost. В карте маркетплейса это уже настроено.
Нужна ли отдельная база?
Да, MySQL 8 - он обязателен для Ghost 6 в проде. В карте MySQL 8 разворачивается автоматически рядом.
Как отправлять рассылку подписчикам?
Подключите внешний почтовый провайдер (Mailgun или SMTP) в конфиге Ghost. Без него письма не уходят, хотя сайт и подписки работают.
Как брать деньги за подписку?
Через ваш аккаунт Stripe - Ghost интегрируется с ним для платных тиров членства.
Хватит ли 2 GB RAM?
Впритык из-за MySQL. Комфортно - CPU2-RAM4, весь стек в простое около 0.69 GB.
Можно в продакшен?
Да. Мы разворачиваем боевой режим с MySQL 8 и TLS. Останется сменить пароль владельца, подключить SMTP и Stripe, настроить бэкап.
Какие ограничения лицензии?
Лицензия MIT - свободное использование, в том числе коммерческое. Ограничений на хостинг нет.
Итог
Ghost - зрелый способ вести профессиональное издание на своем сервере: блог, платные подписки и email-рассылки в одном, под лицензией MIT. Аудитория и данные у вас, без комиссии платформы за подписчиков. Весь стек в простое ест около 0.69 GB, вход владельца проверили вживую. Плата - обязательный MySQL 8 и внешний SMTP для рассылок, плюс правильный `url` за прокси, который мы закрыли в карте из коробки.
Этот стек у нас запущен на тарифе CPU2-RAM4. Нашли баг в гайде - напишите, поправим в течение дня.