Індекс журналуDockup / польова нотатка
Note / self-host-ghost

Як самостійно розгорнути Ghost у 2026 році: MySQL, розсилки та резервні копії контенту

Практичний посібник із self-hosting Ghost: Docker, порти, постійне зберігання даних, TLS, безпека, резервні копії та проблеми, що перешкоджають використанню в production. Покроково.

Невдале розгортання Ghost не завжди призводить до падіння. Система може показувати сторінку входу, хоча значення url — HTTP, або том із контентом було замінено. Натомість почніть із наскрізної перевірки: завершіть налаштування власника, опублікуйте допис із зображенням, підпишіть учасника та надішліть тестову розсилку через налаштовану email-систему.

Ця перевірка відповідає задекларованому призначенню Ghost: платформа для публікацій із membership-функціями та розсилками. Вона також раніше за uptime-пробу виявляє відсутні залежності, неправильні припущення щодо proxy та ефемерні дані.

Окресліть межі середовища виконання Ghost

Окресліть навколо Ghost три межі: ingress до порту 2368, постійний стан і супровідні вимоги. Контейнер можна замінити, але для двох інших компонентів потрібно явно визначити відповідальних. Мережевий контракт Ghost передбачає MySQL 8, SMTP і додаткове object storage для сайтів із великою кількістю медіа. Приватні endpoint-и залишайте у внутрішньому DNS, дозволяйте лише необхідні вихідні з’єднання та надайте Ghost service credential із обмеженими правами.

Схема вважається повною, коли чистий клієнт може завершити налаштування власника, опублікувати допис із зображенням, підписати учасника та надіслати тестову розсилку через налаштовану email-систему. Збирайте дані про час і використання ресурсів для MySQL-запитів, сховища зображень, рендерингу тем, кількості учасників і лімітів провайдера bulk mail. Якщо транзакція завершується помилкою, перша межа, яка працює не так, як описано в документації, підказує, чи потрібно перевіряти маршрутизацію, локальну ємність або супровідний сервіс.

Переконайтеся, що Ghost переживає заміну

Образ контейнера можна завантажити повторно, а базу даних MySQL, теми, зображення та файли контенту — ні. Підключіть /var/lib/ghost/content до bootstrap, запишіть безпечні тестові дані та замініть контейнер, щоб перевірити, чи справді цей шлях зберігається. Перевіряйте фактичне підключення тому, а не покладайтеся на назву Compose-файлу, і переконайтеся, що runtime-користувач може записувати дані туди, де цього очікує Ghost.

Визначте політику зберігання та віддалене сховище, а потім відпрацюйте відновлення, не торкаючись production. Перевірка вважається успішною лише тоді, коли повернулися дописи, учасники, розсилки, теми та зображення, а тестовий учасник може відкрити відновлену публікацію. Для стану, що зберігається в базі даних, поєднуйте snapshots сховища з application-consistent exports, як описано в матеріалі відновлення до моменту часу проти snapshots.

Облікові дані, ролі та відкриті поверхні

Специфічний для застосунку ризик безпеці полягає у використанні SQLite для непідтримуваної production-топології або витоку облікових даних пошти. Операційна відповідь — захистити Ghost Admin, зберігати облікові дані пошти й бази даних на сервері та встановити фінальну HTTPS URL перед публікацією. Завершіть bootstrap через обмежений маршрут і відразу після цього видаліть тимчасовий доступ до налаштування.

url — це конфігурація, а не секрет; зберігайте його значення явним, водночас захищаючи окремі облікові дані, які використовує Ghost. Надайте процесу Ghost лише документовані mount-и та маршрути до залежностей; не надавайте доступу до root хоста й Docker socket. Записуйте невдалі спроби автентифікації та помилки конфігурації, але редагуйте tokens, connection strings і користувацький контент.

Перевірте розгортання Ghost наскрізь

У записі про реліз Ghost мають бути факти, а не формулювання «виглядає добре». Збережіть вибраний digest образу, checksum конфігурації, публічне ім’я хоста та результат із часовою позначкою для таких дій: завершити налаштування власника, опублікувати допис із зображенням, підписати учасника та надіслати тестову розсилку через налаштовану email-систему. Використовуйте тестові дані не з production, щоб перевірку можна було запускати після кожного розгортання.

Окремо перевірте дві події життєвого циклу. Заміна контейнера має зберігати нормальну роботу, а чисте відновлення повинно показати, що дописи, учасники, розсилки, теми та зображення повернулися і тестовий учасник може відкрити відновлену публікацію. Поки тривають перевірки, вимірюйте MySQL-запити, сховище зображень, рендеринг тем, кількість учасників і ліміти провайдера bulk mail та зберігайте результат як очікуваний envelope для цієї версії.

Також перевірте заборонену або недійсну умову: тимчасово забороніть тестовій identity доступ до MySQL 8, SMTP і додаткового object storage для сайтів із великою кількістю медіа. Ghost має завершитися з помилкою, яку можна діагностувати, і не повинен перезаписати коректний стан. Відновіть дійсну умову, повторно запустіть тестовий сценарій і додайте відповідні redacted logs. Ці артефакти дають конкретні докази для майбутнього рішення про rollback.

