Установка WordPress с помощью Docker Compose: сервисы и SSL-сертификаты
Ubuntu | Комментировать запись
WordPress – это свободная и открытая система управления контентом (CMS), построенная на базе данных MySQL с обработкой PHP. Благодаря своей расширяемой архитектуре на основе плагинов и шаблонов, а также возможности управлять через веб-интерфейс, WordPress является популярным выбором при создании различных веб-сайтов – от блогов до посадочных страниц и eCommerce сайтов.
Запуск WordPress обычно включает в себя установку стека LAMP (Linux, Apache, MySQL и PHP) или LEMP (Linux, Nginx, MySQL и PHP), что может занять много времени. Однако с помощью таких инструментов, как Docker и Docker Compose, вы можете упростить процесс настройки стека и установки WordPress. Вместо ручной установки отдельных компонентов вы можете использовать образы, которые многое стандартизируют (библиотеки, конфигурационные файлы и переменные среды), и запускать эти образы в изолированных контейнерах, которые выполняются в общей операционной системе. Кроме того, с помощью Compose вы можете координировать работу нескольких контейнеров – например, приложения и базы данных – и связать их друг с другом.
В этом мануале мы создадим мультиконтейнерную установку WordPress, где будет контейнер базы данных MySQL, веб-сервера Nginx и самого WordPress. Также мы защитим установку, получив для домена, который вы хотите связать с вашим сайтом, сертификаты TLS/SSL от Let’s Encrypt. Также мы настроим cron для обновления ваших сертификатов, чтобы домен оставался зашифрованным.
Требования
- Сервер Ubuntu 18.04, настроенный по этому мануалу.
- Установка Docker (смотрите разделы 1-2 мануала Установка и использование Docker в Ubuntu 18.04).
- Установка Docker Compose (по разделу 1 мануала Установка Docker Compose в Ubuntu 18.04).
- Зарегистрированное доменное имя. Этот мануал использует условный домен example.com, который вы должны заменить своим доменом.
- DNS-записи А для доменов example.com и www.example.com, направленные на внешний IP-адрес сервера.
1: Определение конфигурации веб-сервера
Прежде чем запускать какие-либо контейнеры, нужно определить конфигурации веб-сервера Nginx. Его конфигурационный файл будет включать в себя специальные блоки location для WordPress, а также блок location для направления запросов верификации Let’s Encrypt на клиент Certbot (для автоматического обновления сертификатов).
Сначала создайте каталог проекта для вашей установки WordPress под названием wordpress и перейдите в него:
mkdir wordpress && cd wordpress
Затем создайте каталог для конфигурационного файла:
mkdir nginx-conf
Откройте файл с помощью nano или другого редактора:
nano nginx-conf/nginx.conf
В этот файл мы поместим блок server с директивами server name и document root, а также блоки location для направления запроса клиента Certbot, обработки PHP и запросов статических активов.
Вставьте следующий код в файл. Обязательно замените example.com собственным доменным именем:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
index index.php index.html index.htm;
root /var/www/html;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
Давайте подробно разберем, какую информацию содержит блок server.
Директивы:
- listen: указывает прослушиваемый порт 80, что позволяет нам использовать плагин Certbot webroot для запросов сертификатов. Обратите внимание, порт 443 ещ ене включен – мы обновим конфигурацию, чтобы включить SSL, когда получим сертификаты.
- server_name: определяет имя вашего сервера и блок server, который должен использоваться для запросов к нему. Обязательно замените example.com в этой строке своим доменным именем.
- index: определяет файлы, которые будут использоваться в качестве индексов при обработке запросов к вашему серверу. Здесь мы изменили приоритет по умолчанию, поставив index.php перед index.html, чтобы Nginx сначала использовал файлы с именем index.php, когда это возможно.
- root: указывает корневой каталог для запросов к этому серверу. Этот каталог, /var/www/html, создается как точка монтирования во время сборки согласно инструкциям в WordPress Dockerfile. Также этот Dockerfile гарантирует, что файлы из релиза WordPress подключены к этому тому.
Блоки location:
- location ~ /.well-known/acme-challenge: этот блок будет обрабатывать запросы в каталоге .well-known, где Certbot разместит временный файл для проверки того, разрешается ли DNS вашего домена на ваш сервер. С этой конфигурацией можно использовать плагин webroot для получения сертификатов.
- location /: в этом блоке используется директиву try_files для проверки файлов, которые соответствуют отдельным запросам URI. Однако вместо статуса 404 Not Found по умолчанию сервер передаст управление в файл index.php WordPress с аргументами запроса.
- location ~ \.php$: этот блок настраивает обработку PHP и передает запросы в контейнер WordPress. Поскольку Docker образ WordPress будет основан на образе php: fpm, мы также включим в этот блок специальные параметры конфигурации для протокола FastCGI. Nginx нужен независимый PHP процессор для запросов PHP: в данном случае эти запросы будут обрабатываться процессором php-fpm, включенным в образ php: fpm. Кроме того, этот блок включает в себя специальные директивы, переменные и параметры FastCGI, которые будут проксировать запросы приложению WordPress в контейнере, устанавливать индекс для обработанного URI запроса и парсить запросы URI.
- location ~ /\.ht: этот блок будет обрабатывать файлы .htaccess, так как Nginx их не обслуживает. Директива deny_all гарантирует, что файлы .htaccess никогда не будут предоставляться пользователям.
- location = /favicon.ico, location = /robots.txt: эти блоки гарантируют, что запросы к /favicon.ico и /robots.txt не будут регистрироваться.
- location ~* \.(css|gif|ico|jpeg|jpg|js|png)$: этот блок отключает логирование для запросов статических активов и обеспечивает их высокую кэшируемость, поскольку их обслуживание обычно дорого обходится.
Читайте также: Алгоритмы выбора блоков server и location в Nginx
Сохраните и закройте файл, когда закончите редактирование. Если вы использовали nano, нажмите Ctrl+X, Y, а затем Enter.
После конфигурации Nginx вы можете перейти к созданию переменных среды, которые будут передаваться в приложение и контейнеры базы данных во время выполнения.
2: Определение переменных среды
Ваша БД и контейнеры приложений WordPress нуждаются в доступе к определенным переменным среды во время выполнения, чтобы данные приложения сохранялись и были доступны. Эти переменные должны содержать имя базы данных приложения и хоста. Они в том числе включают в себя конфиденциальную информацию: root пароль MySQL, пароль пользователя и базы данных приложения.
Вместо того чтобы указывать все эти значения в файле Docker Compose – главном файле, который содержит информацию о том, как будут работать контейнеры, – мы можем установить конфиденциальные значения в файле .env и ограничить его использование. Таким образом можно предотвратить копирование конфиденциальных данных в репозитории проектов и, следовательно, их раскрытие.
В основном каталоге проекта ~/wordpress откройте файл .env:
nano .env
Конфиденциальные значения, которые нужно указать в этом файле, включают пароль root пользователя MySQL, а также имя и пароль, которые WordPress будет использовать для доступа к базе данных.
Добавьте следующие имена переменных и значения в файл. Не забудьте указать свои собственные значения для каждой переменной:
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_USER=your_wordpress_database_user
MYSQL_PASSWORD=your_wordpress_database_password
Итак, вы указали пароль учетной записи администратора root, а также имя пользователя и пароль для БД приложения.
Сохраните и закройте файл, когда закончите редактирование.
Поскольку файл .env содержит конфиденциальную информацию, нужно обязательно включить его в файлы .gitignore и .dockerignore этого проекта (они сообщают Git и Docker, какие файлы не следует копировать в репозитории Git и образы Docker соответственно).
Читайте также: Краткий справочник по Git
Если вам нужен контроль версий Git, инициализируйте текущий рабочий каталог как репозиторий:
git init
Откройте файл .gitignore:
nano .gitignore
Добавьте в него файл .env:
.env
Сохраните и закройте файл.
Еще одна хорошая мера предосторожности – добавить .env в файл .dockerignore, чтобы он не попадал в контейнеры, когда вы используете этот каталог в качестве контекста сборки.
Откройте файл:
nano .dockerignore
Добавьте .env:
.env
Ниже можно при желании добавить файлы и каталоги, связанные с разработкой вашего приложения:
.env
.git
docker-compose.yml
.dockerignore
Сохраните и закройте файл.
После этого вы можете перейти к определению своих сервисов в файле docker-compose.yml.
3: Определение сервисов с помощью Docker Compose
Ваш файл docker-compose.yml будет содержать определения сервисов вашей установки. В Compose сервис – это работающий контейнер, а определения сервисов указывают информацию о том, как будет работать каждый контейнер.
Используя Compose, вы можете определить различные сервисы для запуска мультиконтейнерных приложений, поскольку Compose позволяет связывать эти сервисы вместе с помощью общих сетей и томов. Это полезно для нашей текущей настройки, так как мы собираемся создать отдельные контейнеры для БД, приложения WordPress и веб-сервера. Мы также создадим контейнер для запуска клиента Certbot, чтобы получить сертификаты для веб-сервера.
Для начала откройте файл docker-compose.yml:
nano docker-compose.yml
Добавьте следующий код, чтобы определить версию файла Compose и сервис базы данных db:
version: '3'
services:
db:
image: mysql:8.0
container_name: db
restart: unless-stopped
env_file: .env
environment:
- MYSQL_DATABASE=wordpress
volumes:
- dbdata:/var/lib/mysql
command: '--default-authentication-plugin=mysql_native_password'
networks:
- app-network
Определение сервиса db содержит следующие параметры:
- image: сообщает Compose, какой образ загрузить для создания контейнера. Мы закрепляем здесь mysql:8.0, чтобы избежать возможных конфликтов, так как образ mysql: latest постоянно обновляется. Для получения дополнительной информации о закреплении версий и обхода конфликтов зависимостей см. документацию Docker.
- container_name: указывает имя контейнера.
- restart: определяет политику перезапуска контейнера. По умолчанию здесь no, но мы установили перезапуск контейнера, если он не был остановлен вручную.
- env_file: добавляет переменные среды из файла.env, расположенного в контексте сборки. В этом случае контекст сборки является нашим текущим каталогом.
- environment: эта опция позволяет указывать дополнительные переменные окружения, помимо тех, которые определены в файле .env. Мы установим в переменной MYSQL_DATABASE значение wordpress, чтобы предоставить имя базы данных приложения. Поскольку это не конфиденциальная информация, ее можно включить непосредственно в файл docker-compose.yml.
- volumes: здесь монтируется именованный том dbdata в каталоге /var/lib/mysql контейнера. Это стандартный каталог данных для MySQL в большинстве дистрибутивов.
- command: эта опция указывает команду для переопределения инструкции CMD по умолчанию для образа. В нашем случае нужно добавить параметр в стандартную команду mysqld образа Docker, которая запускает сервер MySQL в контейнере. Эта опция, –default-authentication-plugin=mysql_native_password, устанавливает для системной переменной –default-authentication-plugin значение mysql_native_password, указывая, какой механизм аутентификации должен управлять новыми запросами входа. Эту настройку нужно добавить для аутентификации пользователя БД, поскольку PHP и, следовательно, образ WordPress не поддерживают более новую аутентификацию MySQL по умолчанию.
- networks: указывает, что сервис приложений присоединится к сети app-network, которую мы определим в конце файла.
Под сервисом db укажите определение сервиса приложения wordpress.
...
wordpress:
depends_on:
- db
image: wordpress:5.1.1-fpm-alpine
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=$MYSQL_USER
- WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
- WORDPRESS_DB_NAME=wordpress
volumes:
- wordpress:/var/www/html
networks:
- app-network
В этом определении мы называем контейнер и определяем политику перезапуска, как делали это в сервисе db. Мы также добавляем некоторые индивидуальные параметры для этого контейнера:
- depends_on: эта опция запускает контейнеры в порядке зависимости, то есть контейнер wordpress будет запускаться после контейнера db. Приложение WordPress зависит от базы данных и пользователя, поэтому выражение этого порядка позволит ему правильно запускаться.
- image: здесь мы используем образ WordPress 5.1.1-fpm-alpine. Как обсуждалось в разделе 1, благодаря этому образу приложение будет иметь процессор php-fpm, необходимый Nginx для обработки PHP. Это также образ alpine, полученный из проекта Alpine Linux, а это поможет уменьшить общий размер образа. За дополнительной информацией о преимуществах и недостатках использования образов alpine обращайтесь к обсуждению Image Variants на странице образов WordPress в Docker Hub.
- env_file: позволяет извлечь значения из файла .env, поскольку именно здесь мы определили пользователя и пароль базы данных приложения.
- environment: здесь мы используем значения, которые определили в файле .env, но присваиваем их переменным, которые нужны образу WordPress: WORDPRESS_DB_USER и WORDPRESS_DB_PASSWORD. Мы также определяем WORDPRESS_DB_HOST, это сервер MySQL, работающий в контейнере db, который доступен по порту MySQL по умолчанию, 3306. Значение WORDPRESS_DB_NAME должно совпадать со значением, которое вы указали в определении сервиса MySQL для MYSQL_DATABASE: wordpress.
- volumes: монтирует именованный том под названием wordpress в точку /var/www/html, созданную образом WordPress. Использование именованного тома позволит нам делиться кодом приложения с другими контейнерами.
- networks: мы также добавляем контейнер WordPress в сеть app-network.
Далее, под определением сервиса wordpress добавьте следующее определение для сервиса веб-сервера Nginx:
...
webserver:
depends_on:
- wordpress
image: nginx:1.15.12-alpine
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
volumes:
- wordpress:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- app-network
Опять же, здесь мы называем контейнер и делаем его зависимым от контейнера WordPress в порядке запуска. Мы также используем образ alpine – 1.15.12-alpine.
Это определение сервиса также включает следующие опции:
- ports: открывает порт 80 для включения параметров конфигурации, которые мы определили в файле nginx.conf в разделе 1.
- volumes: здесь мы определяем комбинацию именованных томов и привязок:
- wordpress:/var/www/html: это смонтирует код приложения WordPress в каталог /var/www/html, каталог, который мы установили в качестве root в блоке server.
- ./nginx-conf:/etc/nginx/conf.d: свяжет монтирование каталога конфигурации Nginx на хосте с соответствующим каталогом в контейнере, благодаря чему любые изменения в файлах на хосте будут отражены в контейнере.
- certbot-etc:/etc/letsencrypt: смонтирует соответствующие сертификаты и ключи Let’s Encrypt для нашего домена в соответствующий каталог на контейнере.
Снова этот контейнер добавляется в сеть app-network.
Под определением webserver добавьте последнее определение сервиса для certbot. Обязательно замените адрес электронной почты и указанные здесь доменные имена своей собственной информацией:
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- wordpress:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email 8host@example.com --agree-tos --no-eff-email --staging -d example.com -d www.example.com
Это определение извлекает образ certbot/certbot из Docker Hub. Оно также привлекает именованные тома для совместного использования ресурсов с контейнером Nginx (сертификаты домена и ключ в certbot-etc и код приложения в wordpress).
Опять же, мы использовали depends_on, чтобы указать, что контейнер certbot должен запускаться только после запуска сервиса webserver.
Мы также включили параметр command, он задает подкоманду, которую нужно запустить с помощью команды certbot контейнера по умолчанию. Подкоманда certonly получит сертификат со следующими параметрами:
- –webroot: использует плагин webroot для размещения файлов в папке webroot. Этот плагин зависит от метода проверки HTTP-01. Он использует HTTP-запрос, чтобы подтвердить, что Certbot может получить доступ к ресурсам с сервера, который отвечает на данное доменное имя.
- –webroot-path: указывает путь к каталогу webroot.
- –email: адрес электронной почты для регистрации и восстановления.
- –agree-tos: означает, что вы принимаете Соглашение подписчика ACME.
- –no-eff-email: не позволяет Certbot делиться вашей электронной почтой с Electronic Frontier Foundation (EFF). Этот параметр можно удалить, если он вам не нужен.
- –staging: использует промежуточную среду Let’s Encrypt для получения тестовых сертификатов. Использование этого параметра позволяет протестировать параметры конфигурации и избежать возможных ограничений на количество запросов домена. Для получения дополнительной информации об этих ограничениях см. документацию по ограничениям Let’s Encrypt.
- -d: позволяет указать доменные имена, которые вы хотите прикрепить к вашему запросу сертификата. В данном случае мы включили example.com и www.example.com. Обязательно замените их своим собственным доменом.
После сервиса certbot добавьте определение сети и тома:
...
volumes:
certbot-etc:
wordpress:
dbdata:
networks:
app-network:
driver: bridge
Ключ верхнего уровня volumes определяет тома certbot-etc, wordpress и dbdata. Когда Docker создает тома, содержимое тома сохраняется в каталоге в файловой системе хоста Docker, /var/lib/docker/volumes/. Содержимое каждого тома затем монтируется из этого каталога в любой контейнер, использующий соответствующий том. Таким образом можно обмениваться кодом и данными между контейнерами.
Пользовательская мостовая сеть app-network обеспечивает связь между контейнерами, поскольку они находятся на одном хосте Docker. Это оптимизирует трафик и обмен данными внутри приложения, поскольку оно открывает все порты между контейнерами в одной и той же мостовой сети, при этом не открывая никаких портов для внешнего мира. Контейнеры db, wordpress и webserver могут взаимодействовать друг с другом, нужно только предоставить порт 80 для внешнего доступа к приложению.
Готовый файл docker-compose.yml будет выглядеть так:
version: '3'
services:
db:
image: mysql:8.0
container_name: db
restart: unless-stopped
env_file: .env
environment:
- MYSQL_DATABASE=wordpress
volumes:
- dbdata:/var/lib/mysql
command: '--default-authentication-plugin=mysql_native_password'
networks:
- app-network
wordpress:
depends_on:
- db
image: wordpress:5.1.1-fpm-alpine
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=$MYSQL_USER
- WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
- WORDPRESS_DB_NAME=wordpress
volumes:
- wordpress:/var/www/html
networks:
- app-network
webserver:
depends_on:
- wordpress
image: nginx:1.15.12-alpine
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
volumes:
- wordpress:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- app-network
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- wordpress:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email 8host@example.com --agree-tos --no-eff-email --staging -d example.com -d www.example.com
volumes:
certbot-etc:
wordpress:
dbdata:
networks:
app-network:
driver: bridge
Сохраните и закройте файл.
4: Получение сертификатов SSL
Мы можем запустить контейнеры с помощью команды docker-compose up, которая создаст и запустит их в указанном нами порядке. Если запросы сертификата для домена будут выполнены успешно, мы увидим соответствующий статус в выходных данных и сами сертификаты, смонтированные в /etc/letsencrypt/live контейнера webserver.
Создайте контейнеры с помощью docker-compose up и флага -d, который запустит контейнеры db, wordpress и webserver в фоновом режиме:
docker-compose up -d
Вы увидите вывод, подтверждающий, что сервисы были созданы:
Creating db ... done
Creating wordpress ... done
Creating webserver ... done
Creating certbot ... done
Используя docker-compose ps, проверьте статус сервисов:
docker-compose ps
Если все прошло успешно, сервисы db, wordpress и webserver будут активированы, и контейнер certbot завершит работу и выведет сообщение о статусе 0:
Name Command State Ports
-------------------------------------------------------------------------
certbot certbot certonly --webroot ... Exit 0
db docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp
webserver nginx -g daemon off; Up 0.0.0.0:80->80/tcp
wordpress docker-entrypoint.sh php-fpm Up 9000/tcp
Если в столбце State сервисов db, wordpress или webserver вы видите не Up, а другое значение, или статус выхода контейнера certbot отличается от 0, обязательно проверьте логи сервисов с помощью команды docker-compose logs:
docker-compose logs service_name
Теперь можно убедиться, что сертификаты в контейнере webserver были смонтированы, с помощью docker-compose exec:
docker-compose exec webserver ls -la /etc/letsencrypt/live
Если ваши запросы на сертификат были обработаны успешно, вы увидите подобный вывод:
total 16
drwx------ 3 root root 4096 May 10 15:45 .
drwxr-xr-x 9 root root 4096 May 10 15:45 ..
-rw-r--r-- 1 root root 740 May 10 15:45 README
drwxr-xr-x 2 root root 4096 May 10 15:45 example.com
Теперь, когда вы знаете, что ваш запрос на сертификаты был принят, вы можете отредактировать определение сервиса certbot и убрать флаг –staging.
Откройте docker-compose.yml:
nano docker-compose.yml
Найдите раздел с определением сервиса certbot и замените флаг –staging в опции command на флаг –force-renewal. С его помощью Certbot сможет запросить новый сертификат для тех же доменов, что и действующий сертификат. Определение certbot теперь будет выглядеть так:
...
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- certbot-var:/var/lib/letsencrypt
- wordpress:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email 8host@example.com --agree-tos --no-eff-email --force-renewal -d example.com -d www.example.com
...
Теперь вы можете запустить docker-compose для воссоздания контейнера certbot. Мы также включим параметр –no-deps, чтобы Compose мог пропустить запуск сервиса webserver, поскольку он уже запущен:
docker-compose up --force-recreate --no-deps certbot
Вы увидите вывод, указывающий, что ваш запрос сертификата был успешно обработан:
Recreating certbot ... done
Attaching to certbot
certbot | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot | Plugins selected: Authenticator webroot, Installer None
certbot | Renewing an existing certificate
certbot | Performing the following challenges:
certbot | http-01 challenge for example.com
certbot | http-01 challenge for www.example.com
certbot | Using the webroot path /var/www/html for all unmatched domains.
certbot | Waiting for verification...
certbot | Cleaning up challenges
certbot | IMPORTANT NOTES:
certbot | - Congratulations! Your certificate and chain have been saved at:
certbot | /etc/letsencrypt/live/example.com/fullchain.pem
certbot | Your key file has been saved at:
certbot | /etc/letsencrypt/live/example.com/privkey.pem
certbot | Your cert will expire on 2019-08-08. To obtain a new or tweaked
certbot | version of this certificate in the future, simply run certbot
certbot | again. To non-interactively renew *all* of your certificates, run
certbot | "certbot renew"
certbot | - Your account credentials have been saved in your Certbot
certbot | configuration directory at /etc/letsencrypt. You should make a
certbot | secure backup of this folder now. This configuration directory will
certbot | also contain certificates and private keys obtained by Certbot so
certbot | making regular backups of this folder is ideal.
certbot | - If you like Certbot, please consider supporting our work by:
certbot |
certbot | Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
certbot | Donating to EFF: https://eff.org/donate-le
certbot |
certbot exited with code 0
Получив необходимые сертификаты, вы можете перейти к отладке конфигурации Nginx для поддержки SSL. Об этом мы поговорим в следующей части этой серии мануалов.
Tags: DNS, Docker, Docker Compose, Ubuntu 18.04, WordPress