...
Все для домашнего медиа - Отзывы | Советы по покупке | Дизайн | Новости технологий

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

4 334
Содержание
Конфигурация Traefik 2

Обратный прокси-сервер Traefik 2 с сервисами LetsEncrypt и OAuth for Docker может быть довольно сложным. В этом подробном руководстве по Docker показано, как настроить домашний сервер Docker с Traefik 2, LetsEncrypt и OAuth.

Прежде всего, читателям нашего медиа-сервера Docker, учебника Traefik 1 и руководств Traefik Google OAuth, я прошу прощения за задержку. Это руководство давно назрело, и я знаю, что тысячи из вас с нетерпением ждали этого обновления.

Примечание. Соавтором этого поста являются Ананд и Сет.

Мы собираемся охватить почти все, что нужно для настройки домашнего сервера Docker с Traefik 2, SSL-сертификатами LetsEncrypt и Google OAuth для обеспечения безопасности. Однако часто мы отсылаем вас к моим предыдущим руководствам для чтения, чтобы не сделать это руководство слишком длинным.

Этот стек Traefik 2 Docker Home Server является ключевым компонентом моей системы умного дома. Итак, без дальнейших задержек, давайте начнем с руководства по серверу Traefik 2 Docker Home.

Существует более одного способа снять шкуру с этой (Docker Traefik 2) кошки, и мы ни в коем случае не являемся экспертами. Как всегда, моя цель – поделиться тем, что я узнал, чтобы другие могли успешно повторить то, что я сделал. Если у вас есть лучшие идеи, не стесняйтесь поделиться в комментариях.

Цели этой настройки сервера Traefik 2 Docker Home

Мои цели для этой настройки остаются почти такими же, как объясненные в моем первоначальном руководстве по медиа-серверу Docker, с небольшими изменениями.

Одна из больших задач полностью автоматизированного медиа-сервера – агрегация медиа. Например, когда эпизод телешоу станет доступен, автоматически загрузите его, соберите его постер, фан-арт, субтитры и т.д., Поместите их в папку по вашему выбору (например, в папке ТВ-шоу), обновите медиатеку (например, на Jellyfin, Emby или Plex ), а затем отправьте вам уведомление (например, по электронной почте, с помощью мобильного уведомления и т. д.) о том, что ваш эпизод готов к просмотру.

Звучит здорово, правда?

Есть несколько приложений, которые могут выполнять такие задачи, и мы собрали их в нашем списке лучших приложений для домашнего сервера.

Вот краткое описание некоторых приложений, которые я хотел, чтобы мой домашний сервер Docker работал:

  • Фронтенды : Трафик, Портейнер, Организр, Хеймдалль
  • Умный дом: HA-Dockermon, Mosquitto MQTT Broker, ZoneMinder, MiFlora Plant Sensors
  • Базы данных: MariaDB, phpMyAdmin, InfluxDB, Postgres, Графана
  • Загрузчики: загрузчик, передача Bittorrent с VPN, SABnzbd, qBittorrent с VPN
  • Индексаторы: NZBHydra2, Jackett
  • PVR: Lidarr, Radarr, Sonarr, LazyLibrarian
  • Медиа-серверы: Airsonic, Plex, Emby, Jellyfin, Ombi, Tautulli, PhotoShow, Caliber и другие
  • Управление медиа-файлами: Bazarr, Picard, Handbrake, MKVToolNix, MakeMKV, FileBot и другие
  • Системные утилиты: Firefox, Glances, APCUPSD, Logarr, Guacamole, Dozzle, qDirStat, StatPing, SmokePing и другие.
  • Техническое обслуживание: Уроборос и Докер-ГК

Раньше я тоже запускал Home Assistant на Docker, но теперь перешел на HASSio на Docker. Актуальный список приложений, которые я запускаю, используя настройки Docker Traefik 2, см. В моем репозитории GitHub.

В дополнение к целям, перечисленным в моем исходном сообщении о сервере мультимедиа Docker, я хочу, чтобы в настройке Traefik 2 Docker Home Server было предложено следующее:

  • Предоставление услуг базы данных для всех других приложений для использования
  • Предоставьте такие утилиты, как VNC, RDP, SSH, удаленный доступ к файлам, мониторинг служб и многое другое, чтобы упростить мою жизнь
  • Обеспечьте безопасный доступ ко всем приложениям через Интернет без необходимости перенаправления портов на маршрутизаторе.
  • Предложите простой способ доступа к приложениям, используя удобные доменные имена вместо портов
  • Предложите более высокий уровень безопасности, так как приложения будут доступны в Интернете.

Это может показаться сложной настройкой, но, поверьте мне, докер с Docker Compose может упростить установку и обслуживание приложений для домашнего сервера. [ Читать: 9 Лучшие варианты программного обеспечения музыкального сервера: Создайте свой собственный Spotify ]

Требования к этой настройке Docker Traefik 2

Перед продолжением работы с этим учебным пособием по Docker необходимо выполнить несколько требований по настройке микросервисов за обратным прокси-сервером Traefik.

1. Домашний сервер

Домашний медиа-сервер – это сервер, расположенный в вашей домашней сети, который выступает в качестве центрального устройства хранения и обслуживания данных. Как правило, домашний сервер всегда включен, имеет тонны памяти и готов к обслуживанию файлов (включая носители), когда возникает необходимость.

Мы подробно рассмотрели несколько тем о домашних серверах в приведенных выше постах. Для некоторых дополнительных сборок домашнего сервера я предлагаю следующие посты:

Рекомендуемые сборки HTPC / Home Server:

2. Операционная система

После того, как вы выяснили аппаратное обеспечение, следующий большой вопрос – это операционная система. На мой взгляд, Linux – лучшая операционная система, на которой можно построить домашний медиа-сервер. [ Читать: 10 лучших дистрибутивов Linux Home Server – стабильность, производительность, простота использования ]

Мы всегда рекомендовали Ubuntu Server, а точнее LTS (Long Term Support Releases), которые поддерживаются в течение 5 лет. Собрав свой сервер, вы можете позволить ему работать в течение 5 лет со всеми обновлениями безопасности от команды Ubuntu.

В прошлом году я перешел с Ubuntu Server на Linux Mint на домашнем сервере Intel NUC. Docker сделал переход с Sever Edition (Ubuntu) на Desktop Edition (Linux Mint) очень простым.

Все, что мне нужно было сделать, это установить Linux Mint, установить Docker и Docker Compose и запустить стек. Все мои приложения подошли прямо. [ Читать: Переход с домашнего сервера на NAS (Synology) – почему, уроки и советы ]

Мы протестировали это руководство как на Ubuntu Server 18.04 LTS, так и на Linux Mint 19.1. Следующий долгосрочный релиз 20.04 Focal Fossa не за горами. Мы обновим это руководство вскоре после его выпуска.

Сказав вышесказанное, это руководство по домашнему серверу Traefik v2 Docker можно использовать в любой операционной системе, в которой можно запустить Docker. Это включает даже сетевые устройства хранения данных, такие как Synology. Мы успешно протестировали это руководство на моем Synology DS918 + с помощью Docker и Docker Compose (мы обсудим это в отдельном руководстве).

3. Доменное имя

В моем руководстве по Traefik 1 я обсуждал тему «Динамический DNS против вашего собственного доменного имени».

С бесплатными сервисами динамического DNS (DuckDNS, Afraid.org и т.д.) Вам придется использовать структуру URL подкаталога (если вы хотите, чтобы все было удобно / просто). С другой стороны, наличие собственного доменного имени дает гораздо больше гибкости и конфиденциальности.

Частное доменное имя стоит около $ 7.XX в год с Cloudflare, и я настоятельно рекомендую это. Для простоты мы пишем это руководство для частных доменных имен.

Если у вас есть бесплатный динамический DNS с DuckDNS или Afraid.org, вам придется объединить то, что представлено в этом руководстве по Docker Traefik, с моим предыдущим руководством по Traefik 1, чтобы придумать ярлыки Docker Compose.

4. Правильные записи DNS

В дополнение к частному доменному имени у вас должны быть правильные записи DNS с вашим регистратором домена.

Мой DNS-провайдер – Cloudflare, который протестирован и проверен на работу с подстановочными сертификатами Traefik LetsEncrypt. Если ваш DNS-провайдер не указан в списке поддерживаемых, я рекомендую перевести ваш DNS на Cloudflare, который является удивительно быстрым и бесплатным. [ Обязательно для чтения: настройки Cloudflare для Traefik Docker: DDNS, CNAMEs и твики ]

В Cloudflare вы должны указать свой корневой домен (example.com) на ваш WAN IP, используя запись A. Затем добавьте подстановочный знак CNAME (* .example.com) или отдельные субдомены, указывающие на корневой домен (@ для хоста), как показано ниже (для этого не требуется платная учетная запись).

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Cloudflare DNS Записи для Traefik 2 DNS Challenge

Обратите внимание, что на данный момент обе записи «затуманены серым» и не будут использовать прокси-функции Cloudflare. Прокси, подстановочный знак CNAME не разрешен в бесплатном плане Cloudflare. Чтобы воспользоваться всеми преимуществами бесплатного плана Cloudflare, включая функцию прокси-сервера (оранжевое облако), которая повышает безопасность и производительность, обязательно следуйте моим настройкам Cloudflare для Traefik.

В дополнение к созданию записей DNS, вам придется настроить параметры SSL Cloudflare, чтобы избежать неопределенных перенаправлений. Перейдите в настройки SSL / TLS для домена и измените SSL на Полный, как показано ниже.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Cloudflare «Полный» SSL для настройки Traefik 2 Docker

Примечание. Возможно, вам придется подождать несколько минут для распространения записей DNS. Если вы запустите Traefik до этого, вызов DNS может завершиться неудачно, и сертификат SSL не будет сгенерирован. Если вы продолжите пытаться, Let’s Encrypt может временно заблокировать вас за достижение лимита запросов. Чтобы противостоять этому, я предлагаю использовать промежуточный сервер LetsEncrypt для первоначальной проверки и тестирования, как будет объяснено позже в этом руководстве по докерскому трафику.

5. Переадресация портов для Traefik 2.0

Наконец, вам нужно включить переадресацию портов на вашем маршрутизаторе или шлюзе.

Обратный прокси-сервер Traefik использует порты 80 и 443. Трафик, полученный на эти порты из Интернета, должен перенаправляться на внутренний / локальный IP-адрес узла докера, на котором запущена служба Traefik 2.

Настройка Docker

Следующий большой компонент – Docker. Если вы следовали нашему предыдущему руководству по медиа-серверу Docker, большая часть этой темы должна быть рассмотрена. Однако за последние два года с момента публикации нашего руководства мы внесли несколько незначительных изменений и улучшений.

Для большей части деталей мы отошлем вас к нашему оригинальному сообщению. Мы выделим некоторые ключевые улучшения и различия и здесь.

Что такое Докер?

Мы уже рассмотрели, что такое Docker и как он сравнивается с виртуальной машиной, такой как VirtualBox. Кроме того, краткий обзор докера был представлен в моем предыдущем руководстве.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Docker против виртуальных машин от Docker

Docker позволяет устанавливать приложения в виде контейнеров, которые изолированы от операционных систем хоста. Но контейнеры разделяют системные ресурсы. Виртуализация (например, VirtualBox, VMware и т.д. ), С другой стороны, запускает изолированные «полные» системы, каждая из которых требует своего обслуживания.

Docker позволяет создавать и уничтожать приложения за считанные секунды, не связываясь с хост-системой. Контейнеры также загружаются за считанные секунды, поэтому ваше приложение готово к работе очень быстро.

Рекомендуемые руководства:

Что такое Docker Compose?

Compose – это инструмент для создания списка всех контейнеров (вместе с их конфигурацией), которые вы хотите запустить. Это написано на YAML. Контейнеры Docker могут быть созданы из командной строки с помощью различных команд. Docker-compose делает это еще проще.

Когда у вас есть готовый файл композиции, с помощью одной команды вы можете сразу создавать, запускать или останавливать приложения.

Docker также делает приложения более переносимыми. Когда я перешел с моего предыдущего Домашнего сервера на Intel NUC, я начал работать на моем новом сервере с более чем 50 приложениями менее чем за 15 минут.

В этом руководстве по Docker Traefik 2 мы будем использовать Docker Compose для создания нашего домашнего сервера Docker Traefik.

Зачем использовать Docker для настройки домашнего сервера?

Традиционный способ построения домашнего сервера включает настройку операционной системы, добавление репозиториев, загрузку приложений, установку предварительных требований / зависимостей, установку приложения и настройку приложения. Это громоздко и не переносимо.

Мы создали AtoMiC ToolKit, который автоматизирует установку и обслуживание приложений домашнего сервера в Linux. Но Docker делает все настолько просто, что мы отказались от AtoMiC ToolKit и перешли к Docker и Docker Compose.

В Docker можно легко устанавливать приложения для домашнего сервера, такие как Sonarr, Radarr, Plex и т.д., Не беспокоясь о предварительных требованиях или несовместимости. Все требования уже предварительно упакованы с изображениями каждого контейнера.

Большинство известных приложений уже находятся в контейнере сообщества Docker и доступны через Docker Hub.

ВНИМАНИЕ: Убедитесь, что вы используете образ контейнера из надежного источника в целях безопасности. Изображения с уязвимостями могут поставить под угрозу вашу систему.

Установите Docker и Docker Compose

Docker доступен для Linux, Mac OS и Windows 10. Ранее мы рассмотрели различные процедуры установки Docker и Docker Compose:

Вот некоторые дополнительные ресурсы для различных операционных систем:

Вы должны запустить Docker и Docker Compose, прежде чем двигаться дальше с этим руководством по Docker Traefik v2.

Конфигурация Docker

Для запуска команд Docker в Linux требуется sudo, другими словами, повышение прав администратора. Вы можете обойти это, добавив пользователя Linux (себя) в группу Docker, как описано в моем первоначальном руководстве по Docker.

Некоторые считают, что добавление себя в группу Docker представляет угрозу безопасности. Это правда, но риск значительно снижается благодаря вниманию и использованию доверенных контейнеров.

Создание корневой папки Docker и установка разрешений

Если вы следовали моим предыдущим руководствам докера, то у вас уже должен быть следующий каталог в системах Linux. Это будет наша корневая папка докера :

/home/USER/docker

USER – это ваше имя пользователя. Если нет, то давайте создадим эту папку (в которой будут храниться все ваши данные служб Docker и файлы .yml) с помощью следующей команды:

mkdir ~/docker

Далее, давайте настроим соответствующие разрешения для папки Docker, чтобы избежать проблем с разрешениями. Используйте следующие команды в последовательности:

sudo setfacl -Rdm g:docker:rwx ~/docker sudo chmod -R 775 ~/docker

Приведенная выше команда заставляет любые новые подпапки в папке докера наследовать разрешения из папки докера. Некоторые могут не согласиться с приведенными выше либеральными разрешениями, но, опять же, это для домашнего использования и достаточно ограничительно.

Настройка переменных среды для Docker и Docker Compose

Мы собираемся разместить некоторую часто используемую информацию в общем месте и вызывать ее по мере необходимости, используя имена переменных. Вот что означает настройка переменных среды в простых терминах.

В моих предыдущих руководствах по Docker и Traefik v1 эта информация помещалась в файл / etc / environment. Это потребовало выхода и входа в систему, чтобы вступить в силу.

В этом новом руководстве по Docker Traefik 2.0 мы собираемся пойти другим путем. Все переменные среды будут помещены в файл .env, который будет расположен в корневой папке докера, созданной на предыдущем шаге.

Создайте файл .env (Примечание: точка впереди не является опечаткой) в корневой папке докера (/home/USER/docker/.env) и добавьте в нее следующие переменные среды:

PUID=1000 PGID=140 TZ="America/New_York" USERDIR="/home/USER"

Заменить / Настроить:

  1. PUID и PGID – идентификатор пользователя linux, от которого мы хотим запускать приложения домашнего сервера, и идентификатор группы докера. Оба из них могут быть получены с помощью команды id, как показано ниже.

    Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

    Идентификатор пользователя и идентификатор группы

    В этом руководстве мы собираемся использовать 1000 для PUID, который является идентификатором пользователя для пользователя, и 140, который является идентификатором группы для группы Docker.

  2. TZ – часовой пояс, который вы хотите установить для своих контейнеров. Получите ваш TZ из этой базы данных часовых поясов.

  3. USERDIR – путь к домашней папке текущего пользователя. Вы также можете получить это с помощью следующей команды:

    cd ~ ; pwd

Эти переменные среды будут ссылаться на $ VARIABLE_NAME в файле docker-compose. Их значения будут автоматически извлечены из файла среды, который мы создали / отредактировали выше.

Проходя это руководство по Traefik 2, мы продолжим добавлять дополнительные переменные среды в файл .env. Вы найдете пример .env в моем репозитории GitHub, который приведен ниже.

На этом основная подготовительная работа по созданию нашего домашнего сервера докеров завершена.

Основные команды Docker, чтобы знать

Прежде чем мы начнем, давайте изучим некоторые основные команды для использования в этом руководстве по Docker Traefik v2. Большинство команд подробно обсуждались в моем предыдущем руководстве по серверу докеров.

Мы собираемся представить здесь упрощенный способ использования этих команд с помощью bash_aliases в системах Ubuntu / Linux.

Пример файла .bash_aliases представлен в моем репозитории GitHub.

Ниже приведены некоторые команды быстрого доступа, которые можно использовать для выполнения нескольких операций, связанных с docker и docker-compose из командной строки.

Псевдонимы / ярлыки для команд Docker

  • dstopcont SERVICENAME – остановить контейнер
  • dstopall – остановить все запущенные контейнеры
  • docdf – хранилище, используемое докером
  • docps – список всех контейнеров

Псевдонимы / ярлыки для команд Docker Compose

  • dcup2 – запуск док-станции Traefik 2
  • dcdown2 – остановить весь стек составления док- станции Traefik 2
  • dcrec2 SERVICENAME – воссоздать конкретный сервис из набора Docker Traefik 2
  • dcrestart2 SERVICENAME – перезапустить определенный контейнер
  • dcpull2 – обновить все образы контейнеров

Некоторые из перечисленных выше псевдонимов предназначены только для Traefik v2.0. Для включения Traefik v1.0 намного больше команд быстрого вызова (псевдонимов), чем перечисленные выше. Так что посмотрите пример файла bash_aliases, на который есть ссылки выше.

Это завершает часть настройки и подготовки докера. Теперь перейдем к настройке Traefik 2.0.

Настройка Traefik 2

В отличие от моего предыдущего руководства по Traefik, мы не собираемся показывать вам примеры создания докеров для всех примерно 50 приложений, которые я запускаю. Вместо этого мой подход к этому руководству по Traefik 2 состоит в том, чтобы показать вам, как настроить Traefik 2 и несколько приложений в качестве примеров.

