Ghost Blog · 11 min read · Oct 23, 2025

Как развернуть Ghost Blog с Nginx на Debian 12

Ghost — это платформа для ведения блогов с открытым исходным кодом, которая помогает вам создать профессионально выглядящий блог. Она была запущена в 2013 году как альтернатива WordPress. Она написана на JavaScript и работает на библиотеке Node.js.

В этом руководстве мы рассмотрим, как установить Ghost CMS с использованием Nginx и MySQL на сервере с Debian 12. Мы будем использовать SSL-сертификат Let’s Encrypt для защиты нашей установки.

Предварительные требования

  • Сервер с установленным Debian 12 и минимум 2 ГБ ОЗУ.
  • Пользователь, не являющийся root, с правами sudo.
  • Полное доменное имя (FQDN), например example.com, указывающее на ваш сервер.
  • Убедитесь, что все обновлено. $ sudo apt update $ sudo apt upgrade
  • Несколько пакетов, необходимых вашей системе. $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y Некоторые из этих пакетов могут уже быть установлены на вашей системе.

Шаг 1 - Настройка брандмауэра UFW

Первый шаг — настроить брандмауэр. Debian по умолчанию поставляется с ufw (Uncomplicated Firewall).

Проверьте, работает ли брандмауэр.

$ sudo ufw status

Вы должны получить следующий вывод.

Status: inactive

Разрешите SSH-порт, чтобы брандмауэр не разорвал текущее соединение при его включении.

$ sudo ufw allow OpenSSH

Также разрешите порты HTTP и HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Включите брандмауэр

$ sudo ufw enable
Команда может нарушить существующие ssh-соединения. Продолжить операцию (y|n)? y
Брандмауэр активен и включен при запуске системы

Проверьте статус брандмауэра снова.

$ sudo ufw status

Вы должны увидеть аналогичный вывод.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Шаг 2 - Установка Nginx

Debian 12 поставляется со старой версией Nginx. Чтобы установить последнюю версию, вам нужно загрузить официальный репозиторий Nginx.

Импортируйте ключ подписи Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Добавьте репозиторий для стабильной версии Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Обновите системные репозитории.

$ sudo apt update

Установите Nginx.

$ sudo apt install nginx

Проверьте установку. sudo требуется для выполнения команды на Debian.

$ sudo nginx -v
nginx version: nginx/1.24.0

Запустите сервер Nginx.

$ sudo systemctl start nginx

Шаг 3 - Установка Node.js

Ghost Installer нуждается в Nodejs для работы. Первый шаг — импортировать ключ GPG Nodesource.

$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg

Далее создайте файл репозитория Nodesource. Мы установим Node 18x, который является текущей LTS (долгосрочной поддержкой) версией, которую рекомендует Ghost.

$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

Обновите список системных репозиториев.

$ sudo apt update

Установите Node.

$ sudo apt install nodejs -y

Подтвердите установку Node.

$ node --version
v18.18.2

Шаг 4 - Установка MySQL с использованием Docker

Debian больше не поставляется с MySQL. Вместо этого он поставляется с MariaDB. Ghost поддерживает только MySQL. Вы можете настроить Ghost для работы с MariaDB, но это не рекомендуется. Поскольку официальные репозитории MySQL не были обновлены для Debian 12 на момент написания этого руководства, мы установим его с помощью Docker.

Импортируйте ключ GPG Docker.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Создайте файл репозитория Docker.

$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновите список системных репозиториев.

$ sudo apt update

Установите Docker и Docker Compose.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

По умолчанию Docker требует прав root. Если вы хотите избежать использования sudo каждый раз, когда вы выполняете команду docker, добавьте свое имя пользователя в группу docker.

$ sudo usermod -aG docker $(whoami)

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

$ su - ${USER}

Подтвердите, что ваш пользователь добавлен в группу Docker.

$ groups
navjot wheel docker

