Как развернуть 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
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Еще раз проверьте состояние брандмауэра.

$ 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 (Long Term Support), которую рекомендует 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.

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

$ 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. Создайте каталог для MySQL docker.

$ 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 при появлении запроса.

Здесь мы задали пароль root и учетные данные 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: Введите пароль root, созданный ранее в файле docker.
  • Имя базы данных Ghost: Введите имя базы данных (ghostdb), сконфигурированной в файле docker.
  • Пароль Sudo: Он запросит ваш пароль sudo для выполнения административных задач.
  • Настроить Nginx? Обычно Ghost-CLI обнаруживает установленный у вас Nginx и автоматически настраивает его для вашего блога. Но это работает только для Nginx, установленного с помощью пакета ОС. Поскольку мы установили его с помощью репозитория Nginx, Ghost не может его обнаружить и автоматически пропустит.
  • Настроить SSL?: Поскольку он пропустил настройку Nginx, инструмент CLI также пропустит настройку SSL.
  • Настроить systemd?: Ghost спросит, хотите ли вы установить системную службу для Ghost. Нажмите Y продолжить.
  • Запустить Призрака?: Нажмите 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

Мы выберем Explore Ghost admin для изучения и перехода непосредственно к панели управления. По окончании настройки перед вами откроется панель администрирования 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": "'Unixsru 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 Mail, поскольку он доступен по цене и не требует ежемесячной платы.

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

$ ghost restart

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

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

Нажмите на кнопку Конфигурация Mailgun ссылка на расширение.

Введите регион, домен и API-ключ Mailgun.

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

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

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

Ghost Post Publish/Email Option

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

Ghost Send Email Newsletter Confirm

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

Сообщение об успешной доставке новостного бюллетеня Ghost Newsletteter

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

Призрачная рассылка

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

Существует два типа обновлений Ghost – незначительные и значительные.

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

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

Выполните команду update, чтобы выполнить незначительное обновление.

$ ghost update

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

Заключение

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *