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

Ghost — свободная, открытая и лёгкая платформа для блогов на Node.js. Она заточена под ведение блогов, проста в настройке и даёт быстрый результат. Ключевые возможности:
- Редактор на Markdown
- Планировщик публикаций
- Дистрибутивы/клиенты для Linux, macOS и Windows
- Сотни бесплатных и платных тем
- Встроенная аналитика
- Плагин миграции из WordPress
Ниже — подробное пошаговое руководство по установке Ghost с Nginx и Let’s Encrypt SSL на сервере с Ubuntu 20.04.
Что нужно перед началом
- Сервер с Ubuntu 20.04.
- Домен, указывающий на IP сервера (A-запись).
- Настроенный пароль root или доступ по sudo от пользователя с правами.
План установки (коротко)
- Обновить APT и установить зависимости.
- Установить Node.js (версия 12.x в примере).
- Установить Nginx и MariaDB, создать базу для Ghost.
- Установить ghost-cli и развернуть Ghost в /var/www/ghost.
- Настроить Certbot и получить сертификат Let’s Encrypt.
- Проверить работу и настроить автопродление сертификата.
Подготовка сервера и зависимости
Сначала обновите 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” позволит создать первую учётную запись администратора.

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

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

Рекомендации по безопасности и эксплуатации
- Используйте сильные пароли для базы данных и системных аккаунтов.
- Разместите логи и резервные копии в отдельном каталоге и на удалённом хранилище.
- Ограничьте доступ к серверу по 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.
- Проверка: Ghost процесс запущен? Проверить
Альтернативные варианты развертывания
- Docker: использовать официальный образ Ghost для контейнеризации и простого управления окружением.
- Managed Ghost (Ghost(Pro)): платный сервис, если не хотите управлять инфраструктурой.
- SQLite: для локальных тестов Ghost поддерживает SQLite, но для продакшна рекомендуется MariaDB/MySQL.
- Marketplace images (DigitalOcean, Hetzner): быстрый старт с готовыми образами Ghost.
Контрольный список по ролям
- DevOps/Инфраструктура:
- Настроить сервер, firewall, резервное копирование, мониторинг и логирование.
- Обеспечить безопасное хранение SSL-ключей и бэкапов.
- Разработчик/Администратор Ghost:
- Проверить тему, плагины, миграцию контента.
- Тестировать обновления на staging перед продом.
- Владелец/Редактор:
- Создать аккаунт администратора, настроить профиль и стартовые публикации.
План отката (простая инструкция)
- Остановите сервис Ghost:
sudo systemctl stop ghost_имя. - Восстановите файлы из бэкапа /var/www/ghost.
- Восстановите дамп базы:
mysql -u root -p ghostdb < backup.sql. - Перезапустите сервис и nginx:
sudo systemctl start ghost_имя && sudo nginx -s reload.
Короткое резюме
Вы развернули Ghost, настроили Nginx и обеспечили HTTPS с помощью Let’s Encrypt. Проверьте доступность Admin-панели и работу автопродления сертификатов. Поддерживайте регулярные резервные копии и мониторинг.
Важно: прежде чем менять версию Node.js или Ghost в продакшне, протестируйте обновления в отдельной среде.
Вспомогательные ссылки
- Официальная документация Ghost: https://ghost.org/docs/
- Certbot для Nginx: https://certbot.eff.org/
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента