Ghost CMS · 13 min read · Oct 14, 2025
Как развернуть Ghost CMS на Rocky Linux 9

Ghost — это платформа для ведения блогов с открытым исходным кодом, которая поможет вам создать профессионально выглядящий блог. Она была запущена в 2013 году как альтернатива WordPress, так как последний становился слишком сложным. Ghost написан на JavaScript и работает на библиотеке Node.js.
В этом руководстве мы рассмотрим, как установить Ghost CMS с использованием Nginx и MySQL на сервере с Rocky Linux 9. Мы будем использовать сервер Nginx для хостинга блога и SSL-сертификат Let’s Encrypt для защиты нашей установки.
Предварительные требования
- Сервер с установленным Rocky Linux 9.
- Непривилегированный пользователь с правами sudo.
- Полностью квалифицированное доменное имя (FQDN), указывающее на ваш сервер. Для наших целей мы будем использовать
ghost.example.comв качестве доменного имени. - Убедитесь, что все обновлено.
$ sudo dnf update - Установите основные утилиты. Некоторые из них могут быть уже установлены.
$ sudo dnf install wget curl nano unzip yum-utils -y
Шаг 1 - Настройка брандмауэра
Первый шаг — настроить брандмауэр. Rocky Linux использует брандмауэр Firewalld. Проверьте статус брандмауэра.
$ sudo firewall-cmd --state
running
Брандмауэр работает с различными зонами, и публичная зона является той, которую мы будем использовать по умолчанию. Перечислите все службы и порты, активные на брандмауэре.
$ sudo firewall-cmd --permanent --list-services
Он должен показать следующий вывод.
cockpit dhcpv6-client ssh
Wiki.js нуждается в HTTP и HTTPS портах для работы. Откройте их.
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent
Перезагрузите брандмауэр, чтобы применить изменения.
$ sudo firewall-cmd --reload
Шаг 2 - Установка Nginx
Rocky Linux 9 поставляется со старой версией Nginx. Вам нужно загрузить официальный репозиторий Nginx, чтобы установить последнюю версию.
Создайте и откройте файл /etc/yum.repos.d/nginx.repo для создания официального репозитория Nginx.
$ sudo nano /etc/yum.repos.d/nginx.repo
Вставьте следующий код в него.
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Установите сервер Nginx.
$ sudo dnf install nginx -y
Проверьте установку.
$ nginx -v
nginx version: nginx/1.22.1
Включите и запустите сервер Nginx.
$ sudo systemctl enable nginx --now
Проверьте статус сервера.
$ sudo systemctl status nginx
? nginx.service - nginx - высокопроизводительный веб-сервер
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-10-25 08:27:47 UTC; 2s ago
Docs: http://nginx.org/en/docs/
Process: 1650 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 1651 (nginx)
Tasks: 2 (limit: 5912)
Memory: 1.9M
CPU: 7ms
CGroup: /system.slice/nginx.service
??1651 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??1652 "nginx: worker process"
Oct 25 08:27:47 ghost.example.com systemd[1]: Starting nginx - высокопроизводительный веб-сервер...
Шаг 3 - Установка Node.js
Ghost Installer нуждается в Node.js для работы. Выполните следующие команды для установки Node 16.
$ curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
Установите Node.
$ sudo dnf install -y nodejs
Проверьте установку Node.
$ node --version
v16.18.0
На момент написания этого руководства, Node 18 уже вышел и является LTS версией. Ghost еще не добавил поддержку для него. Следите за документами Ghost о версиях Node для последней поддерживаемой версии Node. Когда Ghost добавит поддержку для Node 18, установите Node 18, используя следующие команды вместо этого.
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install -y nodejs
Шаг 4 - Установка MySQL
Rocky Linux 9 поставляется с последней версией MySQL. Вы можете установить его одной командой.
$ sudo dnf install mysql-server
Проверьте версию MySQL.
$ mysql --version
mysql Ver 8.0.30 for Linux on x86_64 (Source distribution)
Включите и запустите службу MySQL.
$ sudo systemctl enable mysqld --now
Проверьте статус службы.
$ sudo systemctl status mysqld
? mysqld.service - MySQL 8.0 сервер базы данных
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-10-25 09:00:26 UTC; 3s ago
Process: 2920 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
Process: 2942 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
Main PID: 3021 (mysqld)
Status: "Сервер работает"
Tasks: 39 (limit: 5912)
Memory: 404.4M
CPU: 4.686s
CGroup: /system.slice/mysqld.service
??3021 /usr/libexec/mysqld --basedir=/usr
Oct 25 09:00:18 ghost.example.com systemd[1]: Starting MySQL 8.0 сервер базы данных...
Oct 25 09:00:18 ghost.example.com mysql-prepare-db-dir[2942]: Инициализация базы данных MySQL
Oct 25 09:00:26 ghost.example.com systemd[1]: Started MySQL 8.0 сервер базы данных.
Вы можете войти в оболочку MySQL, используя аутентификацию Unix по умолчанию. Но вы не можете запустить мастер настройки безопасности. Поэтому следующий шаг необходим для версий MySQL 8.0.28 и выше. Войдите в оболочку MySQL.
$ sudo mysql
Выполните следующую команду, чтобы установить пароль для вашего пользователя root. Убедитесь, что он содержит смесь цифр, заглавных и строчных букв, а также специальных символов.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword12!';
Выйдите из оболочки. Замечание к этому шагу заключается в том, что вы больше не сможете войти в оболочку MySQL, используя аутентификацию Unix.
mysql> exit
Запустите скрипт безопасной установки MySQL.
$ sudo mysql_secure_installation
Вам будет предложено установить компонент Validate Password. Он проверяет надежность паролей, используемых в MySQL. Нажмите Y, чтобы установить его.
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Y
Далее вам будет предложено установить уровень политики проверки пароля. Выберите 2, так как это самый строгий уровень. Затем вам будет предложено создать пароль для root. Введите пароль с заданными требованиями. И когда вас спросят, хотите ли вы продолжить с паролем, нажмите Y, чтобы продолжить.
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Please set the password for root here.
New password:
Re-enter new password:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
Наконец, нажмите Y, чтобы удалить анонимных пользователей, запретить удаленный вход для root, удалить тестовую базу данных и перезагрузить таблицы привилегий.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.
All done!
Это завершает процесс установки и защиты MySQL.
Шаг 5 - Установка Ghost
Установка Ghost будет состоять из трех компонентов — инструмента командной строки Ghost-CLI, который устанавливает и управляет обновлениями блога Ghost, и самого пакета блога.
Установка Ghost-CLI
Выполните следующую команду для установки инструмента Ghost-CLI. Игнорируйте любые предупреждения, которые вы получите в процессе.
$ sudo npm install ghost-cli@latest -g
Подготовка директории Ghost
Создайте корневую директорию Ghost.
$ sudo mkdir -p /var/www/html/ghost
Установите владельца директории на текущего пользователя.
$ sudo chown $USER:$USER /var/www/html/ghost
Установите правильные разрешения для директории.
$ sudo chmod 755 /var/www/html/ghost
Перейдите в директорию Ghost.
$ cd /var/www/html/ghost
Установка Ghost
Установка Ghost — это процесс, состоящий из одной команды.
$ ghost install
Во время установки инструмент CLI задаст ряд вопросов для настройки блога.
- На момент написания этого руководства Ghost-CLI не поддерживает никакую другую ОС, кроме Ubuntu. Он спросит, хотите ли вы продолжить установку. Нажмите Y, чтобы продолжить.
- URL блога: Введите полный URL вашего блога с протоколом https. (
https://ghost.example.com) - Имя хоста MySQL: Нажмите Enter, чтобы использовать значение по умолчанию
localhost, так как наша установка Ghost и MySQL находятся на одном сервере. - Имя пользователя MySQL: Введите
rootв качестве имени пользователя MySQL. - Пароль MySQL: Введите ваш ранее созданный пароль root.
- Имя базы данных Ghost: Дайте имя вашей базе данных Ghost. (
ghostdb) - Пароль sudo: Введите пароль sudo вашей системы для выполнения привилегированных команд.
- Настроить пользователя MySQL для Ghost?: Установщик спросит, хотите ли вы создать отдельного пользователя MySQL для Ghost. Нажмите Y, чтобы продолжить.
- Настроить Nginx?: Обычно Ghost-CLI обнаруживает вашу установку Nginx и автоматически настраивает его для вашего блога. Но на данный момент он не может обнаружить нашу установку Nginx. Поэтому установщик автоматически пропустит этот шаг. Мы настроим Nginx вручную.
- Настроить SSL?: Поскольку он пропустил конфигурацию Nginx, инструмент CLI также пропустит настройку SSL.
- Настроить systemd?: Ghost спросит, хотите ли вы настроить системную службу для Ghost. Нажмите Y, чтобы продолжить.
- Запустить Ghost?: Нажмите Y, чтобы запустить вашу установку Ghost. Служба запустится, но нам нужно будет настроить Nginx и SSL, чтобы она работала.
Шаг 6 - Установка SSL
Перед тем как продолжить, нам нужно установить инструмент Certbot и SSL-сертификат для нашего домена.
Для установки Certbot мы будем использовать установщик пакетов Snapd. Snapd всегда содержит последнюю стабильную версию Certbot, которую вы должны использовать.
Инструмент Snapd требует репозиторий Epel для работы.
$ sudo dnf install epel-release -y
Мы будем использовать Snapd для установки Certbot. Установите Snapd.
$ sudo dnf install snapd -y
Включите и запустите службу Snap.
$ sudo systemctl enable snapd.socket --now
Создайте необходимые ссылки для работы Snapd.
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
Убедитесь, что ваша версия snapd обновлена.
$ sudo snap install core
$ sudo snap refresh core
Установите Certbot.
$ sudo snap install --classic certbot
Используйте следующую команду, чтобы убедиться, что команда Certbot может быть выполнена, создав символическую ссылку в директории /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Сгенерируйте SSL-сертификат.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d ghost.example.com
Вышеуказанная команда загрузит сертификат в директорию /etc/letsencrypt/live/ghost.example.com на вашем сервере.
Сгенерируйте сертификат Diffie-Hellman group.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Проведите пробный запуск процесса, чтобы проверить, работает ли автоматическое обновление SSL.
$ sudo certbot renew --dry-run
Если вы не видите ошибок, значит, все готово. Ваш сертификат будет автоматически обновляться.
Шаг 7 - Настройка Nginx
Создайте и откройте файл /etc/nginx/conf.d/ghost.conf для редактирования.
$ sudo nano /etc/nginx/conf.d/ghost.conf
Вставьте следующий код в файл ghost.conf. Замените все вхождения ghost.example.com на ваше доменное имя.
## enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name ghost.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ghost.example.com;
access_log /var/log/nginx/ghost.access.log;
error_log /var/log/nginx/ghost.error.log;
client_max_body_size 20m;
http2_push_preload on; # Enable HTTP/2 Server Push
ssl_certificate /etc/letsencrypt/live/ghost.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ghost.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/ghost.example.com/chain.pem;
ssl_session_timeout 1d;
# Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
ssl_protocols TLSv1.2 TLSv1.3;
# Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
# prevent replay attacks.
#
# @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
ssl_early_data on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header X-Early-Data $tls1_3_early_data;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:2368;
}
}
# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
"~." $ssl_early_data;
default "";
}
Вышеуказанная конфигурация перенаправит все HTTP-запросы на HTTPS и будет служить прокси для службы Ghost, чтобы обслуживать ее через ваш домен.
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Откройте файл /etc/nginx/nginx.conf для редактирования.
$ sudo nano /etc/nginx/nginx.conf
Добавьте следующую строку перед строкой include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Проверьте вашу конфигурацию Nginx.
$ sudo nginx -t
Если вы не видите ошибок, значит, вы готовы к работе. Перезагрузите сервер Nginx.
$ sudo systemctl reload nginx
Шаг 8 - Настройка SELinux
Разрешите Nginx подключаться к сети.
$ sudo setsebool -P httpd_can_network_connect 1
Шаг 9 - Запустите сайт
Теперь вы можете проверить вашу установку, открыв https://ghost.example.com в вашем веб-браузере. Вы получите следующую страницу, указывающую на успешную установку.