Примеры приложений, которые я выбрал, продемонстрируют различные возможности Traefik 2 и охватят некоторые распространенные сценарии. Вы можете использовать их как примеры и адаптировать примеры docker-compose для других приложений.

Примечание. И мой репозиторий GitHub, и данное руководство созданы таким образом, что и Traefik 1, и Traefik 2 могут сосуществовать в одной корневой папке докера. Но только один (Traefik 1 или 2) может быть запущен в любое время и прокси сервисов. Для разграничения, файлы / папки, связанные с Traefik v1 one, будут иметь t1, а файлы, связанные с Traefik 2, будут иметь t2 в своих именах.

Обзор обратного прокси Traefik

Обратный прокси-сервер Traefik обеспечивает удобство и безопасность для ваших интернет-сервисов (например, Radarr, Sonarr, SABnzbd и т.д. ). Обратный прокси-сервер обычно находится за брандмауэром (маршрутизатор или интернет-шлюз) и направляет клиентов в соответствующие приложения, используя общее имя (radarr.example.com), при этом клиенту не нужно знать IP-адрес или порт сервера. Клиент взаимодействует с обратным прокси-сервером, а обратный прокси-сервер направляет сообщение в серверное приложение для предоставления / получения информации.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Схема обратного прокси

Основная информация об обратном прокси уже подробно описана в моем предыдущем уроке по Traefik. Вот ссылки на соответствующие разделы для вашего обзора:

Короче говоря, мы будем использовать Traefik в основном для:

  • Поместите наши приложения в удобный и легко запоминающийся URL
  • Добавьте базовую аутентификацию или аутентификацию Google OAuth 2.0 для еще одного уровня безопасности приложений
  • Добавьте заголовки безопасности для веб-интерфейсов приложений
  • Уменьшите риски безопасности, избегая переадресации портов отдельным приложениям (не открывая их напрямую в Интернет)
  • Поместите все наши услуги за SSL-сертификаты LetsEncrypt, которые автоматически извлекаются и обновляются Traefik 2

В моем предыдущем руководстве я рассмотрел два способа доступа к вашим приложениям из Интернета: подкаталог и поддомен.

В этом руководстве для удобства мы только покажем вам метод поддомена с частным доменным именем. Если вы хотите использовать метод подкаталога, вы можете объединить информацию из моего предыдущего руководства, чтобы разобраться.

Траффик 1 против Траффик 2

Traefik 2 внес много серьезных изменений. Многие посетители, которые следовали моему предыдущему руководству, проснулись однажды утром и обнаружили, что их настройки были нарушены, потому что они автоматически обновились за ночь до Traefik 2.

Моя установка Traefik 1 работала без нареканий. Так зачем обновляться до Traefik 2? Давайте потратим некоторое время на изучение Traefik 2, прежде чем приступить к настройке домашнего сервера Docker Traefik 2.

Миграция с Traefik v1 на v2 – основные моменты

Разработчики Traefik и сообщество предоставили превосходное руководство по миграции с 1 по 2. Но вот некоторые важные моменты.

  1. Traefik версии 2 имеет другой синтаксис и формат для своей конфигурации, что означает, что docker-compose.yml и traefik.toml, используемые для Traefik 1.7.X, не могут использоваться с последней версией Traefik.

  2. Вы можете выбрать версию с тегами Docker, используя доступные теги, перечисленные на DockerHub (и здесь: список релизов traefik с их тегами ). Чтобы быть в курсе последних версий, я рекомендую использовать тег выпуска для каждой версии.

    • шевротин = 2,2.х
    • кантал = 2.1.X
    • maroilles = 1.7.X
  3. Traefik v1.7 больше не разрабатывается, но все равно будет получать все необходимые обновления безопасности с помощью тега maroilles. В этом руководстве мы будем использовать последний тег для Traefik v2.2 – chevrotin. Любые будущие обновления до версии 2.2 Traefik могут автоматически обновляться с помощью таких служб, как Сторожевая башня или Уроборос.

  4. Хотя Traefik версии 2 требует новой конфигурации, я обнаружил, что в ней используется много тех же понятий, что и в версии 1.7. Вот некоторые из концепций, которые, как мне кажется, имеют лучшее определение и цель в v2:

    Наряду с этими улучшенными концепциями появилось несколько новых функций, таких как:

    • Маршрутизаторы
    • промежуточное программное
    • Сервисы
    • TCP-маршрутизация

    Если вы не понимаете ничего из этого, не беспокойтесь. Мы расскажем вам, что вам нужно знать, чтобы запустить сервер Docker Traefik 2.

Зачем обновлять до Traefik 2?

Моя основная причина перехода на Traefik 2 заключалась в улучшенной поддержке заголовков, но я обнаружил, что мне больше всего понравилось то, как версия 2 использует Middlewares.

Это значительно упростило мою настройку, и теперь чрезвычайно легко настроить новые маршруты и службы. Вы также можете повторно использовать ту же конфигурацию, которая позволяет обновлять несколько служб, редактируя один файл конфигурации.

Я потратил слишком много времени на v1, чтобы быть уверенным, что каждый сервис обновлен с учетом любых улучшений, которые я сделал.

Мы пройдем через все это вместе, и я надеюсь, что вы увидите те же большие преимущества, что и я.

Маршрутизаторы, промежуточное программное обеспечение и услуги Traefik 2

В Traefik v1 при управлении запросами использовались две основные концепции – внешние и внутренние. Интерфейсы идентифицируют и изменяют способ обработки запроса, в то время как серверы определяют, куда отправить запрос. Traefik v2 больше не использует эти определения, и вместо этого необходимо определить три компонента как часть нашей конфигурации: маршрутизаторы, службы и промежуточное программное обеспечение.

Маршрутизаторы

Маршрутизаторы похожи на интерфейсы, они управляют входящими запросами. В разделе «Маршрутизаторы» вы определите точку входа, распознаватель сертификатов и определите правила для запроса.

Сервисы

Сервисы похожи на серверные, они определяют, куда отправлять запросы. Здесь вы можете определить порт, к которому будет подключен Traefik, и любые дополнительные балансировщики нагрузки.

промежуточное программное

Промежуточное программное обеспечение – одна из захватывающих новых возможностей Traefik v2. Промежуточное ПО изменяет запрос, и в действительности оно является «промежуточным ПО» между маршрутизаторами и службами. В v1 промежуточное ПО было определено на внешнем интерфейсе, но разделение этих функций дает нам дополнительную гибкость и удобство. Вы можете легко добавлять такие вещи, как заголовки, аутентификация, префикс пути или объединять их и создавать повторно используемые группы.

Используя эти три понятия, мы могли бы идентифицировать входящий запрос, определить, куда направляется запрос, и выбрать способ изменения запроса при его маршрутизации.

Начало работы с Traefik v2

Вот несколько советов, которые я рекомендую при настройке Traefik 2.0, чтобы, надеюсь, немного упростить ситуацию:

  • Сохраняйте это простым: иногда может быть трудно устранить проблему, когда многое изменилось одновременно. Начните с базового примера и сначала перейдите на панель инструментов Traefik, а затем продолжайте добавлять службы оттуда.
  • Traefik Dashboard / API Auth Required: Панель инструментов Traefik должна быть защищена аутентификацией, в противном случае вам нужно будет использовать небезопасный флаг. Следуя этому руководству, мы получим безопасную конфигурацию и не будем использовать этот флаг.
  • Форматирование Go: Traefik написан на Go, и поэтому нам нужно использовать форматирование Go в зависимости от типа ввода (строка, логическое значение, массив). Это означает, например, что ваше имя хоста должно быть определено с помощью обратных кавычек, таких как traefik.example.com (апострофы не будут работать! ).

Это завершает большую часть основной информации, которая может вам понадобиться. Давайте перейдем к настройке Traefik 2 с помощью Docker.

Конфигурация Traefik 2

Есть несколько способов настроить Traefik 2, и это может быть довольно сложно для новичков. Даже имея некоторый опыт, мне иногда трудно обдумывать методы настройки Traefik 2.

Итак, давайте потратим время, чтобы понять некоторые важные детали конфигурации Traefik 2: статическая или динамическая конфигурация.

Динамическая Конфигурация

Traefik – это динамический обратный прокси-сервер, то есть он может автоматически добавлять и удалять маршруты при запуске или остановке контейнеров. Метки, прикрепленные к каждому контейнеру в docker-compose.ymlНапример,, являются частью динамической конфигурации Traefik.

Вы также можете направить на дополнительные хосты как часть вашей динамической конфигурации, если вы определили их с помощью провайдера файлов (который мы произвольно назвали rules.toml в нашем руководстве по Traefik v1 ).

Обратите внимание, что мы можем определить нашу динамическую конфигурацию 1) с нашим провайдером Docker, используя метки, и 2) с нашим провайдером файлов.

Статическая конфигурация

Хотя динамические методы являются одним из основных преимуществ Traefik, важно понимать, что Traefik также использует статическую конфигурацию, которая определяется по-другому и должна храниться отдельно.

Существует три различных способа определения статической конфигурации для Traefik 2. Одновременно можно использовать только один.

  1. Файл конфигурации – может быть в файле TOML или YAML (например, traefik.toml или traefik.yaml).
  2. Аргументы командной строки (CLI) – эти аргументы передаются во время запуска Docker
  3. В качестве переменных среды – вот список всех переменных среды.

Эти способы оцениваются в порядке, указанном выше.

В нашем руководстве по Traefik v1 мы определили большую часть нашей статической конфигурации с помощью файла traefik.toml. Статическая конфигурация читается при запуске Traefik и не может быть изменена во время выполнения.

