Traefik — Docker + ACME HTTP-01 Let’s Encrypt

Требование:
  • Нода с установленным Docker'ом
  • Прямой доступ в интернет, или же возможность настроить проброс
  • Доменное имя

В моем примере будет использоваться доменное имя "artem.services", на основе его будут создаваться субдоменны.

Создадим запись Type A субдоммену "traefik.artem.services" и направим его на нашу ноду.

Пример ниже будет приведен на Docker-Compose, это не является необходимым, просто для удобства. Если Compose не установлен, установим его:

DEB системы:

apt install -y docker-compose

RPM системы:

yum install -y docker-compose

Посмотрим список сетей Docker'а:

docker network ls

Создадим сеть для Traefik'а:

docker network create proxy

Убедимся, что сеть создалась:

docker network ls

 

Дальше нам нужно будет сгенерировать пароль для дашборда Traefik'а, для этого нам понадобится пакет "htpasswd":

DEB системы:

apt install -y apache2-utils

RPM системы:

yum install -y httpd-tools

Для примера генерируем для пользователя "admin", пароль "admin":

htpasswd -nb admin admin
admin:$apr1$1d8fOToA$1XJ/7tNFiZdg0MJrD7GQM/

Результат команды сохраним себе, он нам понадобится.

 

Создадим директорию для Traefik контейнера:

mkdir -p traefik/
cd traefik/

Создадим файл "trafiek.toml" со следующим содержимым:

cat > traefik.toml << EOF
#Traefik Global Configuration
debug = false
checkNewVersion = true
logLevel = "ERROR"

#Define the EntryPoint for HTTP and HTTPS
defaultEntryPoints = ["https","http"]

#Enable Traefik Dashboard on port 8080
#with basic authentication method
#login and password
[web]
address = ":8080"
[web.auth.basic]
users = ["admin:$apr1$1d8fOToA$1XJ/7tNFiZdg0MJrD7GQM/"]

#Define the HTTP port 80 and
#HTTPS port 443 EntryPoint
#Enable automatically redirect HTTP to HTTPS
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]

#Enable retry sending a request if the network error
[retry]

#Define Docker Backend Configuration
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "traefik.artem.services"
watch = true
exposedbydefault = false

#Letsencrypt Registration
#Define the Letsencrypt ACME HTTP challenge
[acme]
email = "[email protected]"
storage = "acme.json"
entryPoint = "https"
OnHostRule = true
[acme.httpChallenge]
entryPoint = "http"
EOF

Не забываем пометь пользователя/пароль, на том, который сгенерировали. А так же доменное имя и почтовый ящик.

Создаем "docker-compose.yml":

cat > docker-compose.yml << EOF
version: '3'

services:
  traefik:
    image: traefik:latest
    command: --docker --docker.domain=traefik.artem.services
    ports:
      - 80:80
      - 443:443
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/traefik.toml
      - ./acme.json:/acme.json
    labels:
      - "traefik.frontend.rule=Host:dash.traefik.artem.services"
      - "traefik.port=8080"
    container_name: traefik
    restart: always

networks:
  proxy:
    external: true
EOF

Создадим файл для Let's Encrypt'а:

touch acme.json
chmod 600 acme.json

Создаем контейнер:

docker-compose up -d

Проверяем статус контейнера:

docker-compose ps

(!) Команды выше выполняются в директории, где находится файл "docker-compose.yml"

Откроем браузер и перейдем по ссылке

traefik.artem.services

Вас перенаправит с 80-го порта, на 443-ий. Если сделали все правильно, то на этот домен уже будет валидный SSL сертификат.
Введя логин/пароль который генерировали, попадем в дашборд Traefik'а.

Для проверки работы Traefik'а поднимем еще один контейнер.

Создадим поддомен "wordpress.artem.services" и направим его на наш Traefik.

Создадим директорию для Docker-Compose файла:

mkdir wordpress
cd wordpress

Создадим файл Docker-Compose:


cat > docker-compose.yml << EOF
version: '3'

services:
  wordpress:
    image: wordpress:latest
    environment:
      WORDPRESS_DB_HOST: "mysql"
      WORDPRESS_DB_USER: "wordpress"
      WORDPRESS_DB_PASSWORD: "wordpress"
      WORDPRESS_DB_NAME: "wordpress"
    labels:
      - traefik.backend=wordpress
      - traefik.frontend.rule=Host:wordpress.artem.services
      - traefik.docker.network=proxy
      - traefik.port=80
    restart: always
    networks:
      - proxy
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    restart: always
    networks:
      - proxy
    labels:
      - traefik.enable=false

networks:
  proxy:
    external: true
EOF

Создадим контейнер:

docker-compose up -d

Откроем в браузере ссылку:

wordpress.artem.serves

Должен открыться сайт уже с подписанным SSL сертификатом.

0 0 vote
Article Rating

Метки: Метки

Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments