Гид по технологиям

Установка Ghost с Nginx и Let's Encrypt на Ubuntu 20.04

• 5 min read • Руководство • Обновлено 23 Nov 2025
Установка Ghost на Ubuntu 20.04 с Nginx и SSL
Установка Ghost на Ubuntu 20.04 с Nginx и SSL

Скриншот панели Ghost или иллюстрация развертывания

Ghost — свободная, открытая и лёгкая платформа для блогов на Node.js. Она заточена под ведение блогов, проста в настройке и даёт быстрый результат. Ключевые возможности:

  • Редактор на Markdown
  • Планировщик публикаций
  • Дистрибутивы/клиенты для Linux, macOS и Windows
  • Сотни бесплатных и платных тем
  • Встроенная аналитика
  • Плагин миграции из WordPress

Ниже — подробное пошаговое руководство по установке Ghost с Nginx и Let’s Encrypt SSL на сервере с Ubuntu 20.04.

Что нужно перед началом

  • Сервер с Ubuntu 20.04.
  • Домен, указывающий на IP сервера (A-запись).
  • Настроенный пароль root или доступ по sudo от пользователя с правами.

План установки (коротко)

  1. Обновить APT и установить зависимости.
  2. Установить Node.js (версия 12.x в примере).
  3. Установить Nginx и MariaDB, создать базу для Ghost.
  4. Установить ghost-cli и развернуть Ghost в /var/www/ghost.
  5. Настроить Certbot и получить сертификат Let’s Encrypt.
  6. Проверить работу и настроить автопродление сертификата.

Подготовка сервера и зависимости

Сначала обновите APT-кеш:

apt-get update -y

Установите базовые зависимости:

apt-get install gnupg2 curl unzip git acl -y

Установка Node.js

Добавьте репозиторий NodeSource (в примере 12.x):

curl -sL https://deb.nodesource.com/setup_12.x | bash -

Установите nodejs:

apt-get install nodejs -y

Проверьте версию Node.js:

node -v

Ожидаемый пример вывода:

v12.22.1

Проверьте npm:

npm -v

Ожидаемый пример вывода:

6.14.12

Примечание: Node 12 поддерживался на момент примера. Для новых установок рекомендуется проверить требования текущей версии Ghost в документации перед выбором версии Node.

Установка Nginx и MariaDB

Установите Nginx и MariaDB:

apt-get install mariadb-server nginx -y

Затем выполните базовую безопасную настройку MariaDB:

mysql_secure_installation

Ответьте на вопросы, чтобы задать пароль root и убрать тестовые учётные записи.

Войдите в MariaDB и создайте базу и пользователя для Ghost:

mysql -u root -p

Внутри MariaDB выполните:

MariaDB [(none)]> CREATE DATABASE ghostdb;  
MariaDB [(none)]> CREATE USER 'ghostuser'@'localhost' IDENTIFIED BY 'password';
MariaDB [(none)]> GRANT ALL ON ghostdb.* TO 'ghostuser'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;  
MariaDB [(none)]> EXIT;

Важно: замените ‘password’ на надёжный пароль и при необходимости используйте отдельный хост, если база на другом сервере.

Установка Ghost CLI

Ghost CLI упрощает установку и обновление Ghost:

npm install -g ghost-cli@latest

Проверьте версию:

ghost version

Ожидаемый пример вывода:

Ghost-CLI version: 1.16.3

Установка и запуск Ghost

Рекомендуется запускать Ghost под отдельным системным пользователем и хранить файлы в /var/www/ghost.

Создайте пользователя и добавьте его в нужные группы:

adduser user1
adduser user1 sudo  
adduser user1 www-data

Переключитесь на нового пользователя и создайте папку:

su - user1  
sudo mkdir /var/www/ghost

Назначьте права и ACL, чтобы ghost-cli имел доступ:

sudo chown -R www-data:www-data /var/www/ghost  
sudo chown -R www-data:www-data /var/www/  
sudo chmod 775 /var/www/ghost  
sudo setfacl -R -m u:user1:rwx /var/www/ghost/

Перейдите в каталог и запустите установку:

cd /var/www/ghost  
ghost install