В этом руководстве мы собираемся немного упростить ситуацию, настроив Traefik версии 2 без файла traefik.toml. Вместо этого мы собираемся использовать метод аргументов CLI, перечисленный выше. Это дает нам на один файл меньше беспокойства и объединяет конфигурацию нашего поставщика Docker в один файл docker-compose.

Подготовительная работа к Трафику 2

Теперь давайте проведем подготовительную работу, чтобы запустить и запустить контейнер Traefik v2 Docker. Мы собираемся использовать ту же структуру папок, которая использовалась в нашем руководстве по медиа-серверу Docker.

Создание базовых учетных данных HTTP-аутентификации

Хотя основное внимание в этом посте уделяется использованию Google OAuth 2, у вас есть возможность использовать обычную HTTP-аутентификацию, если хотите. Для этого нам нужно создать файл .htpasswd с учетными данными для входа.

Мы собираемся поместить этот файл в папку $ USERDIR / docker / shared. Используйте этот HTPASSWD Generator, чтобы создать имя пользователя и пароль и добавить их в файл $ USERDIR / docker / shared / .htpasswd, как показано ниже:

username:mystrongpassword

Заменить / Настроить:

  1. имя пользователя: с вашим именем пользователя HTTP.
  2. mystrongpassword: с вашим хешированным паролем HTTP, сгенерированным по ссылке выше.

Обратите внимание, что если вы поместите имя пользователя и пароль в файл компоновки Docker напрямую, а не в файл среды, тогда любые знаки $ в хешированном пароле должны быть экранированы путем добавления еще одного знака со знаком $. Например:

user:$apr1$bvj3f2o0$/01DGlduxK4AqRsTwHnvc1 Should be: user:$$apr1$$bvj3f2o0$$/01DGlduxK4AqRsTwHnvc1 In the environment file, $ signs do not need to be escaped.

В качестве альтернативы вы можете использовать следующую команду в Linux для генерации имени пользователя и пароля, которые уже экранированы:

echo $(htpasswd -nb username mystrongpassword) | sed -e s/\$/\$\$/g

Сохраните файл и выйдите.

Создать Traefik 2 Экологические переменные

Мы уже добавили несколько переменных среды для докера на предыдущих шагах.

Теперь откройте тот же файл .env и добавьте следующие новые переменные:

DOMAINNAME=example.com CLOUDFLARE_EMAIL=email@example.com CLOUDFLARE_API_KEY=XXXXXXXXXXXX

Заменить / Настроить:

  1. example.com: Ваше частное или динамическое DNS-имя домена.

  2. email@example.com: электронная почта от вашего аккаунта cloudflare. Это требуется только в том случае, если вы выполняете DNS Challenge для сертификатов Wildcard Traefik Letsencrypt.

  3. XXXXXXXXXXXX: ключ API от вашей учетной записи cloudflare (глобальный ключ API на странице профиля. Не идентификатор зоны или идентификатор учетной записи ). Опять же, это требуется только для DNS Challenge для запуска приложений на поддоменах.

    Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

    Cloudflare Global API Key для «Давайте зашифруем вызов DNS»

Как объяснялось ранее, в этом руководстве мы будем использовать метод DNS Challenge, чтобы Traefik получал групповые сертификаты от LetsEncrypt. Чтобы сделать это с Cloudflare, нам нужны две вышеуказанные переменные (CLOUDFLARE_EMAIL и CLOUDFLARE_API_KEY ).

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Давайте зашифруем список DNS-провайдеров Traefik Wildcard

Если вы используете одного из других провайдеров DNS вместо Cloudflare, обязательно включите необходимые параметры конфигурации в файл переменных среды.

Подготовьте папки и файлы Traefik 2

Далее нам нужно создать новые папки для Traefik и ACME в корневой папке докера ($ USERDIR / docker), описанной ранее:

mkdir traefik2 mkdir traefik2/acme

traefik2 – это папка, которую мы будем использовать для хранения всех связанных с Traefik 2.0 конфигураций.

Docker не может создавать отсутствующие файлы (только каталоги). Поэтому нам нужно создать пустой файл для Traefik для хранения нашего сертификата LetsEnrypt. Итак, из корневой папки Docker создайте пустой файл acme.json с помощью следующей команды:

touch traefik2/acme/acme.json

Затем установите правильное разрешение для файла acme.json, используя следующую команду:

chmod 600 traefik2/acme/acme.json

В файле acme.json будут храниться все сгенерированные сертификаты SSL. На последующих этапах этого руководства вам будет предложено открыть и проверить этот файл.

Точно так же мы собираемся создать файл журнала для Traefik для записи журналов. Из корневой папки Docker создадим пустой файл журнала:

touch traefik2/traefik.log

Создать сеть прокси Traefik 2

Последний шаг – создать сеть для использования обратного прокси-сервера Traefik 2, используя следующую команду:

docker network create t2_proxy

В качестве альтернативы, если вы хотите определить свою собственную подсеть, вы можете использовать следующую команду:

docker network create --gateway 192.168.90.1 --subnet 192.168.90.0/24 t2_proxy

Настройте 192.168.90.0/24 в соответствии с вашей ситуацией. Приведенная выше команда позволяет использовать диапазон IP-адресов от 192.168.90.1 до 192.168.90.254 (254 IP-адреса) для используемых служб докеров.

Как показано ниже, вы можете при необходимости установить статические IP-адреса для своих сервисов.

Traefik 2 Docker Compose

Вся основная информация была представлена ​​и подготовительная работа была выполнена. Начнем с того, чего вы все ждали. Сборка файла Traefik 2 Docker Compose.

Определить сети в Docker Compose

Создайте файл с именем docker-compose-t2.yml в корневой папке docker, которую мы обсуждали ранее в этом руководстве (в том же месте, что и файл .env, $ USERDIR / docker). Мы начнем с добавления следующего:

Внимание: обратите внимание на пробелы в примерах docker-compose ниже. Интервал очень важен для того, чтобы YAML правильно читал ваши файлы.

version: "3.7" ########################### NETWORKS networks: t2_proxy: external: name: t2_proxy default: driver: bridge ########################### SERVICES services: # All services / apps go below this line

Добавить Traefik 2 и Traefik 2 Dashboard

Держись крепче, это будет долго. Но не волнуйтесь, мы сделаем это по частям.

Для начала давайте добавим основы сервиса Traefik 2:

# Traefik 2 - Reverse Proxy traefik: container_name: traefik image: traefik:chevrotin # the chevrotin tag refers to v2.2.x restart: unless-stopped

Ничего особенного здесь. Далее мы добавим наши аргументы CLI для настройки Traefik 2.0. Большинство настроек, которые использовались в traefik.toml в нашем руководстве по Traefik 1, будут здесь.

command: # CLI arguments - --global.checkNewVersion=true - --global.sendAnonymousUsage=true - --entryPoints.http.address=:80 - --entryPoints.https.address=:443 # Allow these IPs to set the X-Forwarded-* headers - Cloudflare IPs: https://www.cloudflare.com/ips/ - --entrypoints.https.forwardedHeaders.trustedIPs=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/12,172.64.0.0/13,131.0.72.0/22 - --entryPoints.traefik.address=:8080 - --api=true # - --api.insecure=true # - --serversTransport.insecureSkipVerify=true - --log=true - --log.level=DEBUG # (Default: error) DEBUG, INFO, WARN, ERROR, FATAL, PANIC - --accessLog=true - --accessLog.filePath=/traefik.log - --accessLog.bufferingSize=100 # Configuring a buffer of 100 lines - --accessLog.filters.statusCodes=400-499 - --providers.docker=true - --providers.docker.endpoint=unix:///var/run/docker.sock - --providers.docker.defaultrule=Host(`{{ index .Labels "com.docker.compose.service" }}.$DOMAINNAME`) - --providers.docker.exposedByDefault=false - --providers.docker.network=t2_proxy - --providers.docker.swarmMode=false - --providers.file.directory=/rules # Load dynamic configuration from one or more .toml or .yml files in a directory. # - --providers.file.filename=/path/to/file # Load dynamic configuration from a file. - --providers.file.watch=true # Only works on top level files in the rules folder - --certificatesResolvers.dns-cloudflare.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory # LetsEncrypt Staging Server - uncomment when testing - --certificatesResolvers.dns-cloudflare.acme.email=$CLOUDFLARE_EMAIL - --certificatesResolvers.dns-cloudflare.acme.storage=/acme.json - --certificatesResolvers.dns-cloudflare.acme.dnsChallenge.provider=cloudflare

Приведенные выше аргументы CLI Traefik v2.0 – это то, что входит в файл traefik.toml (или YAML), если вы решили его использовать.

Вот несколько важных строк, которые потребуют вашего внимания:

–entrypoints.https.forwardedHeaders.trustedIPs

При использовании Cloudflare, когда весь ваш трафик находится за прокси-сервером (оранжевое облако в записях DNS), исходный IP-адрес запроса заменяется на IP-адрес Cloudflare. В результате все ваши службы будут знать, что IP-адрес Cloudflare подключен, но вы не видите фактический IP-адрес источника. Эта строка указывает Traefik доверять перенаправленной информации заголовков (X-Forwarded- *) для общедоступных IP-адресов Cloudflare, что в основном означает, что Traefik будет принимать заголовок X-Forwarded-For, установленный Cloudflare.

Эта опция не нужна, если вы не используете прокси-функции Cloudflare (записи DNS закрашены серым).

–api.insecure = верно

Эта строка закомментирована, потому что мы собираемся установить панель мониторинга Traefik 2 за аутентификацией. Если по какой-либо причине вы не хотите включать аутентификацию, раскомментируйте эту строку, удалив перед ней знак #.

