Как установить Ghost CMS

Как установить Ghost CMS

Каждый начинающий блоговод, который только победил все преграды с установкой и настройкой чего-то сложнее WordPress считает необходимым рассказать свой опыт.

Я не исключение и тоже поделюсь этой информацией и, надеюсь, сэкономлю кому-то время.

В своей статье я переиспользую часть статьи Дмитрия Яковлева (если верить его домену), но дополню статью дополнительной информацией.

Как установить Ghost на VPS
Инструкция как легко и быстро установить Ghost CMS на свой VPS.

Можете ознакомится с исходной статьей тут

Начнем с БАЗЫ

ХОСТИНГ

Выбор хостинга в случае с ghost очень важен, как показала моя практика.

Так исторически сложилось что я с середины нулевых использую хостинг Джино, не лучший хостинг на свете, но достаточно дешевый и он отвечал моим требованиям бедного школьника, а потом студента. Я запускал какие-то проекты на питоне, поднимал базы, хостил простые PHP сайты.

И когда я в тысячный раз захотел себе блог, изучил вопрос, выбрал ghost я пошел запускать VPS и пытаться...
А потом еще пытался...
И еще...
И еще...
Я побеждал одну проблему и сразу натыкался на следующую. Я перепробовал все статьи, включая ту о которой писал выше, но одна проблема так и не была решена

Уникальна ли моя проблема? Не думаю

Признаюсь, я почти опустил руки в тот момент, было решено сделать последний рывок и попробовать перекатиться на другой хостинг, а именно timeweb.
Ведь если в статье его используют и все получилось, значит и у меня должно.
И ведь получилось!!! Так что ребят я точно могу советовать.

Выбор VPS

У меня нет аудитории и я не собираюсь раскручиваться, поэтому выбор пал на достаточно простые спеки и уложился в 730 рублей в месяц.

Можно ли дешевле? Конечно!
Но я выбрал такую конфигурацию чтобы было чуть спокойней с бэкапами и не приходилось обходить проверки на RAM.

УСТАНОВКА GHOST

Далее без лирики, копипаста из статьи в начале + мои дополнения.

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

Есть возможность использовать консоль прямо в пане управления Timeweb

Открываем окно PowerShell и набираем следующую команду:

ssh root@server_ip

Вместо server_ip необходимо указать ip-адрес сервера из письма от Timeweb Cloud. Пароль будет доступен для копирования в панели управления.

💡
Есть возможность использовать консоль прямо в пане управления Timeweb

Первым делом надо обновить ОС, так мы будем уверены что закрыты все известные ошибки и дыры в безопасности.

sudo apt update && sudo apt upgrade -y

Теперь необходимо сменить пароль для root-пользователя. Естественно лучше использовать как можно более сложный пароль и стоит его сохранить (в идеале в менеджере паролей, да и для генерации пароля лучше использовать тот же менеджер паролей).

sudo passwd root

Для смены пароля его необходимо ввести дважды.

Теперь перейдем к смене порта для SSH:

sudo nano /etc/ssh/sshd_config
💡
У вас может не быть nano, в этом случае надо его установить
apt install -y nano

Открывается конфиг-файл в редакторе nano. Ищем строчку «#Port 22» и над ней печатаем:

Port port_number

Вместо port_number необходимо ввести произвольный номер порта, лучше использовать пятизначный

Перезапускаем SSH, чтобы новые настройки вступили в силу.

systemctl restart sshd

В дальнейшем для подключения по SSH надо будет указывать номер этого порта: ssh root@server_ip -p port_number

Теперь перейдем к настройке firewall'а.

sudo ufw allow port_number/tcp

Вместо port_number указываем выбранный номер порта для SSH

💡
У вас может не быть ufw, в этом случае его требуется установить
apt install ufw -y

Включаем firewall:

sudo ufw enable

И проверяем статус:

sudo ufw status

Теперь необходимо создать нового пользователя.

sudo adduser user_name

user_name заменить на выбранное вами имя пользователя

Дважды вводим пароль для нового пользователя. Он должен отличаться от пароля для root. Остальные поля можно оставить пустыми. Теперь добавим созданному пользователю sudo права.

usermod -aG sudo user_name

user_name - имя пользователя из предыдущего шага

Переключаемся на этого пользователя и продолжим настройку сервера из-под него.

su - user_name

Установка необходимого софта и создание директорий

Nginx

Устанавливаем веб-сервер Nginx:

sudo apt install nginx

И открываем доступ для Nginx в firewall'е.

sudo ufw allow 'Nginx Full'

Проверяем еще раз настройки firewall'а (необязательно).

sudo ufw status
Ожидаем увидеть примерно следующее

MySQL

Теперь перейдем к установке MySQL. Можно установить и sqlite, но это больше для разработки, если вы правда планируете использовать ghost лучше выбрать MySQL.

💡
Если вы планируете использовать внешнюю базу - пропустите установку, но все дальнейшие шаги проведите в внешней базе.
Помните, необходима MySQL 8
sudo apt install mysql-server

Заходим в MySQL.

sudo mysql

Задаем пароль для root-пользователя.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Вместо password указать выбранный пароль. Он должен отличаться от от всех других паролей

Теперь добавим пользователя MySQL для Ghost:

CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'password';

user_name - имя пользователя, password - пароль для этого пользователя

Создаем базу данных для будущего сайта

CREATE DATABASE databese_name;

database_name - имя базы данных, которое вы придумали

И даем новому пользователю полный доступ к созданной базе данных.

GRANT ALL PRIVILEGES ON database_name.* TO 'user_name'@'localhost';
FLUSH PRIVILEGES;

И выходим из MySQL:

exit

Node.js