Шаг 10 - Завершите настройку
Чтобы завершить настройку вашего блога Ghost, посетите https://ghost.example.com/ghost в вашем браузере. Дополнительный /ghost в конце домена вашего блога перенаправляет вас в панель администратора Ghost или, в данном случае, на страницу настройки, так как вы обращаетесь к ней в первый раз.
Вам будет предложено создать вашу учетную запись администратора и выбрать заголовок блога.

Введите ваши данные и нажмите кнопку Создать учетную запись и начать публикацию, чтобы продолжить.
Затем вы перейдете на следующий экран, где вам будут предложены такие варианты, как написание вашего первого поста, настройка вашего сайта и импорт участников.

Мы выберем Изучить админку Ghost, чтобы исследовать и перейти непосредственно к панели управления. В конце настройки вас встретит панель администратора Ghost.

Если вы хотите переключиться на темный режим, вы можете сделать это, нажав на переключатель рядом с кнопкой шестеренки настроек внизу страницы настроек.
Перейдите на страницу Посты, и вы увидите стандартный пост. Вы можете отменить публикацию или удалить его и начать публиковать.
)
Шаг 11 - Настройка почтового сервиса
Ghost не только является платформой для ведения блогов, но и менеджером новостных рассылок. Для повседневной работы вы можете использовать любую транзакционную почтовую службу для работы с Ghost для отправки почты. Но если вы хотите отправлять новостные рассылки через Ghost, единственным официальным массовым почтовым сервисом, который поддерживается, является Mailgun. Вы также можете использовать другую службу новостных рассылок, но для этого вам нужно будет использовать функцию интеграции Zapier в Ghost.
Сначала давайте настроим SMTP-сервис для транзакционных писем. Для этого откройте файл /var/www/html/ghost/config.production.json для редактирования.
$ nano /var/www/html/ghost/config.production.json
Найдите следующие строки.
"mail": {
"transport": "Direct"
},
Замените их следующим кодом.
"mail": {
"from": "'Acme Support' [email protected]",
"transport": "SMTP",
"options": {
"host": "YOUR-SES-SERVER-NAME",
"port": 465,
"service": "SES",
"auth": {
"user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
"pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
}
}
},
Здесь мы используем почтовую службу Amazon SES, так как она очень дешева и бесплатна на весь срок службы, если вы используете их службу EC2.
Если вы хотите использовать их службу новостных рассылок с помощью Mailgun, введите следующий код вместо этого.
"mail": {
"from": "'Acme Support' [email protected]",
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.mailgun.org",
"port": 587,
"secure": true,
"auth": {
"user": "[email protected]",
"pass": "1234567890"
}
}
},
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
После завершения перезапустите приложение Ghost, чтобы изменения вступили в силу.
$ ghost restart
Чтобы настроить параметры новостной рассылки, перейдите в раздел Настройки >> Email newsletter.

