[Из песочницы] Настройка автоматического получения сертификатов letsencrypt с помощью docker в linux

habr.png

Менял недавно виртуальный сервер, и пришлось настраивать все заново. Я предпочитаю, чтобы сайт был доступен по https и сертификаты letsencrypt получались и продлевались автоматически. Этого можно добиться, если использовать два образа docker nginx-proxy и nginx-proxy-companion.

Это руководство как настроить сайт на docker, с прокси, которое автоматически получает SSL сертификаты. Используется виртуальный сервер CentOS 7.

Я предполагаю, что сервер уже куплен, настроен, вход на него осуществляется по ключу, установлен fail2ban и т.д.

Для начала нужно установить docker.


  1. Сначала нужно установить зависимости
    $ sudo yum install -y yum-utils  device-mapper-persistent-data lvm2
    
  2. Подключить репозиторий
    $ sudo yum-config-manager  --add-repo  https://download.docker.com/linux/centos/docker-ce.repo
    
  3. Потом установить докер community edition
    $ sudo yum install docker-ce docker-ce-cli containerd.io
    
  4. Добавить docker в автозагрузку и запустить
    $ sudo systemctl enable docker
    $ sudo systemctl start docker
    
  5. Добавить пользователя в группу docker, для того, чтобы получить возможность запускать docker без sudo
    $ usermod -aG docker user
    

Следующий шаг — установить docker-compose. Утилиту можно установить несколькими путями, но я предпочитаю устанавливать через pip менеджер и virtualenv, чтобы не засорять систему лишними пакетами.


  1. Установить pip
    $ sudo yum install python-pip
    
  2. Установить virtualenv
    $ pip install virtualenv
    
  3. Дальше нужно создать папку с проектом и инициализировать ее. Папка со всем нужным для управления пакетами будет называться ve.
    $ mkdir docker
    $ cd docker
    $ virtualenv ve
    
  4. Чтобы начать пользоваться виртуальным окружением нужно выполнить следующую команду в папке с проектом.
    $ source ve/bin/activate
    
  5. Можно устанавливать docker-compose.
    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
    

© Habrahabr.ru