1/5 (1) Деплой проекта на движке Ghost на Docker

В этом посте объясняется, как задеплоить блог на Ghost — движке с базой данных MariaDB с помощью docker.

В данном посте мы будем использовать сервисы:

  • Ghost — платформу для блогинка на Node.js
  • Nginxпрокси сервера внешних запросов на внутренний сервис
  • MariaDB — реляционная БД с открытым исходным кодом
  • Docker — контейнеризация сервисов

Предисловие

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

При развертке используется Docker и для этого нам нужен будет виртуальный сервер или личный ПК, на которых установлены Docker и Compose.

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

Настройка хоста

Перед тем, как переходить к рассмотрению кода, нам будет необходимо подготовить нашу систему, сервер или виртуальную машину на то, чтобы поднять образы и принимать внешние запросы. Я ж буду отталкивать ся от того, что у меня Linux сервер на дистрибутиве Ubuntu. Для этого нам будет необходимо установить сервисы Docker, Compose, Nginx:

$ sudo apt install docker docker-compose nginx

Также, в дополнении, нам будет необходимо убедиться, что ваш пользователь без полномочий root находится в группе docker, чтобы иметь возможность запускать команды докеров:

$ sudo usermod username -aG docker

Подготовка окружения

Для начала опишем все сервисы в файле docker-compose.yml

version: '3.3'

services:
  mariadb:
    container_name: project_mariadb
    image: mariadb:${MARIADB_IMAGE_TAG}
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: ghost_production
    restart: always
    volumes:
      - type: bind
        source: ${MYSQL_HOST_PATH}
        target: /var/lib/mysql

  ghost:
    container_name: project_ghost
    image: ghost:${GHOST_IMAGE_TAG}
    ports:
        - 8022:2368
    environment:
      url: ${BLOG_URL:-http://127.0.0.1}
      database__client: mysql
      database__connection__host: mariadb
      database__connection__database: ghost_production
      database__connection__user: ghost
      database__connection__password: ${MYSQL_PASSWORD}
    depends_on:
      - mariadb
    restart: always
    volumes:
      - type: bind
        source: ${GHOST_HOST_PATH}
        target: /var/lib/ghost/content

Исходя из выше описанного кода, видно, что мы используем 2 образа

  • ghost
  • mariadb

Ghost выведен наружу по порту 8022 и через вольюм пути исходного кода source, откуда он будет с хоста грузить себе в образ и выполнять.

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

# Tag used for the ghost docker image
export GHOST_IMAGE_TAG=latest

# Tag used for the MariaDB docker image
export MARIADB_IMAGE_TAG=latest

# Configure the blog url in ghost
export BLOG_URL=http://127.0.0.1:8022

# Root password used for MariaDB
export MYSQL_ROOT_PASSWORD=password

# User password used by ghost to connect to the database
export MYSQL_PASSWORD=password

# Host folders used by the containers
export MYSQL_HOST_PATH=./mariadb
export GHOST_HOST_PATH=./www

Теперь, чтобы поднять контейнеры из образов, достаточно в корне, где файл docker-compose.yml запустит команду

$ docker-compose up -d

После чего наш сайт должен быть доступен по порту localhost:8022

Результат установки Ghost в Docker локально

Настройка Nginx

Локально наш сайт будет доступен по адресу localhost:8022, но чтобы он был доступен глобально, в случае, если у вас виртуальный сервер, к которому прикреплен домен, то придется все запросы перенаправлять с внешнего порта 80 или 443 на порт 8022, для этого нам нужно описать данные моменты в конфигурационном файле сайта и добавить его в папку /etc/nginx/sites-available/site.com.conf и далее дать символьную ссылку данного файла в папку /etc/nginx/sites-enabled

$ ln -s /etc/nginx/sites-available/site.com.conf /etc/nginx/sites-enabled/site.com.conf

Данный файл, примерно, должен выглядеть следующим образом

server {
    server_name site.com www.site.com;
    
    error_log /var/www/site/logs/error.log;
    access_log /var/www/site/logs/access.log;

    location /{
        proxy_pass http://localhost:8022;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

}

Как видно, у нас, с внешнего порта 80 все запросы проксируются на порт нашего образа Ghost, тем самым, для внешних юзеров он выглядит как обычный сайт на привычном порту 80

После чего перезагружаем nginx

$ systemctl restart nginx

И после чего у нас должен быть доступен по домену site.com и на этом все. Исходный код лежит на gist.

При составлении проекта и текста использовалась оригинальная статья, переделанная под нужды автора.

Пожалуйста, оцените материал

WebSofter

Web - технологии