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

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

4 504
Содержание
Конфигурация 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?
  • Преимущества обратного прокси
  • Альтернативы Traefik – Nginx Proxy и HAProxy

Короче говоря, мы будем использовать 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 :

  • GOOGLE_CLIENT_ID и GOOGLE_CLIENT_SECRET. Получено в соответствии с нашим руководством по OAuth 2.0 от Traefik.

  • OAUTH_SECRET: это используется для подписи куки и должно быть случайным. Создать случайный секрет с:

    openssl rand -hex 16

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

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

    Случайный OAuth Secret

  • MY_EMAIL: идентификатор электронной почты Google, который будет использоваться для аутентификации.

  • URL_PATH: это тот же путь, что и в URI авторизованного перенаправления (https://oauth.example.com / _oauth ), как описано в нашем руководстве по OAuth 2.0 для Traefik Google.

Если вы хотите, чтобы несколько идентификаторов электронной почты могли проходить проверку подлинности и получать доступ к вашим службам, используйте разные переменные (например, MY_EMAIL2, MY_EMAIL3 и т.д.) И перечислите их все через запятую для WHITELIST :

- WHITELIST=$MY_EMAIL,$MY_EMAIL2,$MY_EMAIL3

Вы также можете изменить продолжительность (LIFETIME ), для которой аутентификация действительна, с 30 дней, указанных в секундах, на другую продолжительность.

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

После этого используйте команду docker-compose up, указанную выше, или ярлык dcup2, если у вас есть настройка bash_aliases. Теперь вы должны быть перенаправлены на страницу входа в Google OAuth, прежде чем обращаться к службе.

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

Логин Google OAuth для сервисов Docker

Переконфигурируйте Traefik 2 Dashboard для использования OAuth

На этом этапе наша панель мониторинга обратного прокси-сервера Traefik настроена на использование базовой аутентификации. Давайте теперь изменим его на использование Google OAuth. Теперь это так же просто, как изменить chain-basic-auth на chain-oauth в файле docker-compose (показано ниже).

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

Итак, все готово, настройка Docker Traefik 2 с помощью Google OAuth 2.

После этого используйте команду docker-compose up, указанную выше, или ярлык dcup2, если у вас есть настройка bash_aliases.

Добавление приложений в домашний стек Traefik 2 Docker

Теперь, когда наши Traefik 2 и OAuth работают, давайте начнем добавлять некоторые приложения. Ранее я приводил примеры некоторых приложений, которые я хотел, чтобы мой сервер Traefik 2 Docker работал.

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

После того, как вы прочитали и поняли данное руководство, оно должно быть довольно простым в использовании докер-Compose фрагменты из нашего GitHub Репо, чтобы настроить другие приложения, которые вы заинтересованы в (Repo Ананда и Repo Сета ).

Portainer с Traefik 2 и OAuth

Мы рассмотрели установку Portainer ранее. Portainer предоставляет веб-интерфейс для управления всеми вашими док-контейнерами. Я настоятельно рекомендую это для новичков. Вот код для добавления (copy-paste) в файл docker-compose (обратите внимание на пробелы в начале каждой строки):

# Portainer - WebUI for Containers portainer: container_name: portainer image: portainer/portainer:latest restart: unless-stopped command: -H unix:///var/run/docker.sock networks: - t2_proxy security_opt: - no-new-privileges:true # ports: # - "$PORTAINER_PORT:9000" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - $USERDIR/docker/portainer/data:/data environment: - TZ=$TZ labels: - "traefik.enable=true" ## HTTP Routers - "traefik.http.routers.portainer-rtr.entrypoints=https" - "traefik.http.routers.portainer-rtr.rule=Host(`portainer.$DOMAINNAME`)" - "traefik.http.routers.portainer-rtr.tls=true" ## Middlewares # - "traefik.http.routers.portainer-rtr.middlewares=chain-no-auth@file" # No Authentication # - "traefik.http.routers.portainer-rtr.middlewares=chain-basic-auth@file" # Basic Authentication - "traefik.http.routers.portainer-rtr.middlewares=chain-oauth@file" # Google OAuth 2.0 ## HTTP Services - "traefik.http.routers.portainer-rtr.service=portainer-svc" - "traefik.http.services.portainer-svc.loadbalancer.server.port=9000"

Настройка:

  1. PORTAINER_PORT: номер порта, для которого вы хотите, чтобы веб-интерфейс Portainer был доступен по адресу. Это может быть тот же порт, что и контейнер: 9000 (должен быть свободен). Установите PORTAINER_PORT в вашем .env файле. Указывать порты необязательно, так как мы используем обратный прокси и можем связаться с portainer по адресу portainer.example.com.
  2. Аутентификация: включена только цепочка промежуточного программного обеспечения OAuth. Если вам нужна базовая аутентификация или нет аутентификации, раскомментируйте соответствующую строку и закомментируйте другие промежуточные программы.

После этого используйте команду docker-compose up, указанную выше, или ярлык dcup2, если у вас есть настройка bash_aliases.

Веб-интерфейс Portainer должен быть доступен по адресу https://portainer.example.com.

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

Portainer с Traefik 2 SSL-сертификат LetsEncrypt Wildcard

Traefik 2, похоже, использует правильные сертификаты SSL.

Organizr – унифицированный веб-интерфейс HTPC / Home Server

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

По сути, Organizr похож на HTPC Manager или Muximux.

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

# Organizr - Unified Frontend organizr: container_name: organizr image: organizrtools/organizr-v2:latest restart: unless-stopped networks: - t2_proxy security_opt: - no-new-privileges:true # ports: # - "$ORGANIZR_PORT:80" volumes: - $USERDIR/docker/organizr:/config environment: - PUID=$PUID - PGID=$PGID - TZ=$TZ labels: - "traefik.enable=true" ## HTTP Routers - "traefik.http.routers.organizr-rtr.entrypoints=https" - "traefik.http.routers.organizr-rtr.rule=Host(`$DOMAINNAME`,`www.$DOMAINNAME`)" - "traefik.http.routers.organizr-rtr.tls=true" ## Middlewares - "traefik.http.routers.organizr-rtr.middlewares=chain-oauth@file" ## HTTP Services - "traefik.http.routers.organizr-rtr.service=organizr-svc" - "traefik.http.services.organizr-svc.loadbalancer.server.port=80"

Как описано для Portainer (выше), включите и настройте порты и разделы среды по мере необходимости. Добавьте отсутствующие переменные среды в .env. Сохраните и обновите свой стек (ярлык dcup2 с моим примером bash_aliases).

Почему я включил Organizr в качестве примера?

Обратите внимание на следующую строку:

- "traefik.http.routers.organizr-rtr.rule=Host(`$DOMAINNAME`,`www.$DOMAINNAME`)"

Мы настраиваем Organizr для обслуживания в моем корневом домене (example.com или www.example.com). Так что это будет лицом моей области. Оттуда у нас есть ссылки на все мои приложения.

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

У меня есть только 4 основных приложения в качестве вкладок и 5-я вкладка для Heimdall. Heimdall похож на Organizr и показывает ссылки на остальные мои приложения. Вы можете найти фрагмент кода, составленный докером Heimdall, в моем репозитории GitHub.

Рекомендуемые приложения Media Center Companion:

MariaDB – база данных MySQL

В моем первоначальном руководстве по серверу Docker многие хотели использовать MariaDB, который является одним из наиболее часто используемых серверов баз данных. В моем случае Home Assistant (Hass.io), Guacamole, StatPing и ZoneMinder все записывают данные в базы данных MariaDB.

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

# MariaDB - MySQL Database mariadb: container_name: mariadb image: linuxserver/mariadb:latest restart: always networks: t2_proxy: ipv4_address: 192.168.90.250 security_opt: - no-new-privileges:true ports: - "3306:3306" volumes: - $USERDIR/docker/mariadb/data:/config - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro environment: - PUID=$PUID - PGID=$PGID - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD

Как описано для Portainer (выше), включите и настройте раздел среды по мере необходимости. Добавьте отсутствующие переменные среды в .env. Сохраните и обновите свой стек (ярлык dcup2 с моим примером bash_aliases).

Почему я включил MariaDB в качестве примера?

Обратите внимание, что мы указываем статический IP-адрес для контейнера MariaDB (192.168.90.250), как я это делал для Traefik 2 Dashboard.

Кроме того, мы сопоставляем порт 3306 контейнера с портом 3306 хоста. Я могу связаться с MariaDB через HOST-IP: 3306 или 192.168.90.250:3306. Конечно, это избыточно, и я могу отключить раздел портов (и использовать только 192.168.90.250:3306) или не назначать статический IP-адрес контейнеру MariaDB.

Гуакамоле – Удаленный рабочий стол на основе HTML 5, SSH, на Telnet Gateway

Apache Guacamole – это клиентский шлюз удаленного рабочего стола. Он поддерживает стандартные протоколы, такие как VNC, RDP и SSH. Он не нуждается в плагинах или программном обеспечении и работает из любого современного браузера. На мой взгляд, это необходимо для администраторов. [ Читайте: Установите Гуакамоле на Docker – VNC, SSH, SFTP и RDP, как Босс! ]

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

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

# Guacamole - Remote desktop, SSH, on Telnet on any HTML5 Browser guacamole: image: guacamole/guacamole:latest container_name: guacamole restart: unless-stopped networks: - t2_proxy security_opt: - no-new-privileges:true # ports: # - "$GUACAMOLE_PORT:8080" environment: GUACD_HOSTNAME: guacd MYSQL_HOSTNAME: $DB_HOST MYSQL_PORT: $DB_PORT MYSQL_DATABASE: guacamole MYSQL_USER: $GUAC_MYSQL_USER MYSQL_PASSWORD: $GUAC_MYSQL_PASSWORD labels: - "traefik.enable=true" ## HTTP Routers - "traefik.http.routers.guacamole-rtr.entrypoints=https" - "traefik.http.routers.guacamole-rtr.rule=Host(`guac.$DOMAINNAME`)" - "traefik.http.routers.guacamole-rtr.tls=true" ## Middlewares - "traefik.http.routers.guacamole-rtr.middlewares=chain-oauth@file,add-guacamole" - "traefik.http.middlewares.add-guacamole.addPrefix.prefix=/guacamole" ## HTTP Services - "traefik.http.routers.guacamole-rtr.service=guacamole-svc" - "traefik.http.services.guacamole-svc.loadbalancer.server.port=8080"

Как описано для Portainer (выше), включите и настройте порты и разделы среды по мере необходимости. Добавьте отсутствующие переменные среды в .env. Сохраните и обновите свой стек (ярлык dcup2 с моим примером bash_aliases).

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

Почему я включил гуакамоле в качестве примера?

Обратите внимание, что у нас есть раздел ссылок. Гуакамоле нужен демон Гуакамоле (guacd), чтобы он тоже работал. Это работает как отдельный контейнер (см. Мой репозиторий GitHub для Docker Compose). Если контейнер guacd не работает, Guacamole не запустится или не выдаст ошибку.

Основная причина, по которой я привожу в качестве примера гуакамоле, – демонстрация промежуточного программного обеспечения addPrefix.prefix. Если я захожу на guac.example.com, я перехожу на страницу, показанную ниже, которая является общей страницей с некоторой информацией, а не страницей входа в Гуакамоле, на которую я хочу попасть.

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

Гуакамоле без добавленияПрефиксное программное обеспечение Traefik

Страница входа доступна по адресу guac.example.com/guacamole. Вместо того, чтобы вводить / гуакамоле вручную, я могу определить как промежуточное ПО addPrefix.prefix :

- "traefik.http.middlewares.add-guacamole.addPrefix.prefix=/guacamole"

Затем вы можете активировать это промежуточное программное обеспечение, добавив add-guacamole к метке middlewares, как показано в примере с docker-compose Guacamole выше. Это приводит к тому, что guac.example.com/guacamole будет обслуживаться через guac.example.com.

Еще одно приложение, которое использует промежуточное ПО addPrefix.prefix, – это PiHole (будет описано позже). Тем не менее, это не работает для всех приложений. Например, это не работает для ZoneMinder, которому нужен префикс / zm /.

qBittorrent – торрент-загрузчик

qBittorrent – один из моих любимых кроссплатформенных клиентов BitTorrent. Я использую Transmission Bittorrent с IPVanish VPN. Но есть причина, по которой я включил qBittorrent в качестве примера.

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

# qBittorrent - Torrent downloader qbittorrent: image: linuxserver/qbittorrent:latest container_name: qbittorrent restart: always network_mode: container:transmission-vpn security_opt: - no-new-privileges:true volumes: - $USERDIR/docker/qbittorrent:/config - $USERDIR/Downloads:/downloads environment: PUID: $PUID PGID: $PGID TZ: $TZ UMASK_SET: 002 WEBUI_PORT: 8168 labels: - "traefik.enable=true" ## HTTP Routers - "traefik.http.routers.qbittorrent-rtr.entrypoints=https" - "traefik.http.routers.qbittorrent-rtr.rule=Host(`qbit.$DOMAINNAME`)" - "traefik.http.routers.qbittorrent-rtr.tls=true" ## Middlewares - "traefik.http.routers.qbittorrent-rtr.middlewares=chain-oauth@file" ## HTTP Services - "traefik.http.routers.qbittorrent-rtr.service=qbittorrent-svc" - "traefik.http.services.qbittorrent-svc.loadbalancer.server.port=8168"

Как описано для Portainer (выше), включите и настройте порты и разделы среды по мере необходимости. Добавьте отсутствующие переменные среды в .env. Сохраните и обновите свой стек (ярлык dcup2 с моим примером bash_aliases).

Обратите внимание, что порт qBittorrent по умолчанию – 8080. Я использую другой порт (8168), и это указано в моих настройках qBittorrent. Скорее всего, вам придется изменить 8168 на 8080 (2 экземпляра).

Почему я включил qBittorrent в качестве примера?

Как я уже говорил, мы настроили передачу с IPVanish VPN. Если VPN не подключен, передача будет остановлена. Смотрите мой репозиторий GitHub для передачи с помощью фрагмента VPN Docker Compose.

Эксклюзивное предложение IPVanish VPN – всего $ 3,25 в месяц :

Руководства по VPN
Windows, Android, Ubuntu
Kodi OpenVPN
OSMC на RPi

♦ Скрыть ваш просмотр (без журналов), анонимизировать потоковое вещание и загрузки
♦ Обойти географические / страновые ограничения и доступ к всемирному контенту
♦ Работать на Windows, Mac, Linux, Android, iOS, маршрутизаторе и т.д.
♦ 250 ГБ SugarSync Безопасное хранилище включено
♦ Деньги гарантия возврата – Зарегистрируйтесь сейчас

Мы используем существующее VPN-соединение в контейнере передачи, чтобы оставить qBittorrent также позади VPN путем определения сети qBittorrent, как показано ниже:

network_mode: container:transmission-vpn

transmission-vpn – это имя моего контейнера передачи. С помощью этого метода вы можете поместить любой контейнер в ту же сеть, что и другой контейнер. Обратите внимание, что если оба контейнера предоставляют одни и те же порты, могут возникнуть конфликты, и вам может потребоваться настроить порты. Однако это не проблема для Transmission и qBittorrent.

NextCloud – ваше собственное облачное хранилище

NextCloud (например, OwnCloud) предлагает собственное облачное хранилище для управления файлами и документами (например, Google Drive / Docs).

Вы можете найти пример docker-compose для NextCloud на GitHub Repo Сета.

Почему я включил NextCloud в качестве примера?

Если вы решили не включать –serversTransport.insecureSkipVerify = true CLI (закомментируйте его), вам потребуется немного другая настройка. Веб-интерфейс Nextcloud доступен только через порт HTTPS, и хотя Traefik обменивается данными с клиентами внешне, используя сертификат LetsEncrypt, он взаимодействует со службами на стороне сервера по протоколу HTTP.

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

Все конфигурации, с которыми мы работали до сих пор, были для «HTTP» маршрутизаторов Traefik, но Traefik v2 также предлагает возможность настройки TCP-маршрутизаторов. TCP-сервис Traefik имеет сквозную опцию, которая позволяет нам «проходить» через наше защищенное соединение с Nextcloud. Метки, которые нам нужно будет использовать:

#### SEE GITHUB LINKED ABOVE FOR REST OF THE DOCKER-COMPOSE ## TCP Routers - "traefik.tcp.routers.nextcloud-tcp.entrypoints=https" - "traefik.tcp.routers.nextcloud-tcp.rule=HostSNI(`nextcloud.$DOMAINNAME`)" - "traefik.tcp.routers.nextcloud-tcp.tls=true" # - "traefik.tcp.routers.nextcloud-tcp.tls.certresolver=dns-cloudflare" - "traefik.tcp.routers.nextcloud-tcp.tls.passthrough=true" ## TCP Services - "traefik.tcp.routers.nextcloud-tcp.service=nextcloud-tcp-svc" - "traefik.tcp.services.nextcloud-tcp-svc.loadbalancer.server.port=443"

Здесь вы можете увидеть, что нам нужно использовать правило HostSNI на TCP-маршрутизаторах, чтобы указать, какой входящий адрес должен прослушивать Traefik.

Причина, по которой я включил TCP только для одной из моих служб, заключается в том, что вы не можете добавить промежуточное ПО для маршрутов TCP. Это означает, прежде всего, что вы не можете добавить basic-auth или OAuth к этим обычно очень чувствительным интерфейсам.

Другие приложения

В нашей настройке сервера Docker Traefik 2 есть еще несколько приложений. Приведенные выше примеры показывают большинство возможностей.

Примеры докер-Compose для более чем 50 приложений, проверьте наш текущий GitHub Репо (Repo Ананда и Repo Сета ). Эти репозитории включают в себя такие приложения, как Radarr, Sonarr, Lidarr, SABnzbd и другие.

Usenet лучше, чем торренты:

Для таких приложений, как Sonarr, Radarr, SickRage и CouchPotato, Usenet лучше, чем Torrents. Безлимитные тарифные планы от Newshosting (серверы США), Eweka (серверы ЕС) или UsenetServer, которые предлагают срок хранения> 3000 дней, SSL для конфиденциальности и VPN для анонимности, лучше для контента HD.

Добавление не докеров или внешних приложений за Traefik

Traefik v2 хорошо работает для всех наших служб в сети Docker, но как насчет подключения к другим хостам за пределами Docker? У нас есть несколько из них (например, Home Assistant, PiHole). Traefik также может реверсировать их через прокси, и это легко реализовать.

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

Для этого примера мы создадим новый маршрут к внешнему PiHole, работающему на Raspberry Pi. Давайте создадим файл app-pihole.toml в папке с правилами и добавим в него следующий контент.

[http.routers] [http.routers.pihole-rtr] entryPoints = ["https"] rule = "Host(`pihole.example.com`)" service = "pihole-svc" middlewares = ["chain-oauth", "pihole-add-admin"] [http.routers.pihole-rtr.tls] certresolver = "dns-cloudflare" [http.middlewares] [http.middlewares.pihole-add-admin.addPrefix] prefix = "/admin" [http.services] [http.services.pihole-svc] [http.services.pihole-svc.loadBalancer] passHostHeader = true [[http.services.pihole-svc.loadBalancer.servers]] url = "http://192.168.1.26:80" # or whatever your external host's IP:port is

Как видите, есть три раздела: маршрутизаторы, промежуточное программное обеспечение и службы. Интерфейс PiHole будет доступен на pihole.example.com. Служба (бэкэнд) будет доступна по адресу 192.168.1.26:80, который является IP-адресом Raspberry Pi, на котором работает PiHole.

Кроме того, у нас также есть промежуточное ПО pihole-add-admin. Это промежуточное ПО является промежуточным ПО с префиксом, которое я объяснил ранее для гуакамоле. Он автоматически добавит окончание / admin к pihole.example.com и перенесет нас прямо на страницу администратора, а не на страницу ниже.

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

PiHole без надстройкиПрефиксное программное обеспечение Traefik

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

Приложения для устранения неполадок

Вот некоторые проблемы, с которыми я столкнулся или уже упоминал другие.

Трафик 2 не тянет SSL-сертификаты

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

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

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

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

Помните, что мы добавили этот маршрутизатор certresolver в наш сервис Traefik 2 и прокомментировали его после извлечения сертификатов подстановочных знаков. Мы не добавили это ни в какой другой сервис. Добавление этого, кажется, решает проблему для некоторых.

Недостатком добавления метки маршрутизатора certresolver к каждой из служб может быть то, что обратный прокси-сервер Traefik будет получать отдельные сертификаты для каждой из служб вместо использования подстановочного сертификата.

Опечатки и неправильное наименование

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

Проверка журналов Traefik 2 может помочь вам понять, в чем проблема. Кроме того, проверьте панель инструментов Traefik 2 для получения дополнительной информации (см. Ниже).

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

Ошибка маршрутизатора Traefik v2 на панели инструментов

В случае с Portainer при копании глубже панель инструментов Traefik 2 обнаружила, что Traefik 2 не может найти middlewares.chain-no-auth.

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

Сведения об ошибках маршрутизатора Traefik 2.0

Это должно было быть middlewares-chain-no-auth (- вместо.). Как только я исправил эту проблему, Portainer сразу начал.

Инструменты для проверки журналов

Недавно один из моих последователей на GitHub рекомендовал Dozzle. Я быстро стал большим поклонником этого. Dozzle позволяет отслеживать журналы всех ваших док-контейнеров в режиме реального времени. Это помогает диагностировать и устранять проблемы.

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

Следующие журналы с Dozzle

Вы можете найти пример docker-compose для Dozzle в моем репозитории GitHub.

Docker Traefik 2 Home Server – Заключительные мысли

В этом руководстве я объединил три моих предыдущих (медиа-сервер Docker, Traefik 1 и Google OAuth).) в одно. Как видите, он оказался длинным. Но он предоставляет универсальное решение для реализации обратного прокси-сервера Traefik 2 для сервисов Docker.

Как упоминалось ранее, одним из основных преимуществ обратного прокси-сервера является возможность выставлять приложение в Интернете, не раскрывая свои порты. Если вы успешно внедрили обратный прокси-сервер для докера, на этом этапе я настоятельно рекомендую отключить переадресацию портов на вашем маршрутизаторе (за исключением 80 и 443, которые нужны Traefik). Вы по-прежнему сможете получать доступ к своим приложениям, используя IP-адрес: порт из домашней сети.

Traefik 2 может сильно отличаться от Traefik 1. Но на самом деле они больше похожи, чем нет. Надеемся, что это руководство сломало все достаточно, чтобы вы поняли концепции.

Этот пост был соавтором Сета, без чьей помощи мне было бы сложно перейти с Traefik 1 на 2. Мы ни в коем случае не являемся «экспертами» по этой теме. Поэтому, если у вас есть лучший способ сделать то, что мы сделали, пожалуйста, не стесняйтесь делиться комментариями, и мы ответим и обновим руководство, если это необходимо.

В противном случае, мы надеемся, что это руководство по установке Traefik 2 Docker Home Server помогло вам выполнить то, что вы намеревались сделать.

Источник записи: https://www.smarthomebeginner.com

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