Базова конфігурація Ghost у Docker

Початковий запуск Ghost має бути достатньо відтворюваним, щоб його можна було перевірити в pull request.

docker run -d \
  --name ghost \
  --restart unless-stopped \
  -p 127.0.0.1:2368:2368 \
  -v ghost-data:/var/lib/ghost/content \
  -e url=https://app.example.com \
  -e database__client=mysql \
  -e database__connection__host=mysql.internal \
  -e database__connection__user=ghost \
  -e database__connection__password=replace-with-a-strong-database-password \
  -e database__connection__database=ghost \
  ghost:latest

Не покладайтеся на latest, якщо вже з’явилися реальні дані. Зафіксуйте робочий digest, користувача контейнера та ownership mount-а. Перегляньте application log до завершення повного тесту — завершення налаштування власника, публікація допису із зображенням, підписка учасника та надсилання тестової розсилки через налаштовану email-систему — і зафіксуйте всі міграції перед тим, як спрямовувати маршрут на production-трафік.

TLS — це просто, а згенеровані URL — ні

Встановіть url як фінальний HTTPS-домен до публікації. Спрямовуйте вибране ім’я хоста на порт контейнера 2368, передавайте оригінальні host і HTTPS scheme та не публікуйте другий прямий origin.

Перевірте Ghost із чистого зовнішнього клієнта. Відокремте помилку ingress від відомої межі застосунку — значення url є HTTP або том із контентом було замінено. Помилка сертифіката, DNS або 502 належить до маршрутизації; запит, який доходить до Ghost і завершується помилкою пізніше, належить до стану застосунку, його ємності або супровідної вимоги. У посібнику з TLS для custom domain описано першу групу проблем.

Перевірки ємності та оновлення

Тести ємності мають навантажувати MySQL-запити, сховище зображень, рендеринг тем, кількість учасників і ліміти провайдера bulk mail, а не повторювати запит до /. Запустіть сценарій «завершити налаштування власника, опублікувати допис із зображенням, підписати учасника та надіслати тестову розсилку через налаштовану email-систему» за реалістичної конкурентності та зафіксуйте latency, error rate і зростання сховища.

Планування оновлення має враховувати такі ризики: міграції Ghost, вимоги до Node runtime та custom themes потрібно тестувати на клонованому сайті. Перевірте новий реліз на репрезентативних вхідних даних, потім повторіть acceptance transaction і порівняйте результат. Якщо значення url є HTTP або том із контентом було замінено, зафіксуйте транзакцію, що завершується помилкою, і перевірте першу залучену межу замість припущення, що відповідальність лежить на ingress.

Перенесіть повторювану інфраструктурну роботу до Dockup

Маршрутизація, сертифікати, заміна сервісів і підключене сховище — доречні цілі для автоматизації. Dockup виконує ці завдання для Ghost і може підготувати пов’язану managed database або підключитися до сервісів на власному сервері клієнта.

Водночас Dockup не має вигадувати policy довіри Ghost. Після розгортання встановіть url як фінальний HTTPS-домен до публікації, застосуйте цю межу — захистіть Ghost Admin, зберігайте облікові дані пошти й бази даних на сервері та встановіть фінальну HTTPS URL перед публікацією — і перевірте результат такого сценарію: завершити налаштування власника, опублікувати допис із зображенням, підписати учасника та надіслати тестову розсилку через налаштовану email-систему. Результат — інфраструктура в один клік із application-specific acceptance test.

Поширені запитання

Що потрібно Ghost для production-розгортання?

Пропустіть контейнер Ghost через порт 2368 до одного HTTPS origin. Мережева вимога для супровідних сервісів — MySQL 8, SMTP і додаткове object storage для сайтів із великою кількістю медіа. Не вважайте Ghost готовим, доки не зможете завершити налаштування власника, опублікувати допис із зображенням, підписати учасника та надіслати тестову розсилку через налаштовану email-систему.

Які дані Ghost потрібно включати до резервної копії?

Зберігайте /var/lib/ghost/content і включайте базу даних MySQL, теми, зображення та файли контенту до одного recovery manifest. Чисте відновлення Ghost вважається успішним лише тоді, коли дописи, учасники, розсилки, теми та зображення повернулися, а тестовий учасник може відкрити відновлену публікацію.

Чи потрібен Ghost HTTPS за reverse proxy?

Використовуйте HTTPS для публічного Ghost origin, а порт 2368 залишайте у внутрішньому маршруті. Правильно застосуйте налаштування Ghost: встановіть url як фінальний HTTPS-домен до публікації. Для Ghost HTTPS захищає облікові дані або користувацький контент під час передавання та забезпечує узгоджену поведінку клієнта, чутливу до origin.

Як тестувати оновлення Ghost?

Відновіть поточний стан Ghost в ізольованому розгортанні, застосуйте кандидатну версію та повторіть acceptance transaction. Будьте особливо уважні: міграції Ghost, вимоги до Node runtime та custom themes потрібно тестувати на клонованому сайті. Зберігайте попередній образ Ghost, доки не буде зрозумілою межа міграції даних і rollback.