Как установить Ghost CMS с Docker на Ubuntu 20.04
На этой странице
- Предпосылки
- Шаг 1. Настройка брандмауэра UFW
- Шаг 2. Установите Certbot и получите сертификат SSL
- Шаг 3. Установите Docker и Docker Compose
- Шаг 4. Установите Ghost
- Создать файл Docker Compose
- Создание образа Nginx Docker
Ghost — это платформа для ведения блогов с открытым исходным кодом, которая поможет вам создать профессиональный блог. Он был запущен в 2013 году как альтернатива WordPress, потому что он становился слишком сложным. Ghost написан на JavaScript и работает на Node.js. gpt-ad-howtoforge_com-box-3-0;var ffid=1;var alS=1002%1000;var container=document.getElementById(slotId);container.style.width=100%;var ins=document.createElement( ins);ins.id=slotId+-asloaded;ins.className=adsbygoogle ezasloaded;ins.dataset.adClient=pid;ins.dataset.adChannel=cid;if(ffid==2){ins.dataset.fullWidthResponsive=true; }
В этом руководстве мы рассмотрим, как установить Ghost CMS с помощью Docker на сервер под управлением Ubuntu 20.04. Мы также будем использовать Nginx в качестве прокси-сервера и SSL-сертификат Lets Encrypt для защиты нашей установки.
Предпосылки
-
A server running Ubuntu 20.04.
-
A non-root sudo user.
-
Make sure everything is updated.
$ sudo apt update $ sudo apt upgrade
Шаг 1. Настройте брандмауэр UFW.
Первым шагом является настройка брандмауэра. Ubuntu по умолчанию поставляется с ufw (простой брандмауэр).
Проверьте, работает ли брандмауэр.
$ sudo ufw status
Вы должны получить следующий вывод.
Status: inactive
Разрешить порт SSH, чтобы брандмауэр не прерывал текущее соединение при его включении.
$ sudo ufw allow OpenSSH
Разрешить также порты HTTP и HTTPS.
$ sudo ufw allow 80 $ sudo ufw allow 443
Включить брандмауэр
$ 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 ALLOW Anywhere 443 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)
Шаг 2. Установите Certbot и получите сертификат SSL.
Прежде чем продолжить, нам нужно установить инструмент Certbot и установить SSL-сертификат для нашего домена.
Для установки Certbot мы будем использовать установщик пакетов Snapd. Официальный репозиторий Certbots устарел, а пакету Ubuntu Certbot больше года. Snapd всегда содержит последнюю стабильную версию Certbot, и вы должны использовать ее. К счастью, Ubuntu 20.04 поставляется с предустановленным Snapd.
Убедитесь, что ваша версия Snapd обновлена.
$ sudo snap install core $ sudo snap refresh core
Удалите все старые версии Certbot.
$ sudo apt remove certbot
Установите Сертбот.
$ sudo snap install --classic certbot
Используйте следующую команду, чтобы убедиться, что команду Certbot можно запустить, создав символическую ссылку на каталог
/usr/bin
.$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Создайте SSL-сертификат.
$ sudo certbot certonly --standalone -d example.com
Приведенная выше команда загрузит сертификат в каталог
/etc/letsencrypt/live/example.com
на вашем сервере.Шаг 3 — Установите Docker и Docker Compose
Первый шаг — установить Docker Engine и Docker Compose. Сначала удалите все старые версии Docker.
$ sudo apt remove docker docker-engine docker.io containerd runc
Установите несколько пакетов, необходимых для запуска Docker.
$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
Добавьте официальный GPG-ключ Dockers.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Добавьте официальный репозиторий Dockers.
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Обновите системные репозитории.
$ sudo apt update
Установите последнюю версию Docker Engine.
$ sudo apt install docker-ce docker-ce-cli containerd.io
Убедитесь, что Docker Engine работает и правильно установлен.
$ sudo docker run hello-world
По умолчанию для запуска Docker требуется sudo. Чтобы обойти это, мы можем добавить текущую учетную запись пользователя в группу пользователей
docker
.$ sudo usermod -aG docker ${USER}
Чтобы применить новое членство в группе, выйдите из системы и войдите снова или используйте следующую команду.
$ su - ${USER}
Теперь вы можете запускать команды docker без использования sudo.
Затем загрузите текущую стабильную версию Docker compose.
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
На момент написания этого руководства последней версией Docker compose была 1.28.6. Вы всегда можете изменить или выбрать другую версию в команде, проверив ее на странице выпусков Github в Docker compose.
Примените разрешение на выполнение к установленной версии Docker compose.
$ sudo chmod +x /usr/local/bin/docker-compose
Протестируйте установку.
$ docker-compose --version docker-compose version 1.28.6, build 5db8d86f
Шаг 4 - Установите Призрака
Установка Ghost будет состоять из трех компонентов: пакета Ghost, сервера базы данных, такого как MySQL, и веб-сервера (Nginx). Все эти сервисы можно установить с помощью одного компоновочного файла Docker.
Создать файл Docker Compose
Сначала создайте каталог для хранения и запуска файла компоновки Docker.
$ mkdir ghost && cd ghost
Создайте файл с именем
docker-compose.yml
и откройте его в редакторе Nano.$ nano docker-compose.yml
Вставьте следующий код в файл. Замените
example.com
своим доменом и вставьте пароль базы данных вместо значенияyour_password
. Оставьте одинаковыми значения дляdatabase__connection__password
иMYSQL_ROOT_PASSWORD
. Замените<username>
на имя пользователя вашего сервера.version: '3.3' services: ghost: image: ghost:latest restart: always depends_on: - db environment: url: https://example.com database__client: mysql database__connection__host: db database__connection__user: ghost database__connection__password: ghostdbpass database__connection__database: ghostdb mail__transport: SMTP mail__options__host: {Your Mail Service host} mail__options__port: {Your Mail Service port} mail__options__secureConnection: {true/false} mail__options__service: {Your Mail Service} mail__options__auth__user: {Your User Name} mail__options__auth__pass: {Your Password} volumes: - /home/<username>/ghost/content:/var/lib/ghost/content db: image: mariadb:latest restart: always environment: MYSQL_ROOT_PASSWORD: your_mysql_root_password MYSQL_USER: ghost MYSQL_PASSWORD: ghostdbpass MYSQL_DATABASE: ghostdb volumes: - /home/<username>/ghost/mysql:/var/lib/mysql nginx: build: context: ./nginx dockerfile: Dockerfile restart: always depends_on: - ghost ports: - "80:80" - "443:443" volumes: - /etc/letsencrypt/:/etc/letsencrypt/ - /usr/share/nginx/html:/usr/share/nginx/html
Файл компоновки Docker создает несколько точек монтирования, то есть сопоставляет определенные каталоги на сервере с каталогами внутри контейнера.
- Каталоги
/var/lib/ghost/content
и/var/lib/mysql
внутри ваших контейнеров сопоставляются с/home/
и/ ghost/content /home/
на сервере./ghost/mysql - Nginx использует привязку
/etc/letsencrypt/
для доступа к сертификатам Lets Encrypt с сервера. - Nginx также требуется доступ к пользовательскому каталогу
/usr/share/nginx/html
, чтобы получить доступ к файлам Lets Encrypt Challenge для получения сертификата.
В приведенном выше файле мы также включили параметры для настройки почты. Если вы используете популярную почтовую службу SMTP, такую как Mailgun, Mailjet, Mandrill, Postmark, Sendgrid, SendCloud, SES, Zoho или Gmail, вы можете просто добавить имя службы, имя пользователя и пароль SMTP и избавиться от остальных поля. В противном случае заполните все остальные параметры и удалите имя службы, и она все равно должна работать. Вы можете проверить дополнительные параметры почты в документации Ghosts о параметрах почты.
Создайте каталоги для всех монтирований привязки, описанных выше (кроме
/etc/letsencrypt
, который уже был создан, когда мы создавали сертификат ранее)$ cd ~/ghost $ mkdir content $ mkdir mysql $ sudo mkdir -p /usr/share/nginx/html
Создайте образ Nginx Docker
Созданный нами файл компоновки Docker основан на образе Nginx Docker. Чтобы заставить его работать, нам нужно включить настроенный файл конфигурации для Nginx, который будет работать с Ghost.
Создайте каталог для этого изображения в текущем каталоге.
$ mkdir nginx
Создайте файл с именем
Dockerfile
в этом каталоге.$ touch nginx/Dockerfile
Вставьте следующий код в
Dockerfile
.FROM nginx:latest RUN rm /etc/nginx/conf.d/default.conf COPY ghost.conf /etc/nginx/conf.d
Приведенный выше код указывает Docker использовать последний образ Nginx. Он также удаляет файл конфигурации Nginx по умолчанию и копирует пользовательский файл конфигурации, который мы создали для нашей Ghost CMS.
Создайте файл с именем
ghost.conf
в каталогеnginx
.$ touch nginx/ghost.conf
Вставьте следующий код в файл
ghost.conf
. Замените все экземплярыexample.com
своим доменом.server { listen 80; listen [::]:80; server_name example.com; # Useful for Let's Encrypt location /.well-known/acme-challenge/ { root /usr/share/nginx/html; allow all; } 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; ssl_prefer_server_ciphers on; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.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://ghost:2368; } }
Приведенная выше конфигурация перенаправит все HTTP-запросы на HTTPS и будет служить прокси-сервером для сервиса Ghost, который будет обслуживать его через ваш домен.
Шаг 5 - Запустите сайт
Выполните следующую команду из каталога
ghost
, чтобы запустить службу Ghost.$ docker-compose up -d
Теперь вы можете проверить свою установку, открыв
https://example.com
в веб-браузере. Докеру может потребоваться несколько минут, чтобы включить все службы, поэтому вам может потребоваться обновить страницу, если вы сразу не видите свой блог.Если ваш сайт не отображается в браузере, вам необходимо просмотреть журналы Docker. Для этого сначала закройте контейнер.
$ cd ghost $ docker-compose down
Запустите Docker compose в подключенном состоянии, чтобы просмотреть журналы, созданные каждым контейнером.
$ docker-compose up
Чтобы закрыть контейнер и вернуться к командной строке bash, нажмите
CTRL+C
. После устранения неполадок вы можете снова запустить контейнер, и на этот раз ваш блог должен быть виден.Шаг 6 - Завершите настройку
Чтобы завершить настройку блога Ghost, перейдите на страницу
https://example.com/ghost
в браузере. Дополнительный/ghost
в конце вашего домена блогов перенаправляет вас на панель администратора Ghosts или, в данном случае, на настройку, поскольку вы обращаетесь к ней впервые.Здесь вам потребуется создать учетную запись администратора и выбрать название блога.
Вы также можете пригласить дополнительных сотрудников или сотрудников для своего блога, что вы также можете сделать позже, если решите пропустить сейчас.
В конце установки вас встретит панель администрирования Ghosts.
Если вы хотите переключиться в темный режим, вы можете сделать это, щелкнув тумблер рядом с кнопкой настроек в нижней части страницы настроек.
Вы уже увидите несколько сообщений по умолчанию, которые в основном являются руководствами, которые помогут вам ориентироваться и использовать Ghost. Вы можете отменить публикацию или удалить их и начать публикацию.
Шаг 7 - Обновите Призрака
В нашем файле компоновки Docker мы загружаем последнюю версию Ghost, доступную на момент установки, что упрощает обновление вашего блога Ghost.
Чтобы обновить, вам нужно закрыть контейнер, загрузить последние образы и снова запустить контейнер.
$ docker-compose down $ docker-compose pull && docker-compose up -d
Шаг 8. Обновите SSL-сертификат Lets Encrypt
Сертификаты Lets Encrypt действительны только в течение 90 дней. Поэтому нам нужно настроить cronjob, который будет автоматически обновлять сертификат.
Откройте Crontab в вашем редакторе.
$ sudo crontab -e
Вставьте следующую строку в конце, которая будет запускать Certbot в 23:00 каждый день. Замените
example.com
своим доменом.0 23 * * * certbot certonly -n --webroot -w /usr/share/nginx/html -d example.com --deploy-hook='docker exec ghost_nginx_1 nginx -s reload'
Запуск в 23:00 каждый день не означает, что ваш сертификат будет обновляться каждый день, поскольку Certbot продлит ваш сертификат, только если срок его действия истекает в течение 30 дней. Запуск этого каждую ночь дает скрипту несколько шансов попробовать до истечения срока действия.
Приведенная выше команда также перезапустит сервер Nginx внутри контейнера Docker после успешного обновления.
Вы можете протестировать задание cron, используя параметр
--dry-run
Certbot.$ sudo bash -c "certbot certonly -n --webroot --dry-run -w /usr/share/nginx/html -d example.com --deploy-hook='docker exec ghost_nginx_1 nginx -s reload'"
Заключение
На этом мы завершаем наше руководство по настройке Ghost CMS на вашем сервере под управлением Ubuntu 20.04 с помощью Docker. Если у вас есть какие-либо вопросы или отзывы, поделитесь ими в комментариях ниже.