Самостоятельно вести блог-Ghost с помощью Traefik

Ghost — очень популярная система управления контентом с открытым исходным кодом. Начавшись как альтернатива WordPress, он стал альтернативой Substack, сосредоточившись на членстве и новостной рассылке.
Кроме того, вы можете самостоятельно разместить его на своих собственных облачных серверах.
Вместо обратного прокси-сервера Ngnix вы также можете использовать другое программное обеспечение под названием Traefik с Docker. Это популярный прокси-сервер облачных приложений с открытым исходным кодом, шлюз API, Edge-маршрутизатор и многое другое.
Мы используем Traefik для защиты своих веб-сайтов с помощью SSL-сертификата, полученного от Let’s Encrypt. После развертывания Traefik может автоматически управлять вашими сертификатами и их продлением.
В этой статье мы расскажем о необходимых шагах для развертывания блога Ghost с помощью Docker и Traefik.
Вот что вам нужно для этого урока:
- Домен и доступ к его настройкам DNS
- Облачный сервер
- Хорошее знание командной строки Linux
- Уверенное знание Doker
Помимо этого, давайте посмотрим, как это сделать.
Шаг 1. Получите домен (если у вас его нет)
Мы всегда рекомендуем развертывать инструменты на реальных доменах, даже если они предназначены для тестирования.
Для тестирования вы можете получить любой доступный домен по самой низкой цене. Обычно домены с малоизвестными TLD, такими как .club, стоят очень дешево. Вместо того, чтобы продлевать на следующий год, вы можете купить еще один по дешевой цене.
Если это настоящий общедоступный веб-сайт, выберите домен, подходящий для вашего бренда. Мы всегда предпочитаем домены .com любым другим TLD.
2. Настройка вашего облачного экземпляра
Если вы сомневаетесь, обратитесь к бесплатному облачных серверов. Вы можете получить несколько бесплатных кредитов за опробование новой услуги.
Вы можете создать новый сервер в предпочитаемом вами облачном сервисе.
3. Настройка Docker и Docker Swarm
Мы считаем, что вы знаете, как использовать SSH для подключения к удаленным серверам.
ssh root@<IP address of the Droplet>
После того, как вы вошли на свой сервер, вам необходимо настроить Docker. Поскольку установка Docker отличается для разных дистрибутивов, мы не будем ее освещать.
Мы будем запускать наши сервисы в среде Docker Swarm. Чтобы запустить среду Docker Swarm,
docker swarm init
Это создает новую среду Swarm, и она становится вашим управляющим узлом. Вы можете добавить новую каплю в качестве рабочего узла, чтобы расширить свои услуги, но это выходит за рамки этого руководства.
4. Создание необходимых файлов конфигурации и каталогов
Создайте папку с именем website или что угодно и измените каталог на только что созданный каталог.
mkdir website cd website
Вам нужно создать пару файлов и каталогов для хранения файлов конфигурации Traefik и ваших ключей SSL:
Создайте новый каталог с именем «data» и измените каталог на него.
mkdir data cd data
Внутри этого каталога создайте два новых файла с именами traefik.yml и acme.json, измените разрешение acme.json на 600.
touch traefik.yml acme.json chmod 600 acme.json
Откройте файл с помощью любого редактора.
nano traefik.yml
Вставьте следующий код в файл traefik.yml.
api:
dashboard: true
debug: true
serversTransport:
insecureSkipVerify: true
entryPoints:
web:
address: :80
http:
redirections:
entryPoint:
to: websecure
websecure:
address: :443
http:
middlewares:
- secureHeaders@file
- nofloc@file
tls:
certResolver: letsencrypt
domains:
- main: yourdomain.com
sans:
- "*.yourdomain.com"
pilot:
dashboard: false
providers:
docker:
swarmMode: true
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: /configurations/dynamic.yml
certificatesResolvers:
letsencrypt:
acme:
#caServer: https://acme-staging-v02.api.letsencrypt.org/directory
email: youemail@email.com
storage: acme.json
keyType: EC384
dnsChallenge:
provider: cloudflare
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"
Вам нужно изменить несколько переменных:
Измените yourdomain.com на свой домен.
- main: yourdomain.com
sans:
- "*.yourdomain.com"
Создайте новый каталог с именем configurations и перейдите в него. Внутри этого каталога создайте новый файл с именем «dynamic.yml» и скопируйте и вставьте следующие строки.
mkdir configurations cd configurations touch dynamic.yml nano dynamic.yml
# Dynamic configuration
http:
middlewares:
nofloc:
headers:
customResponseHeaders:
Permissions-Policy: "interest-cohort=()"
secureHeaders:
headers:
sslRedirect: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
# UserName : admin
# Password : qwer
user-auth:
basicAuth:
users:
- "admin:$apr1$tm53ra6x$FntXd6jcvxYM/YH0P2hcc1"
tls:
options:
default:
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
minVersion: VersionTLS12
5. Настройка Traefik и Ghost
Теперь вернитесь в наш основной каталог, т. е . в нашем случае в каталог «website», который вы создали вначале.
cd ~/website
Теперь создайте файл с именем docker-compose.yml для редактирования.
nano docker-compose.yml
Вставьте следующее:
# Traefik, Ghost, and MySQL
version: '3.3'
services:
traefik:
image: traefik:latest
networks:
- traefik
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/configurations:/configurations
environment:
- CF_API_EMAIL=
- CF_DNS_API_TOKEN=
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.traefik-secure.entrypoints=websecure"
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.traefik-secure.service=api@internal"
- "traefik.http.services.traefik-secure.loadbalancer.server.port=8080"
ghost:
image: ghost:4-alpine
depends_on:
- mysql
- traefik
networks:
- traefik
- backend
volumes:
- ghost_data:/var/lib/ghost
environment:
# see https://ghost.org/docs/config/#configuration-options
database__client: mysql
database__connection__host: mysql
database__connection__user: root
database__connection__password: secretpassword
database__connection__database: ghost
# this url value is just an example, and is likely wrong for your environment!
url: https://yourdomain.com
# contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired)
#NODE_ENV: development
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.ghost-secure.entrypoints=websecure"
- "traefik.http.routers.ghost-secure.rule=Host(`yourdomain.com`)"
- "traefik.http.routers.ghost-secure.service=ghost"
- "traefik.http.services.ghost.loadbalancer.server.port=2368"
mysql:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: secretpassword
networks:
- backend
volumes:
- sql_data:/var/lib/mysql
deploy:
placement:
constraints: [node.role == manager]
networks:
traefik:
external: true
backend:
external: true
volumes:
ghost_data:
external: true
sql_data:
external: true
Не забудьте установить переменные среды. Если вы не знаете, как получить адрес электронной почты API вашей учетной записи Cloudflare и токен API DNS, прочитайте эту статью от Cloudflare.
environment: - CF_API_EMAIL= - CF_DNS_API_TOKEN=
Пока не закрывайте файл. Вы должны изменить несколько параметров здесь .
Замените traefik.yourdomain.com; с поддоменом.
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.yourdomain.com`)"
Замените «secretpassword» новым паролем.
database__connection__password: secretpassword
Замените « https://yourdomain.com » на ваш URL.
url: https://yourdomain.com
Замените yourdomain.com субдоменом или используйте полный домен.
- "traefik.http.routers.ghost-secure.rule=Host(`yourdomain.com`)"
Наконец, замените «secretpassword» паролем, который вы установили выше во втором пункте.
MYSQL_ROOT_PASSWORD: secretpassword
6. Создание и запуск служб
Теперь все на месте! Проверьте свои файлы, все ли на месте и переменные изменены в соответствии с вашими требованиями.
Ваша файловая структура должна быть такой:

Теперь из этого каталога запустите команду. Вы можете изменить «site» на что угодно.
docker stack deploy -c docker-compose.yml site
Загрузка образов docker и получение ключей SSL занимает некоторое время.
Чтобы вывести список запущенных служб, запустите:
docker service ls
Здесь перечислены запущенные службы. Если REPLICAS равно 0/1, подождите несколько минут, возможно, он готовится.
Чтобы проверить состояние отдельных служб, запустите:
docker service ps <service name>
Замените <service name> на site, site_ghost, site_traefik или site_mysql.
Чтобы просмотреть журналы отдельных служб, выполните:
docker service logs -f <service name>
Ура!! Теперь ваш сайт должен работать. Посетите указанные выше URL-адреса для Traefik и Ghost.
Редактор: AndreyEx