На текущий момент Ghost рекомендует использовать Node.js 20 версии. Ее и поставим.
Какие версии поддерживаются и рекомендуется всегда можно посмотреть здесь

Скачиваем и устанавливаем GPG-ключ.

sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

Создаем deb-репозиторий:

NODE_MAJOR=20 # Указывается необходимая версия. В данном случае - 20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

Обновляем пакеты и устанавливаем Node.js

sudo apt update
sudo apt install nodejs -y

Ghost CLI

Ghost CLI - это инструмент командной строки, который автоматически установит Ghost и необходимые зависимости.

sudo npm install ghost-cli@latest -g

Создание директории для сайта

sudo mkdir -p /var/www/site_name

site_name - заменить на адрес вашего сайта (или что угодно другое)

Меняем владельца созданной папки на нашего пользователя:

sudo chown user_name:user_name /var/www/site_name

user_name - имя пользователя, которого создавали ранее, site_name - имя папки сайта

И задаем необходимые разрешения:

sudo chmod 775 /var/www/site_name

site_name - имя папки сайта

Переходим в директорию сайта:

cd /var/www/site_name

site_name - имя папки сайта, которую вы создали

Установка и настройка Ghost

Вот и подошли к последним шагам по установке. Для ее начала вводим команду:

ghost install

Последняя миля

Blog URL - ввести адрес сайта: https://example.com Именно с «https», это необходимо для получения SSL-сертификата.

MySQL hostname - так как БД располагается локально, то просто все оставляем по умолчанию и нажимаем Enter.

18 и далее версии Node.js будут использовать ipv6 и будет возникать ошибка подключения к базе данных. По умолчанию уже указан 127.0.0.1 и можно просто нажать Enter, однако если это не так то необходимо указывать не localhost, а 127.0.0.1

MySQL username / password - имя пользователя БД, которого создали ранее, и его пароль.

Ghost database name - имя базы данных, которую создавали для сайта.

Set up NGINX? - Соглашаемся, y, Enter.

Set up SSL? - Соглашаемся, y, Enter. Здесь будет необходимо ввести email.

Set up systemd? - Соглашаемся, y, Enter.

Start Ghost? - Соглашаемся, y, Enter.

Переходим по адресу https://example.com/ghost и завершаем установку, создав свой аккаунт на сайте.

После установки

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

Вы не можете авторизоваться в ghost после того как вышли из личного кабинета!

Оказывается вам надо настроить email шлюз чтобы получать письма для подтверждения входа!

Message:'EACCES: permission denied ...

Вы не можете ничего сделать с файлами, даже через sudo!
Обновить ghost нельзя, перезагрузить нельзя, внести изменения или создать новые файлы нельзя итд.

Теперь я расскажу как все это лечить

Проблема 1

Невозможно изменить или сделать хоть что-то внутри папки /var/www/site_name (помните мы выше создавали такую?)

Оказывается ghost создал папки content и system и файлы внутри имели неправильных владельцев - исправляем.

cd /var/www/site_name
sudo chown -R user_name:user_name content
sudo chown -R root:root system

Заменяем site_name и user_name на необходимые значения

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

+ sudo systemctl is-active ghost_xxx.xxx
✖ Restarting Ghost
A SystemError occurred.

Message: Systemd process manager has not been set up or is corrupted.
Help: Run ghost setup linux-user systemd and try again.

Пример такой ошибки для перезагрузки

Есть 2 пути:

  • Забить
sudo systemctl restart ghost_xxx-xx

Меняем xxx-xx на имя которое дал ghost проект и перезапускаем в будущем только так

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

Прямо сейчас я прохожу все проверки:

/var/www/site_name$ ghost doctor

✔ Checking system Node.js version - found v20.19.2
✔ Checking logged in user
✔ Ensuring user is not logged in as ghost user
✔ Checking if logged in user is directory owner
✔ Checking current folder permissions
✔ Checking system compatibility
✔ Checking for a MySQL installation
+ sudo systemctl is-active ghost_xxx-xx
Instance is currently running
ℹ Validating config [skipped]
✔ Checking folder permissions
✔ Checking file permissions
✔ Checking memory availability
✔ Checking binary dependencies
✔ Checking free space
✔ Checking systemd unit file
✔ Checking systemd node version - found v20.19.2

Помогло просто перезапустить заново процесс установки и все завелось.

ghost setup

Проблема 2

Не получается авторизоваться с ошибкой Failed to send email.
Тут нужно немного донастроить production конфиг

cd /var/www/site_name
nano config.production.json

Здесь так же есть 2 пути:

  • Забить на проверку (не рекомендуется)
  "security": {
    "staffDeviceVerification": false
}

В конце файла добавить запись, она отключает проверки для админов

  • Настроить email шлюз
"mail": {
  "transport": "SMTP",
  "from": "noreply@w8w.ru",
  "fromname": "W8W Blog",
  "options": {
    "host": "smtp.gmail.com",
    "port": 587,
    "auth": {
      "user": "user",
      "pass": "password"
    }
  }
}

Пример для google, но нужен ключ для поля pass https://myaccount.google.com/apppasswords

Можно использовать и другие, это на ваш выбор.

У Timeweb закрыты данные порты по умолчанию. Или используйте сервисы которые использую порты отличные от следующих 465, 2525, 25, 3389, 587, 53413, 389 или которые работают через API.
Можно было бы использовать нативную интеграцию с mailgun, но они нас заблокировали...

Посмотрите какой вы молодец!

  • Настроили VPS
  • Установили и настроили базу данных
  • Установили Ghost
  • Подебажили Ghost
  • Почти (или уже) стали блогером

Я вас искренне поздравляю и надеюсь я сэкономил вам немного времени, а я надеюсь мне не станет лень и я еще допишу несколько статей на эту тему.