Теперь, когда Docker установлен, нам нужно создать файл Docker compose для MySQL. Создайте каталог для Docker MySQL.

$ mkdir ~/mysql

Создайте и откройте файл docker-compose.yml для редактирования.

$ nano docker-compose.yml

Вставьте следующий код в него.

services:
  database:
    image: container-registry.oracle.com/mysql/community-server:latest
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghostpassword
      MYSQL_DATABASE: ghostdb
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Здесь мы установили корневой пароль и учетные данные MySQL для базы данных Ghost. Они будут созданы при запуске контейнера.

Запустите контейнер MySQL.

$ docker compose up -d

Проверьте статус контейнера Docker.

$ docker ps
CONTAINER ID   IMAGE                                                         COMMAND                  CREATED         STATUS         PORTS                                                        NAMES
ec42fb205f1e   container-registry.oracle.com/mysql/community-server:latest   "/entrypoint.sh mysq…"   4 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp   mysql

Ghost может подключаться к контейнеру MySQL, используя порт 3306, и выполнять операции с ним.

Шаг 5 - Установка Ghost

Мы также можем установить Ghost с помощью Docker, что может упростить задачу, но мы не будем делать этого здесь.

Установка 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 задаст несколько вопросов для настройки блога.

  • URL блога: Введите полный URL вашего блога вместе с протоколом https. ( https://example.com)
  • Имя хоста MySQL: Нажмите Enter, чтобы использовать значение по умолчанию localhost, так как наша установка Ghost и MySQL находятся на одном сервере.
  • Имя пользователя MySQL: Введите ghost в качестве имени пользователя MySQL.
  • Пароль MySQL: Введите ваш корневой пароль, созданный ранее в файле docker.
  • Имя базы данных Ghost: Введите имя базы данных ( ghostdb), настроенное в файле docker.
  • Пароль sudo: Он запросит ваш пароль sudo для выполнения административных задач.
  • Настроить Nginx? Обычно Ghost-CLI обнаруживает вашу установку Nginx и автоматически настраивает ее для вашего блога. Но это работает только для Nginx, установленного с помощью пакета ОС. Поскольку мы установили его с помощью репозитория Nginx, Ghost не может его обнаружить и пропустит его автоматически.
  • Настроить SSL?: Поскольку он пропустил конфигурацию Nginx, инструмент CLI также пропустит настройку SSL.
  • Настроить systemd?: Ghost спросит, хотите ли вы настроить системную службу для Ghost. Нажмите Y, чтобы продолжить.
  • Запустить Ghost?: Нажмите Y, чтобы запустить вашу установку Ghost. Однако это не сработает, потому что Nginx и SSL еще не настроены.

Шаг 6 - Установка SSL

Прежде чем продолжить, нам нужно установить инструмент Certbot и установить SSL-сертификат для нашего домена.

Чтобы установить Certbot, мы будем использовать установщик пакетов Snapd. Snapd всегда содержит последнюю стабильную версию Certbot. Однако Debian не поставляется с установленным Snapd. Установите его сначала.

$ sudo apt install snapd

Убедитесь, что ваша версия 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

Проверьте установку.

$ certbot --version
certbot 2.7.1

Сгенерируйте SSL-сертификат.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com

Вышеуказанная команда загрузит сертификат в каталог /etc/letsencrypt/live/example.com на вашем сервере.

Сгенерируйте сертификат группы Диффи-Хеллмана.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Проверьте службу планировщика обновления Certbot.

$ sudo systemctl list-timers

Вы найдете snap.certbot.renew.service как одну из служб, запланированных для выполнения.

NEXT                        LEFT          LAST                        PASSED       UNIT                       ACTIVATES
Tue 2023-10-17 00:00:00 UTC 14h left    Mon 2023-10-16 00:00:18 UTC 9h ago       dpkg-db-backup.timer         dpkg-db-backup.service
Mon 2023-10-16 19:12:00 UTC 9h left     Mon 2023-10-16 07:27:11 UTC 2h 17min ago snap.certbot.renew.timer     snap.certbot.renew.service
Mon 2023-10-16 20:49:14 UTC 11h left    Mon 2023-10-16 07:48:12 UTC 1h 56min ago apt-daily.timer              apt-daily.service

Сделайте пробный запуск процесса, чтобы проверить, работает ли обновление SSL.

$ sudo certbot renew --dry-run

Если вы не видите ошибок, значит, все готово. Ваш сертификат будет автоматически обновляться.

Шаг 7 - Настройка Nginx

Создайте и откройте файл /etc/nginx/conf.d/ghost.conf для редактирования.

$ sudo nano /etc/nginx/conf.d/ghost.conf

Вставьте следующий код в файл ghost.conf. Замените все вхождения example.com на ваш домен.

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  location / { 
   return 301 https://$server_name$request_uri; 
  }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;
    
  access_log /var/log/nginx/ghost.access.log;
  error_log /var/log/nginx/ghost.error.log;
  client_max_body_size 20m;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
  ssl_prefer_server_ciphers off;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:10m;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
  resolver_timeout 2s;

  ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  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;
  }
}

Вышеуказанная конфигурация перенаправит все 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 restart nginx

Шаг 9 - Запустите сайт

Теперь вы можете проверить вашу установку, открыв https://example.com в вашем веб-браузере. Вы получите следующую страницу, указывающую на успешную установку.

Главная страница Ghost

Шаг 10 - Завершение настройки

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

Здесь вам будет предложено создать свою учетную запись администратора и выбрать заголовок блога.

Детали настройки Ghost

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

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

Предложения установщика 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": "'Поддержка HowtoForge' [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, так как она доступна и не требует ежемесячных платежей.

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено. После завершения перезапустите приложение Ghost, чтобы изменения вступили в силу.

$ ghost restart

Чтобы настроить параметры рассылки, перейдите в раздел Настройки >> Email newsletter.

Настройки рассылки Ghost

Нажмите на ссылку Настройка Mailgun, чтобы развернуть.

Заполните свой регион Mailgun, домен и API-ключ.

Настройки рассылки MailGun Ghost

Нажмите кнопку Сохранить в правом верхнем углу, чтобы сохранить настройки.

Чтобы протестировать доставку рассылки, создайте новый тестовый пост, нажмите опубликовать и выберите опцию Только по электронной почте. Если вы хотите опубликовать пост также, выберите опцию Опубликовать и отправить по электронной почте.

Опция публикации/отправки по электронной почте Ghost

Нажмите кнопку Продолжить, финальный обзор, чтобы продолжить. На следующей странице снова будет запрашиваться финальное подтверждение.

Подтверждение отправки рассылки Ghost

Нажмите кнопку Отправить письмо прямо сейчас, чтобы отправить рассылку. Вы получите следующее сообщение после отправки почты.

Сообщение об успешной доставке рассылки Ghost

Проверьте свою электронную почту для поста.

Письмо рассылки Ghost

Шаг 12 - Обновление Ghost

Существуют два типа обновлений Ghost — минорные и мажорные обновления.

Сначала сделайте полную резервную копию, если хотите выполнить минорное обновление. Это создаст резервную копию всех постов, участников, тем, изображений, файлов и файлов перенаправления.

$ cd /var/www/html/ghost
$ ghost backup

Запустите команду обновления, чтобы выполнить минорное обновление.

$ ghost update

Чтобы выполнить мажорное обновление, вам следует следовать официальному подробному руководству по обновлению на сайте Ghost. В зависимости от того, на какой версии вы находитесь в данный момент и на какую мажорную версию вы хотите обновиться, шаги будут различаться.

Заключение

Это завершает наше руководство о том, как настроить Ghost CMS на вашем сервере Debian 12 с использованием Nginx. Если у вас есть какие-либо вопросы или отзывы, поделитесь ими в комментариях ниже.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.