Во время установки вас попросят ввести URL блога, данные базы и другие параметры. Пример диалога установки (фрагмент вывода):

? Enter your blog URL: https://ghost.linuxbuz.com
? Enter your MySQL hostname: localhost
? Enter your MySQL username: ghostuser
? Enter your MySQL password: [hidden]
? Enter your Ghost database name: ghostdb
? Configuring Ghost
? Setting up instance
+ sudo useradd --system --user-group ghost
+ sudo chown -R ghost:ghost /var/www/ghost/content
? Setting up "ghost" system user
? Setting up "ghost" mysql user [skipped]
? Do you wish to set up Nginx? Yes
+ sudo mv /tmp/ghost-linuxbuz-com/ghost.linuxbuz.com.conf /etc/nginx/sites-available/ghost.linuxbuz.com.conf
+ sudo ln -sf /etc/nginx/sites-available/ghost.linuxbuz.com.conf /etc/nginx/sites-enabled/ghost.linuxbuz.com.conf
+ sudo nginx -s reload
? Setting up SSL [skipped]
? Do you wish to set up Systemd? Yes
+ sudo mv /tmp/ghost-linuxbuz-com/ghost_ghost-linuxbuz-com.service /lib/systemd/system/ghost_ghost-linuxbuz-com.service
+ sudo systemctl daemon-reload
? Setting up Systemd
+ sudo systemctl is-active ghost_ghost-linuxbuz-com
? Do you want to start Ghost? (Y/n) 

После этого Ghost будет установлен и запущен.

Настройка SSL с Let’s Encrypt (Certbot)

Установите Certbot и плагин для Nginx:

sudo apt-get install certbot python3-certbot-nginx -y

Запустите Certbot для получения сертификата и автоматической настройки Nginx:

sudo certbot --nginx -d ghost.linuxbuz.com

В процессе вам предложат ввести email и согласиться с условиями. Затем Certbot предложит перенаправить HTTP на HTTPS — выбирайте перенаправление (опция 2) для новых сайтов.

Пример вывода Certbot (сокращённо):

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]
...
(A)gree/(C)ancel: A
...
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for ghost.linuxbuz.com
Waiting for verification...
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/ghost.linuxbuz.com.conf

После выбора перенаправления вы увидите подтверждение и информацию о местоположении сертификатов:

 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ghost.linuxbuz.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ghost.linuxbuz.com/privkey.pem
 - Your cert will expire on 2021-07-13. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"

Важно: Certbot автоматически добавляет задачу cron/systemd для автопродления, но рекомендуется проверить её работу:

sudo systemctl list-timers | grep certbot
sudo certbot renew --dry-run

Проверка статуса Ghost

Просмотрите список экземпляров Ghost:

ghost ls

Пример вывода:

+ sudo systemctl is-active ghost_ghost-linuxbuz-com
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? Name               ? Location       ? Version ? Status               ? URL                        ? Port ? Process Manager ?
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? ghost-linuxbuz-com ? /var/www/ghost ? 4.2.1   ? running (production) ? https://ghost.linuxbuz.com ? 2368 ? systemd         ?
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

Проверить unit systemd:

sudo systemctl status ghost_ghost-linuxbuz-com

Пример вывода (фрагмент):