–serversTransport.insecureSkipVerify = TRUE

Я рекомендую оставить эту строку отключенной (закомментированной), которая по умолчанию будет “false”. Некоторые приложения, которые требуют HTTPS для своего веб-интерфейса, могут быть привередливы за Traefik (например, NextCloud, Unifi Controller). Если для insecureSkipVerify задано значение true, проверка SSL-сертификата отключается, поэтому мы хотим избежать этого, если это возможно. Мы можем использовать TCP-маршрутизаторы (обсуждаемые далее в руководстве), которые позволят нам получить доступ к таким службам, как Nextcloud и Unifi Controller, для которых требуется HTTPS.

–log.level = ОТЛАДКА

Начните с установки на DEBUG. Убедившись, что все работает нормально и сертификаты LetsEncrypt загружаются правильно, вы можете изменить это на WARN.

–providers.file.directory = / правила

Как и в нашем руководстве по Traefik 1, мы будем использовать папку с правилами вместо файла rules.toml. В этой папке мы будем хранить некоторые конфигурации, которые Traefik 2 может подобрать в режиме реального времени (если для параметра –providers.file.watch установлено значение true ), без необходимости перезапуска. Примеры включают в себя промежуточное программное обеспечение, конфигурации для проксирования внешних или не докер-приложений и т.д. Некоторые примерные правила и сценарии обсуждаются далее в этом руководстве по Docker Traefik 2.

–providers.file.filename = / путь / к / файлу

Эта строка закомментирована, потому что мы не будем использовать rules.toml. Вместо этого мы будем использовать папку правил, которая включена в предыдущей строке конфигурации.

–certificatesResolvers.dns-cloudflare.acme Lines

Теперь поговорим о последних 5 аргументах CLI:

- --certificatesResolvers.dns-cloudflare.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory # LetsEncrypt Staging Server - uncomment when testing - --certificatesResolvers.dns-cloudflare.acme.email=$CLOUDFLARE_EMAIL - --certificatesResolvers.dns-cloudflare.acme.storage=/acme.json - --certificatesResolvers.dns-cloudflare.acme.dnsChallenge.provider=cloudflare - --certificatesResolvers.dns-cloudflare.acme.dnsChallenge.resolvers=1.1.1.1:53,1.0.0.1:53

Здесь мы определяем наш распознаватель сертификатов. В этом руководстве мы используем вызов ACME DNS с Cloudflare в качестве нашего поставщика, поэтому я выбрал dns-cloudflare в качестве имени для этого средства распознавания сертификатов. Если вы используете другой вызов ACME или провайдер проверки DNS, отличный от Cloudflare, вы можете по-своему назвать свой распознаватель сертификатов.

caServer: это очень важная строка. Когда эта функция включена, мы будем использовать промежуточный сервер LetsEncrypt, чтобы проверить, все ли работает нормально. Как упоминалось ранее, LetsEncrypt имеет ограничение скорости, чтобы предотвратить злоупотребление системой. Если у вас есть ошибки в вашем Traefik 2 Docker Compose, вы можете быть заблокированы из проверки LetsEncrypt. Чтобы предотвратить это, мы будем использовать промежуточный сервер для начальной настройки. Как только мы убедимся, что все работает хорошо (показано ниже), мы закомментируем эту строку и получим, чтобы Traefik 2 получил настоящие SSL-сертификаты LetsEncrypt с сервера по умолчанию.

Ничего не изменится с электронной почтой или хранилищем. Для Cloudflare убедитесь, что установлена ​​переменная среды ($ CLOUDFLARE_EMAIL). Другие поставщики могут иметь другие требования и могут не требовать электронной почты.

провайдер: измените, если вы используете провайдера, отличного от Cloudflare, для вызова DNS.

Сети для панели инструментов Traefik 2

Далее идет сетевой блок. Вы можете позволить Docker назначить динамический IP-адрес для службы traefik или вручную назначить статический IP-адрес.

networks: t2_proxy: ipv4_address: 192.168.90.254 # You can specify a static IP # networks: # - t2_proxy

Пример выше для статического IP в сети Docker 192.168.90.254. Этот IP-адрес доступен только хосту и в сети Docker. Если вы хотите, чтобы Docker назначил IP-адрес контейнера динамически, закомментируйте первые три строки и раскомментируйте последние две.

Установка статического IP-адреса полезна для некоторых служб, таких как базы данных (MariaDB, InfluxDB и т.д.) Или когда один из ваших контейнеров должен ссылаться на другой статически. Например, мой PiHole может подключаться к Unbound, используя статический IP-адрес Docker вместо того, чтобы выставлять какие-либо порты хосту.

Параметры безопасности

Блок параметров безопасности позволяет нам установить некоторые дополнительные параметры безопасности. Например, используя блок ниже, мы можем ограничить процессы контейнера от получения дополнительных привилегий.

security_opt: - no-new-privileges:true

Если вам интересно, вот еще несколько настроек безопасности Docker.

Трафик 2 порта

Далее мы собираемся указать информацию о портах для Traefik 2. Traefik требуется три порта: 80, 443 и 8080. Последний необходим для панели мониторинга Traefik 2.

ports: - target: 80 published: 80 protocol: tcp mode: host - target: 443 published: 443 protocol: tcp mode: host - target: 8080 published: 8080 protocol: tcp mode: host

Как видите, порты для Traefik 2 такие же, как и для Traefik 1.

Трафик 2 Тома

Вот тома, которые я указал в моем файле Docker-compose Traefik 2:

volumes: - $USERDIR/docker/traefik2/rules:/rules - /var/run/docker.sock:/var/run/docker.sock:ro - $USERDIR/docker/traefik2/acme/acme.json:/acme.json - $USERDIR/docker/traefik2/traefik.log:/traefik.log - $USERDIR/docker/shared:/shared

Правила объем содержит настройки для нашего провайдера файла (например, промежуточное программное, правила для внешних / не докеров приложений). Подробнее об этом позже в этом руководстве по док-станции Traefik 2.

Как объяснялось ранее, я использую общую папку для обмена некоторой общей информацией между различными службами. Помните, что в эту папку мы также поместили учетные данные базовой аутентификации HTTP.

Остальные тома / файлы могут быть использованы как есть.

Экологические переменные Traefik

Мы собираемся передать две дополнительные переменные среды для использования сервисом Traefik 2:

environment: - CF_API_EMAIL=$CLOUDFLARE_EMAIL - CF_API_KEY=$CLOUDFLARE_API_KEY

И $ CLOUDFLARE_EMAIL, и $ CLOUDFLARE_API_KEY, которые были установлены ранее с помощью файла .env, будут переданы в CF_API_EMAIL и CF_API_KEY, соответственно, для проверки вызова DNS.

Traefik 2 Докер этикетки

Последний – большой: ярлыки для Traefik 2. Эта часть полностью изменилась в docker-compose для Traefik 2 по сравнению с Traefik 1.

Во-первых, это строка для включения или отключения traefik для сервисов. Довольно просто.

labels: - "traefik.enable=true"

Когда контейнер запускается, маршрут будет создан автоматически. Это необходимо, потому что мы указали в качестве части нашей статической конфигурацииctedByDefault = false.

Затем мы добавляем маршрутизаторы для перенаправления всех HTTP-трафик в защищенный порт HTTPS:

# HTTP-to-HTTPS Redirect - "traefik.http.routers.http-catchall.entrypoints=http" - "traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)" - "traefik.http.routers.http-catchall.middlewares=redirect-to-https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

Затем мы добавляем дополнительные маршрутизаторы для точек входа, разрешения сертификатов и информации о домене:

# HTTP Routers - "traefik.http.routers.traefik-rtr.entrypoints=https" - "traefik.http.routers.traefik-rtr.rule=Host(`traefik.$DOMAINNAME`)" - "traefik.http.routers.traefik-rtr.tls=true" - "traefik.http.routers.traefik-rtr.tls.certresolver=dns-cloudflare" # Comment out this line after first run of traefik to force the use of wildcard certs - "traefik.http.routers.traefik-rtr.tls.domains[0].main=$DOMAINNAME" - "traefik.http.routers.traefik-rtr.tls.domains[0].sans=*.$DOMAINNAME" # - "traefik.http.routers.traefik-rtr.tls.domains[1].main=$SECONDDOMAINNAME" # Pulls main cert for second domain # - "traefik.http.routers.traefik-rtr.tls.domains[1].sans=*.$SECONDDOMAINNAME" # Pulls wildcard cert for second domain

По умолчанию Traefik будет прослушивать входящие запросы на всех доступных точках входа. Вы можете ограничить или указать точку входа, если вы хотите это сделать. В приведенном выше случае Traefik будет прослушивать только HTTPS (безопасная точка входа).

Правило, как мы определяем, который запрашивает этот маршрутизатор будет обратиться. Большинство моих контейнеров используют правило Host (FQDN), но вы также можете использовать regex, pathprefix или другие параметры. Правило должно следовать Go форматирования, который означает, что мы должны использовать обратные кавычки вокруг строковых значений, не апостроф !

Что касается tls, мы явно заявляем, что этот маршрутизатор должен подключаться через TLS и не должен принимать HTTP-соединения.

Запишите этикетку с сертификатом. После первоначального тестирования и первого запуска Traefik для получения подстановочных сертификатов LetsEncrypt нам придется закомментировать эту строку, чтобы принудительно использовать подстановочные сертификаты и прекратить создавать отдельные сертификаты для отдельных служб.