Нажмите на ссылку Настройка Mailgun, чтобы развернуть.
Заполните ваш регион Mailgun, домен и API-ключ.

Нажмите кнопку Сохранить в правом верхнем углу, чтобы сохранить настройки.
Чтобы протестировать доставку новостной рассылки, откройте любой пост, откройте его настройки и нажмите опцию Email newsletter. Затем отправьте тестовое письмо, чтобы проверить, работает ли оно. Если вы не получите никаких ошибок, это означает, что доставка вашей новостной рассылки работает.
Шаг 12 - Обновление Ghost
Существуют два типа обновлений Ghost - незначительные обновления и значительные обновления.
Сначала сделайте полный резервный копию, если вы хотите выполнить незначительное обновление.
$ cd /var/www/html/ghost
$ ghost backup
Запустите команду обновления, чтобы выполнить незначительное обновление.
$ ghost update
Чтобы выполнить значительное обновление, вам следует следовать официальному подробному руководству по обновлению на сайте Ghost. В зависимости от того, на какой версии вы находитесь в данный момент и на какую основную версию вы хотите обновиться, шаги будут различаться.
Заключение
Это завершает наше руководство о том, как настроить Ghost CMS на вашем сервере Rocky Linux 9 с использованием Nginx. Если у вас есть какие-либо вопросы или отзывы, оставьте их в комментариях ниже.
Get new posts in your inbox
No spam. Unsubscribe anytime.