Ghost — очень популярная система управления контентом с открытым исходным кодом. Начавшись как альтернатива WordPress, он стал альтернативой Substack, сосредоточившись на членстве и новостной рассылке.
Кроме того, вы можете самостоятельно разместить его на своих собственных облачных серверах.
Вместо обратного прокси-сервера Ngnix вы также можете использовать другое программное обеспечение под названием Traefik с Docker. Это популярный прокси-сервер облачных приложений с открытым исходным кодом, шлюз API, Edge-маршрутизатор и многое другое.
Мы используем Traefik для защиты своих веб-сайтов с помощью SSL-сертификата, полученного от Let’s Encrypt. После развертывания Traefik может автоматически управлять вашими сертификатами и их продлением.
В этой статье мы расскажем о необходимых шагах для развертывания блога Ghost с помощью Docker и Traefik.
Вот что вам нужно для этого урока:
Помимо этого, давайте посмотрим, как это сделать.
Мы всегда рекомендуем развертывать инструменты на реальных доменах, даже если они предназначены для тестирования.
Для тестирования вы можете получить любой доступный домен по самой низкой цене. Обычно домены с малоизвестными TLD, такими как .club, стоят очень дешево. Вместо того, чтобы продлевать на следующий год, вы можете купить еще один по дешевой цене.
Если это настоящий общедоступный веб-сайт, выберите домен, подходящий для вашего бренда. Мы всегда предпочитаем домены .com любым другим TLD.
Если вы сомневаетесь, обратитесь к бесплатному облачных серверов. Вы можете получить несколько бесплатных кредитов за опробование новой услуги.
Вы можете создать новый сервер в предпочитаемом вами облачном сервисе.
Мы считаем, что вы знаете, как использовать SSH для подключения к удаленным серверам.
ssh root@<IP address of the Droplet>
После того, как вы вошли на свой сервер, вам необходимо настроить Docker. Поскольку установка Docker отличается для разных дистрибутивов, мы не будем ее освещать.
Мы будем запускать наши сервисы в среде Docker Swarm. Чтобы запустить среду Docker Swarm,
docker swarm init
Это создает новую среду Swarm, и она становится вашим управляющим узлом. Вы можете добавить новую каплю в качестве рабочего узла, чтобы расширить свои услуги, но это выходит за рамки этого руководства.
Создайте папку с именем 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
Теперь вернитесь в наш основной каталог, т. е . в нашем случае в каталог «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
Теперь все на месте! Проверьте свои файлы, все ли на месте и переменные изменены в соответствии с вашими требованиями.
Ваша файловая структура должна быть такой:
Теперь из этого каталога запустите команду. Вы можете изменить «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.