Я выбрал произвольные имена, чтобы помочь описать их функцию, например, я выбрал dns-cloudflare, потому что я использую вызов DNS, а Cloudflare – мой поставщик. Имя может быть изменено на что угодно, но оно должно быть таким же, как certresolver мы определили в наших аргументах CLI.

Вы также заметите, что я использую разные имена для каждого маршрутизатора, например, маршрутизатор HTTP-HTTPS Redirect произвольно называется «http-catchall», а HTTP-маршрутизатор – «traefik-rtr». Маршрутизаторы группируются с использованием этих имен, но имя можно изменить так, как вы хотите описать маршрутизатор.

В приведенном выше примере мы используем только один домен ($ DOMAINNAME и его подстановочный знак *. $ DOMAINNAME ). Чтобы определить дополнительные домены, раскомментируйте последние две строки. Убедитесь, что $ SECONDDOMAINNAME установлен в вашем файле .env. Вы можете указать дополнительные домены, используя домены [2], домены [3] и т.д. Traefik будет использовать SSL-сертификаты для всех этих доменов.

Последняя часть меток большая: промежуточное ПО. Это будет указывать заголовки безопасности, устанавливать аутентификацию и т.д. Сначала давайте начнем с простого, а затем добавим дополнительные метки.

Если вы не хотите устанавливать аутентификацию для панели мониторинга Treafik 2 (не забудьте включить –api.insecure = true ), то все, что здесь необходимо, – это следующая строка, чтобы указать, где доступна служба, которую необходимо проксировать:

## Services - API - "traefik.http.routers.traefik-rtr.service=api@internal"

Панель инструментов / API Traefik является особым случаем и должна быть точно определена как api @ internal. Мы сделаем это по-другому для остальных служб в этом руководстве.

Если вы начнете свою услугу Traefik 2 сейчас, то мы должны быть в бизнесе. Однако помните, что мы не собираемся делать панель инструментов Traefik v2 доступной без аутентификации.

Traefik 2 Basic HTTP-аутентификация

Во-первых, давайте установим простейшую форму аутентификации и заставим вещи работать должным образом. Это где промежуточное программное обеспечение вступает в игру.

Давайте создадим наше первое промежуточное ПО с помощью нашего провайдера файлов. Создайте файл с именем middlewares.toml в папке правил Traefik 2 ($ USERDIR / docker / traefik2 / rules) и добавьте в него следующее содержимое:

[http.middlewares] [http.middlewares.middlewares-basic-auth] [http.middlewares.middlewares-basic-auth.basicAuth] # username=user, password=mystrongpassword (listed below after hashing) # users = [ # "user:$apr1$bvj3f2o0$/01DGlduxK4AqRsTwHnvc1", # ] realm = "Traefik2 Basic Auth" usersFile = "/shared/.htpasswd" #be sure to mount the volume through docker-compose.yml

Приведенный выше блок кода добавляет промежуточное программное обеспечение для базовой аутентификации. Мы можем указать пользователей для аутентификации прямо здесь, если хотите (закомментированные строки).

Но, как обсуждалось ранее, мы собираемся использовать файл .htpasswd для хранения наших учетных данных. Поэтому мы укажем путь к usersFile.

Теперь давайте добавим это промежуточное ПО в наш сервис Traefik 2.0. Это требует определения промежуточного программного обеспечения, которое мы хотим использовать на нашем маршрутизаторе.

## Middlewares - "traefik.http.routers.traefik-rtr.middlewares=middlewares-basic-auth@file"

Мы в основном просим Traefik искать промежуточное ПО middlewares-basic-auth, которое мы определили с нашим провайдером файлов (@file) в папке правил.

Использование символа @ для указания провайдера – это новая функция в Traefik v2, но она необходима для определения источника промежуточного программного обеспечения. Если поставщик не указан, Traefik предполагает, что источником промежуточного программного обеспечения является текущий поставщик (@docker).

Обратите внимание, что подчеркнутая часть здесь middlewares-basic-auth @file соответствует подчеркнутому имени в [http.middlewares. middlewares-basic-auth ] в файле middlewares.toml, который мы создали ранее.

Тестирование настройки Docker Traefik 2

Пока что наш файл docker-compose-t2.yml должен выглядеть примерно так:

version: "3.7" ########################### NETWORKS networks: t2_proxy: external: name: t2_proxy default: driver: bridge ########################### SERVICES services: # All services / apps go below this line # Traefik 2 - Reverse Proxy traefik: container_name: traefik image: traefik:chevrotin # the chevrotin tag refers to v2.2.x restart: unless-stopped command: # CLI arguments - --global.checkNewVersion=true - --global.sendAnonymousUsage=true - --entryPoints.http.address=:80 - --entryPoints.https.address=:443 # Allow these IPs to set the X-Forwarded-* headers - Cloudflare IPs: https://www.cloudflare.com/ips/ - --entrypoints.https.forwardedHeaders.trustedIPs=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/12,172.64.0.0/13,131.0.72.0/22 - --entryPoints.traefik.address=:8080 - --api=true # - --api.insecure=true # - --serversTransport.insecureSkipVerify=true - --log=true - --log.level=DEBUG # (Default: error) DEBUG, INFO, WARN, ERROR, FATAL, PANIC - --accessLog=true - --accessLog.filePath=/traefik.log - --accessLog.bufferingSize=100 # Configuring a buffer of 100 lines - --accessLog.filters.statusCodes=400-499 - --providers.docker=true - --providers.docker.endpoint=unix:///var/run/docker.sock - --providers.docker.defaultrule=Host(`{{ index .Labels "com.docker.compose.service" }}.$DOMAINNAME`) - --providers.docker.exposedByDefault=false - --providers.docker.network=t2_proxy - --providers.docker.swarmMode=false - --providers.file.directory=/rules # Load dynamic configuration from one or more .toml or .yml files in a directory. # - --providers.file.filename=/path/to/file # Load dynamic configuration from a file. - --providers.file.watch=true # Only works on top level files in the rules folder - --certificatesResolvers.dns-cloudflare.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory # LetsEncrypt Staging Server - uncomment when testing - --certificatesResolvers.dns-cloudflare.acme.email=$CLOUDFLARE_EMAIL - --certificatesResolvers.dns-cloudflare.acme.storage=/acme.json - --certificatesResolvers.dns-cloudflare.acme.dnsChallenge.provider=cloudflare - --certificatesResolvers.dns-cloudflare.acme.dnsChallenge.resolvers=1.1.1.1:53,1.0.0.1:53 networks: t2_proxy: ipv4_address: 192.168.90.254 # You can specify a static IP # networks: # - t2_proxy security_opt: - no-new-privileges:true ports: - target: 80 published: 80 protocol: tcp mode: host - target: 443 published: 443 protocol: tcp mode: host - target: 8080 published: 8080 protocol: tcp mode: host volumes: - $USERDIR/docker/traefik2/rules:/rules - /var/run/docker.sock:/var/run/docker.sock:ro - $USERDIR/docker/traefik2/acme/acme.json:/acme.json - $USERDIR/docker/traefik2/traefik.log:/traefik.log - $USERDIR/docker/shared:/shared environment: - CF_API_EMAIL=$CLOUDFLARE_EMAIL - CF_API_KEY=$CLOUDFLARE_API_KEY labels: - "traefik.enable=true" # HTTP-to-HTTPS Redirect - "traefik.http.routers.http-catchall.entrypoints=http" - "traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)" - "traefik.http.routers.http-catchall.middlewares=redirect-to-https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" # HTTP Routers - "traefik.http.routers.traefik-rtr.entrypoints=https" - "traefik.http.routers.traefik-rtr.rule=Host(`traefik.$DOMAINNAME`)" - "traefik.http.routers.traefik-rtr.tls=true" - "traefik.http.routers.traefik-rtr.tls.certresolver=dns-cloudflare" # Comment out this line after first run of traefik to force the use of wildcard certs - "traefik.http.routers.traefik-rtr.tls.domains[0].main=$DOMAINNAME" - "traefik.http.routers.traefik-rtr.tls.domains[0].sans=*.$DOMAINNAME" # - "traefik.http.routers.traefik-rtr.tls.domains[1].main=$SECONDDOMAINNAME" # Pulls main cert for second domain # - "traefik.http.routers.traefik-rtr.tls.domains[1].sans=*.$SECONDDOMAINNAME" # Pulls wildcard cert for second domain ## Services - API - "traefik.http.routers.traefik-rtr.service=api@internal" ## Middlewares - "traefik.http.routers.traefik-rtr.middlewares=middlewares-basic-auth@file"

Обратите внимание, что «certresolver = dns-cloudflare» в метках должно соответствовать тому, что указано в «–certificatesResolvers. Dns -cloudflare .acme ….» в аргументах CLI Traefik 2.

На этом этапе давайте сохраним файл и запустим Traefik 2. В корневой папке докера запустите:

docker-compose -f docker-compose-t2.yml up -d

Кроме того, вы можете использовать ярлыки dcup2 или dcrec2 traefik bash_aliases для запуска Traefik 2.

Немедленно, давайте начнем следить за журналами сервиса Traefik, чтобы найти любые очевидные ошибки. Используйте следующую команду или ярлык dclogs2 traefik. Опять из корневой папки докера запускаем:

docker logs -tf --tail="50" traefik

Вот некоторые сообщения, которые показывают, что все прошло хорошо:

  • Ожидание распространения записи DNS
  • Сервер подтвердил наш запрос
  • Проверка прошла успешно, запрашиваются сертификаты
  • Сервер ответил сертификатом