? ghost_ghost-linuxbuz-com.service - Ghost systemd service for blog: ghost-linuxbuz-com
     Loaded: loaded (/lib/systemd/system/ghost_ghost-linuxbuz-com.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2021-04-14 07:05:33 UTC; 9min ago
       Docs: https://ghost.org/docs/
   Main PID: 7546 (node)
      Tasks: 22 (limit: 2353)
     Memory: 134.3M
     CGroup: /system.slice/ghost_ghost-linuxbuz-com.service
             ??7546 ghost run
             ??7590 /usr/bin/node current/index.js

Apr 14 07:14:11 ubuntu node[7590]: [2021-04-14 07:14:11] INFO "GET /" 200 475ms
Apr 14 07:14:11 ubuntu node[7590]: [2021-04-14 07:14:11] INFO "GET /" 200 480ms
Apr 14 07:14:15 ubuntu node[7590]: [2021-04-14 07:14:15] INFO "GET /members/api/site/" 200 12ms

Доступ к административной панели

Откройте в браузере https://ghost.linuxbuz.com/ghost/ — кнопка “Create your account” позволит создать первую учётную запись администратора.

Установка Ghost — создание учётной записи администратора

Заполните данные аккаунта и при желании пропустите некоторые шаги кнопкой “I’ll do this later”; затем попадёте в панель управления.

Панель управления Ghost

Фронтенд сайта доступен по https://ghost.linuxbuz.com/

Внешний вид сайта на Ghost

Рекомендации по безопасности и эксплуатации

  • Используйте сильные пароли для базы данных и системных аккаунтов.
  • Разместите логи и резервные копии в отдельном каталоге и на удалённом хранилище.
  • Ограничьте доступ к серверу по SSH (ключи, отключить root-логин по паролю).
  • Настройте firewall (ufw): разрешите 22, 80, 443, и при необходимости порт Ghost (2368) только локально.

Пример базовой настройки ufw:

ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable

Продление сертификатов

Certbot добавляет автоматическое продление, но проверьте вручную:

sudo certbot renew --dry-run

Если продление не проходит, проверьте логи /var/log/letsencrypt и конфигурацию Nginx на предмет конфликтов.

Критерии приёмки

  • Сайт загружается по HTTPS без ошибок в браузере.
  • Приложение Ghost запущено и отвечает: ghost ls показывает status running.
  • Admin-панель доступна по /ghost и можно создать администратора.
  • Автоматическое продление сертификата проходит успешно в dry-run.

Частые ошибки и способы их устранения

  • Проблема: Certbot не может верифицировать домен.

    • Проверка: A-запись домена указывает на IP сервера? Порт 80 открыт и Nginx слушает?
    • Решение: временно включите HTTP на 80 и проверьте, что по http://ваш-домен/ возвращает нужный сайт.
  • Проблема: Ghost не стартует (systemd показывает failed).

    • Проверка: смотрите journalctl -u ghost_имя.service и логи в /var/www/ghost/content/logs.
    • Решение: убедитесь, что права на /var/www/ghost корректны и что конфигурация config.production.json содержит правильные параметры БД и URL.
  • Проблема: 502 Bad Gateway от Nginx.

    • Проверка: Ghost процесс запущен? Проверить sudo systemctl status ghost_имя и порт, на котором запущен Node.
    • Решение: перезапустите сервис и nginx: sudo systemctl restart ghost_имя && sudo nginx -s reload.

Альтернативные варианты развертывания

  • Docker: использовать официальный образ Ghost для контейнеризации и простого управления окружением.
  • Managed Ghost (Ghost(Pro)): платный сервис, если не хотите управлять инфраструктурой.
  • SQLite: для локальных тестов Ghost поддерживает SQLite, но для продакшна рекомендуется MariaDB/MySQL.
  • Marketplace images (DigitalOcean, Hetzner): быстрый старт с готовыми образами Ghost.

Контрольный список по ролям

  • DevOps/Инфраструктура:
    • Настроить сервер, firewall, резервное копирование, мониторинг и логирование.
    • Обеспечить безопасное хранение SSL-ключей и бэкапов.
  • Разработчик/Администратор Ghost:
    • Проверить тему, плагины, миграцию контента.
    • Тестировать обновления на staging перед продом.
  • Владелец/Редактор:
    • Создать аккаунт администратора, настроить профиль и стартовые публикации.

План отката (простая инструкция)

  1. Остановите сервис Ghost: sudo systemctl stop ghost_имя.
  2. Восстановите файлы из бэкапа /var/www/ghost.
  3. Восстановите дамп базы: mysql -u root -p ghostdb < backup.sql.
  4. Перезапустите сервис и nginx: sudo systemctl start ghost_имя && sudo nginx -s reload.

Короткое резюме

Вы развернули Ghost, настроили Nginx и обеспечили HTTPS с помощью Let’s Encrypt. Проверьте доступность Admin-панели и работу автопродления сертификатов. Поддерживайте регулярные резервные копии и мониторинг.

Важно: прежде чем менять версию Node.js или Ghost в продакшне, протестируйте обновления в отдельной среде.

Вспомогательные ссылки

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро