Настройка автоматического получения сертификатов letsencrypt с помощью docker в linux
Менял недавно виртуальный сервер, и пришлось настраивать все заново. Я предпочитаю, чтобы сайт был доступен по https и сертификаты letsencrypt получались и продлевались автоматически. Этого можно добиться, если использовать два образа docker nginx-proxy и nginx-proxy-companion.
Это руководство как настроить сайт на docker, с прокси, которое автоматически получает SSL сертификаты. Используется виртуальный сервер CentOS 7.
Я предполагаю, что сервер уже куплен, настроен, вход на него осуществляется по ключу, установлен fail2ban и т.д.
Для начала нужно установить docker.
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager —add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
$ sudo systemctl enable docker
$ sudo systemctl start docker
$ usermod -aG docker user
Следующий шаг — установить docker-compose. Утилиту можно установить несколькими путями, но я предпочитаю устанавливать через pip менеджер и virtualenv, чтобы не засорять систему лишними пакетами.
$ sudo yum install python-pip
$ pip install virtualenv
$ mkdir docker
$ cd docker
$ virtualenv ve
$ source ve/bin/activate
pip install docker-compose
Для того, чтобы контейнеры видели друг друга, создадим сеть. По умолчанию используется драйвер bridge.
$ docker network create network
Дальше нужно настроить docker-compose, proxy будет лежать в папке proxy, тестовый сайт в папке test. Для примера я использую доменное имя example.com
$ mkdir proxy
$ mkdir test
$ touch proxy/docker-compose.yml
$ touch test/docker-compose.yml
Содержимое proxy/docker-compose.yml
version: ‘3’
networks:
default:
external:
name: network
services:
nginx-proxy:
container_name: nginx-proxy
image: jwilder/nginx-proxy
ports:
— 80:80
— 443:443
volumes:
— certs:/etc/nginx/certs
— vhost.d:/etc/nginx/vhost.d
— html:/usr/share/nginx/html
— /var/run/docker.sock:/tmp/docker.sock:ro
nginx-proxy-letsencrypt:
container_name: nginx-proxy-letsencrypt
image: jrcs/letsencrypt-nginx-proxy-companion
volumes:
— certs:/etc/nginx/certs
— vhost.d:/etc/nginx/vhost.d
— html:/usr/share/nginx/html
— /var/run/docker.sock:/var/run/docker.sock:ro
environment:
— NGINX_PROXY_CONTAINER=nginx-proxy
volumes:
certs:
vhost.d:
html:
Переменная окружения NGINX_PROXY_CONTAINER нужна, чтобы letsencrypt контейнер увидел proxy контейнер. Папки /etc/nginx/certs /etc/nginx/vhost.d и /usr/share/nginx/html должны совместно использоваться и тем и другим контейнером. Для корректной работы letsencrypt контейнера приложение должно быть доступно и по 80 и по 443 порту.
Содержимое test/docker-compose.yml
version: ‘3’
networks:
default:
external:
name: network
services:
nginx:
container_name: nginx
image: nginx:latest
environment:
— VIRTUAL_HOST=example.com
— LETSENCRYPT_HOST=example.com
— LETSENCRYPT_EMAIL=admin@example.com
Здесь переменные окружения нужны, чтобы прокси корректно обрабатывал запрос к серверу, и запросил сертификат на правильное доменное имя.
Осталось только запустить docker-compose
$ cd proxy
$ docker-compose up -d
$ cd ../test
$ docker-compose up -d