На этом этапе, если вы видите какие-либо сообщения «плохой сертификат» или «неизвестный сертификат », игнорируйте их. Помните, что мы используем промежуточный сервер LetsEncrypt, который еще не предоставляет действительные сертификаты.

Есть несколько способов проверить, правильно ли настроен Traefik 2 и удалось ли получить сертификат LetsEncrypt. Мы покажем вам два из них здесь.

Давайте откроем панель инструментов Traefik 2 в браузере и увидим информацию о сертификате, как показано ниже. Обратите внимание на поддельный LE Intermediate X1. Это показывает, что SSL (поддельный) сертификат был получен Traefik 2 с промежуточного сервера LetsEncrypt.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Traefik 2.0 успешно показывает промежуточный сертификат Fake LE

Кроме того, вы можете открыть файл acme.json, расположенный в папке traefik2 ($ USERDIR / docker / traefik2 / acme / acme.json) и найти признаки успешной проверки, как показано ниже.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Файл acme.json для Staged Traefik 2.0 Проверка домена LetsEncrypt

Если вы до сих пор добились успеха, тогда поздравляю. Вы готовы стать настоящим сейчас.

Получение реальных сертификатов подстановочных знаков LetsEncrypt с помощью Traefik 2

Поскольку наша подготовка прошла успешно, давайте теперь откроем файл docker-compose-t2.yml и закомментируем следующую строку (как показано ниже), чтобы мы могли добраться до реального сервера LetsEncrypt для вызова DNS.

# - --certificatesResolvers.dns-cloudflare.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory

Сохраните файл Docker-compose для Traefik v2.

Откройте файл acme.json, удалите все содержимое и сохраните его. Кроме того, вы можете удалить файл acme.json и воссоздать пустой файл (не забудьте установить правильные права доступа, как описано ранее).

Затем заново создайте Traefik (dcrec2 traefik или полная команда, указанная выше) и еще раз просмотрите журналы (dclogs2 traefik или полную команду, указанную ранее), чтобы убедиться, что все идет гладко.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Журналы DNS Challenge Traefik 2, показывающие успешное получение сертификата от LetsEncrypt

Логи выглядят хорошо, без ошибок. Теперь давайте проверим сертификаты в браузере, чтобы проверить сертификат SSL.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Окончательный SSL-сертификат LetsEncrypt с использованием обратного прокси-сервера Traefik

Выглядит хорошо. Обратите внимание, что сертификат включает в себя example.com и подстановочный знак * .example.com. Давайте также проверим файл acme.json.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Файл acme.json для Final Traefik 2.0 Проверка домена LetsEncrypt

Обратите внимание, что здесь больше не говорится «постановка». Так что пока все хорошо, и наш стек Docker Traefik 2 идет неплохо.

Принудительное использование групповых сертификатов

Теперь, когда подстановочные сертификаты были извлечены, давайте заставим Traefik использовать этот сертификат (* .example.com) вместо создания отдельного сертификата для каждой службы (service.example.com).

Для этого закомментируйте certresolver в файле docker-compose, как показано ниже.

# - "traefik.http.routers.traefik-rtr.tls.certresolver=dns-cloudflare"

Создайте заново сервис traefik 2.0 и убедитесь, что панель управления доступна.

Обеспечение безопасности Traefik 2 Dashboard

Теперь, когда все работает отлично, давайте начнем улучшать безопасность наших услуг. Мы уже добавили некоторую защиту с помощью промежуточного программного обеспечения базовой аутентификации.

Вот еще несколько, которые вы можете добавить.

Ограничение скорости

В предельных скорости промежуточного слоя гарантирует, что услуги будут получать достаточное количество запросов. Это полезно, если умышленно (например, нарушение безопасности) или непреднамеренно ваши сервисы подвергаются бомбардировке запросами, вызывающими ситуацию отказа в обслуживании.

Мы собираемся открыть файл middlewares.toml, который мы создали выше, и добавить промежуточное ПО ограничения скорости, как мы это делали для базовой аутентификации. Добавьте следующие строки ниже того, что мы уже добавили для базовой аутентификации (обратите внимание на интервалы / форматирование).

[http.middlewares.middlewares-rate-limit] [http.middlewares.middlewares-rate-limit.rateLimit] average = 100 burst = 50

Теперь мы можем добавить это промежуточное ПО на панель мониторинга Traefik 2 так же, как мы добавили промежуточное ПО базовой аутентификации – изменив метку промежуточного программного обеспечения в docker compose следующим образом:

- "traefik.http.routers.traefik-rtr.middlewares=middlewares-rate-limit@file,middlewares-basic-auth@file"

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

Заголовки безопасности

В нашем docker-compose Traefik 1 у нас было несколько заголовков безопасности браузера. Давайте начнем добавлять их в наши сервисы Traefik 2. Вы можете добавить их в виде меток (как в нашем файле docker-compose Traefik 1) или в качестве промежуточного программного обеспечения с помощью провайдера файлов.

Как вы увидите далее в этом руководстве, использование поставщика файлов для промежуточного программного обеспечения значительно сокращает размер файлов, создаваемых Docker, избегая повторений и повторного использования кода.

Заголовки безопасности как метки

Давайте добавим промежуточное ПО для заголовков безопасности к тому, что у нас уже есть в наших ярлыках. Обратите внимание, что мы создадим новое имя для этого промежуточного заголовка traefik, просто добавив метку «traefik.http.middlewares ….». Добавление этих меток в контейнер Docker определит промежуточное программное обеспечение, но вам также необходимо добавить промежуточное программное обеспечение для маршрутизатора traefik-rtr (traefik.http.routers.traefik-rtr.middlewares = …).

В этом промежуточном программном обеспечении у меня нет «@», и я называю его только как traefik-заголовки. По умолчанию Traefik предполагает, что это означает traefik-headers @ docker, что было бы правильно, поскольку мы определяем промежуточное ПО в нашем «провайдере Docker» как метки, а не в нашем провайдере файлов.

## Middlewares - "traefik.http.routers.traefik-rtr.middlewares=traefik-headers,middlewares-rate-limit@file,middlewares-basic-auth@file" - "traefik.http.middlewares.traefik-headers.headers.accesscontrolallowmethods=GET, OPTIONS, PUT" - "traefik.http.middlewares.traefik-headers.headers.accesscontrolalloworiginlist=https://$DOMAINNAME" - "traefik.http.middlewares.traefik-headers.headers.accesscontrolmaxage=100" - "traefik.http.middlewares.traefik-headers.headers.addvaryheader=true" - "traefik.http.middlewares.traefik-headers.headers.allowedhosts=traefik.$DOMAINNAME" - "traefik.http.middlewares.traefik-headers.headers.hostsproxyheaders=X-Forwarded-Host" - "traefik.http.middlewares.traefik-headers.headers.sslredirect=true" - "traefik.http.middlewares.traefik-headers.headers.sslhost=traefik.$DOMAINNAME" - "traefik.http.middlewares.traefik-headers.headers.sslforcehost=true" - "traefik.http.middlewares.traefik-headers.headers.sslproxyheaders.X-Forwarded-Proto=https" - "traefik.http.middlewares.traefik-headers.headers.stsseconds=63072000" - "traefik.http.middlewares.traefik-headers.headers.stsincludesubdomains=true" - "traefik.http.middlewares.traefik-headers.headers.stspreload=true" - "traefik.http.middlewares.traefik-headers.headers.forcestsheader=true" - "traefik.http.middlewares.traefik-headers.headers.framedeny=true" # - "traefik.http.middlewares.traefik-headers.headers.customframeoptionsvalue=SAMEORIGIN" # This option overrides FrameDeny - "traefik.http.middlewares.traefik-headers.headers.contenttypenosniff=true" - "traefik.http.middlewares.traefik-headers.headers.browserxssfilter=true" # - "traefik.http.middlewares.traefik-headers.headers.contentsecuritypolicy=frame-ancestors 'none'; object-src 'none'; base-uri 'none';" - "traefik.http.middlewares.traefik-headers.headers.referrerpolicy=same-origin" - "traefik.http.middlewares.traefik-headers.headers.featurepolicy=camera 'none'; geolocation 'none'; microphone 'none'; payment 'none'; usb 'none'; vr 'none';" - "traefik.http.middlewares.traefik-headers.headers.customresponseheaders.X-Robots-Tag=none,noarchive,nosnippet,notranslate,noimageindex,"

Обратите внимание, что объяснение того, что делают эти заголовки безопасности, выходит за рамки этого поста, который уже оказывается одним из самых длинных постов, которые я когда-либо писал. Вы можете прочитать больше о заголовках безопасности traefik здесь.

То, что предоставлено здесь, должно работать для большинства из вас и для большинства услуг.

Вы можете добавить один и тот же набор заголовков безопасности для всех ваших других служб / приложений и изменять их по своему усмотрению. Обязательно измените traefik-заголовки и traefik. $ DOMAINNAME “ (разрешенные хосты и sslhost ).

Заголовки безопасности как файл промежуточного программного обеспечения

Как видите, мы можем добавить множество опций для заголовков безопасности. С Traefik 1 мы должны были бы копировать их для каждого сервиса, но Traefik 2 делает это действительно легко. Вместо того, чтобы использовать эти метки, мы можем переместить их все в наш файл промежуточного программного обеспечения и вызвать их в наш файл docker-compose, как мы это делали для ограничения скорости и базовой аутентификации.

Снова откройте middlewares.toml и добавьте следующие строки ниже того, что мы уже добавили (измените example.com (3 экземпляра)):

[http.middlewares.middlewares-secure-headers] [http.middlewares.middlewares-secure-headers.headers] accessControlAllowMethods= ["GET", "OPTIONS", "PUT"] accessControlMaxAge = 100 hostsProxyHeaders = ["X-Forwarded-Host"] sslRedirect = true stsSeconds = 63072000 stsIncludeSubdomains = true stsPreload = true forceSTSHeader = true # frameDeny = true #overwritten by customFrameOptionsValue customFrameOptionsValue = "allow-from https:example.com" #CSP takes care of this but may be needed for organizr. contentTypeNosniff = true browserXssFilter = true # sslForceHost = true # add sslHost to all of the services # sslHost = "example.com" referrerPolicy = "same-origin" # Setting contentSecurityPolicy is more secure but it can break things. Proper auth will reduce the risk. # the below line also breaks some apps due to 'none' - sonarr, radarr, etc. # contentSecurityPolicy = "frame-ancestors '*.example.com:*';object-src 'none';script-src 'none';" featurePolicy = "camera 'none'; geolocation 'none'; microphone 'none'; payment 'none'; usb 'none'; vr 'none';" [http.middlewares.middlewares-secure-headers.headers.customResponseHeaders] X-Robots-Tag = "none,noarchive,nosnippet,notranslate,noimageindex," server = ""

Хотя добавление заголовков безопасности через файл промежуточного программного обеспечения упрощает создание docker-compose файла Traefik 2.0, оно имеет ограничения по сравнению с использованием меток. Обратите внимание, что строки sslForceHost и sslHost были закомментированы.

Эти две опции добавляют немного больше безопасности, но, к сожалению, будут ломать приложения. Это связано с тем, что для опции sslHost требуется определенное имя хоста (например, service.example.com), и поэтому нельзя предоставить универсальный хост, который будет применяться ко всем сервисам, которые будут использовать Traefik 2.

Примечание: Вы не можете добавить только sslForceHost и sslForceHost как метки в docker-compose, а остальные оставить в файле промежуточного программного обеспечения.

То, что указано как метки, полностью перезапишет то, что указано в файле промежуточного программного обеспечения. На данный момент, похоже, что Traefik 2 не добавляет два. Поэтому единственные варианты – либо исключить эти две строки (очень небольшое снижение безопасности для удобства), либо указать все заголовки безопасности в файлах docker-compose в качестве меток (длинные файлы docker-compose). Я решил исключить (закомментировать) эти две строки в файле middlewares.toml.

Как и с другими промежуточными программами, представленными в файле, теперь мы должны включить это промежуточное ПО в файл составления, изменив строку следующим образом:

- "traefik.http.routers.traefik-rtr.middlewares=middlewares-secure-headers@file,middlewares-rate-limit@file,middlewares-basic-auth@file"

Как всегда, заново создайте службы после любых изменений в файле docker-compose.

Цепочки промежуточного программного обеспечения

Существует более простой способ предоставления промежуточного программного обеспечения, чем указание каждого из них в отдельности. Мы можем создать так называемые «цепочки промежуточного программного обеспечения». Цепь просто группа промежуточных программный .

Создайте файл middleware-chain.toml в папке с правилами и добавьте следующие строки:

[http.middlewares] [http.middlewares.chain-no-auth] [http.middlewares.chain-no-auth.chain] middlewares = [ "middlewares-rate-limit", "middlewares-secure-headers"] [http.middlewares.chain-basic-auth] [http.middlewares.chain-basic-auth.chain] middlewares = [ "middlewares-rate-limit", "middlewares-secure-headers", "middlewares-basic-auth"]

Этот блок кода создает две цепочки:

  1. chain-no-auth: Это указывает цепочку, которая будет использоваться для сервисов, которые мы не хотим иметь на первом уровне аутентификации (например, Plex, поскольку он может мешать доступу Plex на клиентских устройствах). Для них мы только указываем промежуточное ПО middlewares-rate-limit и middlewares-secure-headers.
  2. chain-basic-auth: для сервисов, которые будут использовать базовую аутентификацию перед сервисом, мы указываем middlewares-basic-auth в дополнение к двум другим.

Определив эти две цепочки промежуточного программного обеспечения, теперь мы можем изменить метку промежуточного программного обеспечения в состав Docker Traefik 2 следующим образом:

- "traefik.http.routers.traefik-rtr.middlewares=chain-basic-auth@file"

Как видно, цепочки промежуточного программного обеспечения еще больше упрощают файлы, создаваемые Docker. Вы можете вызывать эти цепочки в любом контейнере, и они будут использовать ту же конфигурацию промежуточного программного обеспечения.

Google OAuth 2.0

11 мая 2020 года. Теперь я добавил Authelia как частную многофакторную систему аутентификации. Вкратце, это включает в себя добавление Authelia в docker compose, создание файлов configuration.yml и users_database.yml. Примеры (Portainer) можно найти в GitHub Repo. Я обновлю это руководство в какой-то момент.

Используя внешнее промежуточное ПО и цепочки, мы можем упростить нашу конфигурацию, избежать ошибок, а также значительно упростить обновление нашей конфигурации. Мы можем повторно использовать наши заголовки безопасности для повышения безопасности передачи данных, а базовая аутентификация помогла нам ограничить доступ к нашему сервису.

Однако у меня есть две проблемы с базовой аутентификацией: 1) базовая аутентификация – это только одна форма аутентификации, и 2) мне приходится каждый раз входить в систему, чтобы использовать мои защищенные сервисы. Это может быть довольно громоздким через некоторое время.

Но есть и другие системы аутентификации, которые обеспечивают еще большую безопасность (например, двухфакторная аутентификация) и удобство. Хорошие примеры: Google OAuth 2.0, Authelia и Keycloak.

В этой статье мы собираемся добавить Google OAuth 2.0 для аутентификации доступа к нашим сервисам.

Примечание. Если вам не нужна аутентификация Google OAuth 2.0, вы можете пропустить этот раздел и перейти к добавлению дополнительных сервисов.

Используя Google OAuth 2.0, мы можем решить обе проблемы, перечисленные выше. Внедрение OAuth 2.0 от Google является бесплатным и довольно простым, с небольшими изменениями, чтобы адаптировать его для Traefik v2.

Следует отметить одну вещь, касающуюся использования службы OAuth от Google с вашими заголовками безопасности. Если служба находится за OAuth и вы пытаетесь проверить, применяются ли ваши заголовки безопасности, вы, вероятно, получите более низкий рейтинг. Сначала это вызывало у меня большую обеспокоенность, пока я не понял, что заголовки, которые я видел, были на самом деле не для моего сервиса, а для Google.

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Заголовки безопасности с Google OAuth

Настройка требований для OAuth уже обсуждалась в нашем другом посте на Traefik Google OAuth 2.0. Пожалуйста, следуйте шагам 1 и 2, описанным там, и вернитесь к этому сообщению, чтобы продолжить.

Создать OAuth Middleware и Chain

Давайте теперь определим промежуточное программное обеспечение для OAuth. Откройте файл middlewares.toml и добавьте следующие строки ниже того, что уже присутствует:

[http.middlewares.middlewares-oauth] [http.middlewares.middlewares-oauth.forwardAuth] address = "http://oauth:4181" # Make sure you have the OAuth service in docker-compose.yml trustForwardHeader = true authResponseHeaders = ["X-Forwarded-User"]

Кроме того, давайте создадим новую цепочку промежуточного программного обеспечения для служб, которые будут использовать Google OAuth. Откройте middleware-chain.toml и добавьте следующие строки ниже того, что уже присутствует:

[http.middlewares.chain-oauth] [http.middlewares.chain-oauth.chain] middlewares = [ "middlewares-rate-limit", "middlewares-secure-headers", "middlewares-oauth"]

Далее, давайте настроим контейнер OAuth Forwarder.

Настройка контейнера пересылки OAuth

Откройте файл docker-compose-t2.yml и добавьте сервис для OAuth прямо под сервисом traefik, который мы создали ранее.

# Google OAuth - Single Sign On using OAuth 2.0 oauth: container_name: oauth image: thomseddon/traefik-forward-auth:latest restart: unless-stopped networks: - t2_proxy security_opt: - no-new-privileges:true environment: - CLIENT_ID=$GOOGLE_CLIENT_ID - CLIENT_SECRET=$GOOGLE_CLIENT_SECRET - SECRET=$OAUTH_SECRET - COOKIE_DOMAIN=$DOMAINNAME - INSECURE_COOKIE=false - AUTH_HOST=oauth.$DOMAINNAME - URL_PATH=/_oauth - WHITELIST=$MY_EMAIL - LOG_LEVEL=info - LOG_FORMAT=text - LIFETIME=2592000 # 30 days labels: - "traefik.enable=true" ## HTTP Routers - "traefik.http.routers.oauth-rtr.entrypoints=https" - "traefik.http.routers.oauth-rtr.rule=Host(`oauth.$DOMAINNAME`)" - "traefik.http.routers.oauth-rtr.tls=true" ## HTTP Services - "traefik.http.routers.oauth-rtr.service=oauth-svc" - "traefik.http.services.oauth-svc.loadbalancer.server.port=4181" ## Middlewares - "traefik.http.routers.oauth-rtr.middlewares=chain-oauth@file"

Для Raspberry Pi: используйте тег

arm

для изображения вместо

последнего

. Например, изображение: thomseddon / traefik-forward-auth: 2.1-arm.

Обратите внимание, что мы используем цепочку промежуточного программного обеспечения OAuth (chain-oauth) для аутентификации вместо базовой аутентификации. Перед запуском службы OAuth убедитесь, что вы добавили следующие переменные среды в ваш файл .env :