- Traefik діє як динамічний зворотний проксі-сервер та обробляє сертифікати TLS, тоді як Portainer пропонує графічний інтерфейс для керування Docker та Swarm.
- Поєднання traefik.yml, dynamic.yml та docker-compose.yml дозволяє визначати точки входу, проміжне програмне забезпечення безпеки та маршрутизацію HTTP/HTTPS на основі міток.
- У сценаріях автономного Docker або Swarm просто приєднайте сервіси до мережі проксі-серверів і позначте їх, щоб Traefik міг безпечно їх виявляти та розкривати.
- Використання Let's Encrypt, виділених мереж та базової автентифікації на панелі інструментів консолідує надійне середовище для розгортання кількох програм на одному сервері.
Налаштування сучасного стеку за допомогою Docker, Traefik та Portainer наразі є одним із найпростіших способів керування контейнерами на одному сервері та надання доступу кільком сервісам через HTTPS без зайвих зусиль у налаштуванні. Перевага полягає в тому, що Traefik діє як динамічний зворотний проксі-сервер, тоді як Portainer надає дуже простий веб-інтерфейс для керування Docker та, якщо хочете, Swarm.
У цій статті ви побачите, як підлаштування Traefik як зворотного проксі перед Portainer Як у "класичному" сценарії Docker (автономному), так і в кластері Docker Swarm, як інтегрувати TLS (самовзакріплений або Let's Encrypt) та які файли конфігурації беруть участь (traefik.yml, dynamic.yml y docker-compose.yml) та деякі поширені хитрощі з проміжним програмним забезпеченням, мережами та типовими проблемами тегування в Traefik.
Які ролі відіграють Docker, Traefik та Portainer в архітектурі?
У цьому типі налаштування Docker є базовим рівнем, де працюють контейнери, Traefik діє як зворотний проксі-сервер та балансувальник навантаження , який отримує всі HTTP/HTTPS-запити на портах 80 та 443 та надсилає їх до відповідного контейнера, а Portainer надає графічний інтерфейс для керування образами, контейнерами, томами, мережами та стеками Docker або Swarm.
Ідея полягає в тому, щоб мати один хост з Docker, де Traefik розташований біля «воріт»слухати у точках входу web (80) у websecure (443), розпізнає сертифікати TLS (зазвичай за допомогою Let's Encrypt) та, завдяки інтеграції з провайдером Docker, автоматично виявляє сервіси, які ви надаєте, додаючи мітки до контейнерів.
З іншого боку, Portainer працює як звичайний контейнер, але доступний через певний піддомен, наприклад portainer.tudominio.com, захищений TLS та, за бажанням, за додатковим проміжним програмним забезпеченням автентифікації, що перевищує власний логін Portainer. Все це організовано за допомогою докер-створити що визначає Трефіка, Портейнера та спільну мережу типу proxy.
Очевидна перевага такого підходу полягає в тому, що ви можете розгортати нові сервіси, просто додаючи мітки до своїх контейнерів: Traefik виявляє зміни в Docker, створює маршрутизатори, сервіси та проміжне програмне забезпечення на льоту, і за лічені секунди у вас є новий піддомен або маршрут, який працює, без необхідності вручну торкатися статичних файлів конфігурації.
Статична конфігурація Traefik: traefik.yml
Статична конфігурація Traefik зазвичай зберігається у файлі типу traefik.ymlякий монтується всередині контейнера. Тут він визначений панель інструментів, точки входу, постачальники та розпізнавач сертифікатів Давайте зашифруємо, серед іншого.
Типова конфігурація YAML починається з активації API та панелі керування за допомогою чогось на кшталт api: dashboard: trueЦе дозволяє отримати доступ до веб-інтерфейсу, де можна переглядати маршрутизатори, служби та проміжне програмне забезпечення. Ця панель не автентифікована за замовчуванням, тому пізніше ми побачимо, як захистити її за допомогою базової автентифікації з динамічної конфігурації.
Далі визначаються точки входу. Зазвичай, є точка входу web у порту 80 та інші websecure в 443, У Росії web Автоматичне перенаправлення зазвичай налаштовується для websecureщоб будь-який HTTP-доступ перенаправлявся на HTTPS:
Типовий план містить розділ http.redirections.entryPoint.to: websecure щоб примусово перенаправити та централізувати весь зашифрований трафік у безпечній точці входу.
в websecure Вказано, що слід використовувати TLS, і надано посилання. certResolver (наприклад, letsencrypt), який буде відповідати за автоматичне керування сертифікатами. Все це підтримується ACME, що є протоколом, який Let's Encrypt використовує для видачі та поновлення сертифікатів.
У блоці провайдери Постачальник Docker налаштовано, вказує на сокет unix:///var/run/docker.sockз одним ключовим варіантом: exposedByDefault: falseЗавдяки цьому Traefik не публікує всі контейнери за замовчуванням; лише ті, що мають позначку traefik.enable=trueВи також можете налаштувати постачальника файлів (file) щоб завантажити додаткову динамічну конфігурацію, наприклад, з /configurations/dynamic.yml.
Зрештою, статичний файл зазвичай містить розділ certificatesResolversде визначено резолвер ACME: реєстраційна електронна адреса, файл сховища (зазвичай acme.json), тип ключа (наприклад EC384) та метод перевірки (наприклад httpChallenge на точці входу webВажливо, щоб налаштувати справжню електронну пошту у цьому розділі, оскільки Let's Encrypt використовує його для сповіщень та поновлень; якщо ви залишите фіктивне або неправильно сформоване значення, ви можете зіткнутися з помилками під час запуску контейнера Traefik.
Окрім цієї конфігурації YAML, існують розгортання, які використовують Формат TOML (traefik.toml)Але логіка та сама: вони розділяють сертифікати резолвера (наприклад [certificatesResolvers.main.acme]), визначити виклики (такі як dnsChallenge з provider = "route53") та додайте параметри TLS за замовчуванням, такі як forzar minVersion = "VersionTLS13" або налаштувати список cipherSuites дозволено.
Динамічна конфігурація: проміжне програмне забезпечення, TLS та безпека
Динамічна частина Traefik зазвичай зберігається у файлі типу dynamic.yml, завантажений постачальником файлів. Тут ви визначаєте проміжне програмне забезпечення та опції TLS який можна змінити без перезапуску контейнера Traefik, що дуже корисно для налаштування безпеки на льоту.
Типовим випадком є, наприклад, створення проміжного програмного забезпечення заголовків secureHeadersщо додає політики, пов’язані з HSTS та обов’язковим використанням HTTPS. У YAML ви можете знайти такі параметри, як sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true і stsSeconds високий (наприклад, рік у секундах). Це посилює безпеку трафіку з боку браузера.
Ще одним поширеним проміжним програмним забезпеченням є, наприклад, програмне забезпечення для базової автентифікації. user-auth типу basicAuth, де список користувачів оголошується у форматі usuario:hashХеш зазвичай генерується за допомогою htpasswd і вбудовано у файл. Це проміжне програмне забезпечення зазвичай пов'язане з маршрутизатором панелі інструментів Traefik, тому, окрім доступу HTTPS, воно вимагає імені користувача та пароля.
В межах однієї динамічної конфігурації часто можна побачити блок tls.options з профілем за замовчуванням (default), де, наприклад, встановлено підтримувані шифри та мінімальну версію TLS VersionTLS12У деяких розгортаннях визначено кілька опцій (наприклад, профіль під назвою tls12 та інші default) щоб за потреби адаптувати рівень безпеки до різних служб.
У середовищах, де бажано використовувати TLS також внутрішньо Між Traefik та серверними сервісами (такими як Portainer) може виникнути проблема, якщо ці сервіси не мають сертифіката, розпізнаного публічним центром сертифікації. Саме тут і виникає ця опція. insecureSkipVerify, який, налаштований відповідно до providers.http.tls або у відповідних опціях TLS це дозволяє Traefik обійти перевірку сертифікатів на сервері. Це корисно для лабораторних середовищ або внутрішніх самопідписаних сертифікатів, але слід використовувати з обережністю, оскільки це полегшує перевірку.
Практична деталь: файл dynamic.yml Його можна редагувати на льоту.Traefik перезавантажує динамічну конфігурацію без потреби перезавантаження, тому ви можете додавати або видаляти проміжне програмне забезпечення, змінювати заголовки безпеки або модифікувати базову автентифікацію, не впливаючи на доступність проксі-сервера.
docker-compose з Traefik та Portainer в автономному режимі Docker
У сценарії з порожнім Docker, без Swarm, найпоширенішим кроком є запуск Traefik та Portainer з одним docker-compose.yml який визначає як сервіси, так і спільну мережу типу мосту, яка називається, наприклад, proxy.
Послуга Traefik Зазвичай використовується офіційне зображення, наприклад traefik:latest або певну версію, наприклад traefik:v3.4Порти відображені. 80 і 443 для веб-трафіку та, в деяких прикладах, порт 8080 для внутрішнього відображення панелі керування. Крім того, додано опцію restart: unless-stopped а безпека посилена завдяки security_opt: - no-new-privileges:true щоб зменшити ризик ескалації привілеїв у контейнері.
Щодо томів, Traefik потрібно змонтувати Docker-сокет лише для читання (/var/run/docker.sock:/var/run/docker.sock:ro) для виявлення контейнерів, статичного файлу traefik.yml та каталог, де буде збережено динамічну конфігурацію (./traefik-data/configurations:/configurationsФайл також монтується. acme.jsonТут Traefik зберігає сертифікати, видані Let's Encrypt. Цей файл створюється на хості та отримує дозволи. 600 щоб лише відповідний користувач міг його читати та записувати; якщо залишити значення 644, Traefik зазвичай скаржиться.
Ключ до магії Трефіка полягає в тому, сервісні етикеткиСеред іншого, ви знайдете: traefik.enable=true (щоб постачальник Docker надавав доступ до цього сервісу), traefik.docker.network=proxy (вказує, яку мережу Traefik має використовувати для зв'язку з контейнером), а також маршрутизатор, наприклад traefik.http.routers.traefik-secure, з мітками, що визначають його точку входу (websecure), правило хоста (наприклад Host(`traefik.tudominio.com`)), пов'язана послуга (api@internal) та проміжне програмне забезпечення автентифікації (user-auth@file).
Сервіс Портейнер в тому ж docker-compose.yml зазвичай використовує portainer/portainer-ce:latest (або Enterprise Edition, якщо у вас є ліцензія). Монтуються аналогічні томи: сокет Docker, папка даних (./portainer-data:/data) і часто також /etc/localtime щоб він успадкував часовий пояс хоста.
Етикетки Portainer реєструють його в Traefik: traefik.enable=true, traefik.docker.network=proxyмаршрутизатор такого типу traefik.http.routers.portainer-secure з точкою входу websecure і правило хоста, таке як Host(`portainer.tudominio.com`)Крім того, визначено сервіс, який має використовувати Traefik, вказуючи на внутрішній порт Portainer, наприклад, за допомогою traefik.http.services.portainer.loadbalancer.server.port=9000.
З усім цим у розпалі, після запуску docker compose up -d У каталозі стека Traefik завантажує зображення та створює мережу. proxy Якщо його оголошено як зовнішній та він надає доступ до обох панелей у налаштованих піддоменах, то Автоматичний HTTPS завдяки Let's EncryptЗ цього моменту додавання нових сервісів – це питання клонування вашого проєкту, додавання кількох міток Traefik та підключення його до мережі. proxy.
Сценарій Docker Swarm: Portainer та Traefik у кластері
Коли ви активуєте Docker Swarm, ситуація дещо змінюється, оскільки сервіси розгортаються як стеки, а мережі зазвичай базуються на накладках. Однак, базова логіка Traefik та Portainer дуже схожа: Traefik продовжує діяти як зворотний проксі-сервер та динамічний пошуковик сервісів, а Portainer може працювати як в автономному режимі, так і в режимі Portainer + агент для керування віддаленими вузлами в кластері.
У типовому розгортанні Swarm стек створюється перед його застосуванням. дві мережі накладання який Traefik використовуватиме для маршрутизації трафіку між вузлами. Крім того, створюється том для зберігання даних Portainer (наприклад) portainer_data) і, якщо вам це потрібно, один для acme.json або каталог, де Traefik зберігає сертифікати та конфігурацію.
El docker-compose.yml (який потім розгортається з docker stack deploy використовуючи, наприклад, -c portainer.yml) зазвичай визначає дві послуги: Агент з перевезення, який працює в режимі global на всіх вузлах Linux та головна служба Portainer (CE або EE), яка зазвичай залишається в реплікованому режимі з обмеженням запуску лише на менеджерах.
Агент Portainer монтує сокет Docker та каталог тому (/var/lib/docker/volumes) щоб мати змогу перевіряти ресурси. Він підключається до мережі оверлею, яку використовуватиме спільно з Traefik, наприклад traefik_publicГоловний сервіс Portainer можна налаштувати для зв'язку з агентом через TCP (tcp://tasks.agent:9001) і, власне, у деяких прикладах ця команда показана за допомогою --tlsskipverify прокоментував, щоб пропустити перевірку TLS, якщо це необхідно.
На тому ж стеку або іншому, Traefik запускається з провайдером Docker у режимі Swarm (swarmMode = true у TOML або еквівалентний параметр у прапорцях), спостерігаючи за позначеними сервісами. Його конфігурація включає certificatesResolvers.main.acme для Let's Encrypt, a dnsChallenge з таким постачальником, як Маршрут53 Якщо ви хочете перевірити сертифікати за допомогою DNS та блоку tls.options де, наприклад, це змушено minVersion = "VersionTLS13" для профілю за замовчуванням, і чітко визначено список cipherSuites для профілю TLS 1.2.
Етикетки Portainer у Swarm дотримуються тієї ж філософії: traefik.enable=trueмаршрутизатор, як traefik.http.routers.portainer з Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (згідно з назвою), та traefik.http.routers.portainer.tls=true щоб увімкнути TLS на цьому маршрутизаторі. Крім того, ви можете вказати сертифікатрозв'язувач з traefik.http.routers.portainer.tls.certresolver=main та схему серверної частини, якщо служба внутрішньо використовує HTTPS за допомогою traefik.http.services.portainer.loadbalancer.server.scheme=https.
У журналах налагодження Traefik у Swarm ви побачите згенеровану конфігурацію: маршрутизатори, такі як api y portainer, виявлені сервіси (наприклад portainer en http://10.0.1.12:9000 та послугу traefik (вказуючи на порт 8080 панелі інструментів), і, якщо є проблема з погано визначеними мітками, повідомлення типу "Не вдалося визначити назву служби для маршрутизатора: забагато служб"які зазвичай вказують на конфлікт або дублювання служб, пов'язаних з маршрутизатором.
Мінімальний приклад: whoami, маршрути та TLS з Traefik
Перш ніж розглядати Portainer, цілком практично спробувати Traefik з дуже простим бекендом, як на зображенні. traefik/whoamiякий повертає інформацію про запит. Це допомагає вам перевірити, чи правильно налаштовано Traefik, а правила маршрутизації працюють.
Un docker-compose.yml базовий може включати послугу traefik із зображенням traefik:v3.4, монтуючи сокет Docker та визначаючи прапорці завантаження як --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy і точка входу --entryPoints.web.address=:80Порти 80 та 8080 рекламуються на хості, і створюється мережа. proxy який також використовуватиме контейнер whoami.
Послуга whoami Він починається в тій самій мережі та позначений traefik.enable=trueТоді маршрутизатор визначається з міткою traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) і зазначено, що ваша точка входу — webЯкщо ви робите запит з curl -H "Host: whoami.docker.localhost" http://localhost/Ви побачите відповідь з іменем хоста, IP-адресами, заголовками тощо, що підтверджує правильність маршрутизації Traefik.
Звідти все просто. додати маршрутизацію за шляхамиНаприклад, ви можете створити ще один сервіс. whoami-api з тим самим зображенням, в тій самій мережі, та позначити його правилом типу Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Таким чином, корінь / йти до whoami оригінал та запити до /api служитиме їм whoami-apiВи можете перевірити це, надіславши запити до / вже /api з тим самим господарем.
Для активації TLS У цьому локальному середовищі одним із варіантів є створення самопідписаного сертифіката для домену. *.docker.localhost з opensslВи створюєте каталог certs, ви генеруєте local.key y local.crt, а потім ви додаєте динамічний файл (наприклад dynamic/tls.yml) з розділом tls: і маршрути certFile y keyFile вказуючи на ці файли.
Далі ви оновлюєте визначення служби Traefik у docker-compose.yml щоб змонтувати папку ./certs і папку ./dynamic всередині контейнера ви активуєте безпечний API за допомогою --api.dashboard=true, ви створюєте точку входу websecure (--entryPoints.websecure.address=:443) та увімкніть там TLS за допомогою --entryPoints.websecure.http.tls=trueВи також позначаєте маршрутизатор панелі інструментів та маршрутизатори whoami для їх використання websecure і мати tls=true.
Як тільки все буде готово, ви зможете отримати доступ https://whoami.docker.localhost/ і до панелі Traefik із самопідписаним сертифікатом, приймаючи попередження безпеки браузера. Цей досвід дуже схожий на те, що ви пізніше матимете у продакшені з Let's Encrypt, але без залежності від публічних DNS-серверів.
Найкращі практики, розгортання програм та вирішення типових проблем
Одна закономірність, яка повторюється в усіх цих прикладах, полягає в тому, що Traefik значно спрощує розгортання нових програмЯк тільки у вас буде базовий стек (Traefik + Portainer + мережа) proxy (+ сертифікати), додавання нової послуги зазвичай зводиться до:
Клонуйте проєкт або скопіюйте свій docker-compose.yml до сервера, вказати піддомен на IP-адресу хоста за допомогою запис А у вашому DNS (наприклад app.tudominio.com), а потім додайте ключові мітки до служби: traefik.enable=true, traefik.docker.network=proxy і маршрутизатор із правилом хоста для цього піддомену, що вказує безпечну точку входу websecure у-ель- послуга з правильним внутрішнім портом.
Багато навчальних посібників показують, наприклад, розгортання невеликої програми FastAPI Розділено: додаються чотири мітки, що гарантують приєднання до мережі proxy у розділі networks Дель docker-compose.ymlі після того, як зробив docker compose up -d Додаток автоматично відображається на панелі інструментів Traefik з увімкненим TLS. Автоматичне виявлення Traefik означає, що вам навіть не потрібно налаштовувати його статичні налаштування.
Щоб все пройшло гладко, важливо звернути увагу на кілька деталей: Не використовуйте той самий ідентифікатор маршрутизатора повторно У різних програмах перевірте, чи з кожним маршрутизатором пов’язано лише одну службу (щоб уникнути помилки «занадто багато служб»), використовуйте узгоджені назви мереж (наприклад, proxy на всіх стеках, які ви хочете розкрити), і, якщо ви використовуєте Let's Encrypt, переконайтеся, що acme.json Він має дозволи 600, а налаштована електронна адреса є дійсною.
У середовищах Swarm також перевірте, чи конфігурація Traefik містить постачальника Docker. swarmMode=true y watch=trueі що обмеження послуг (наприклад node.role == manager (для Portainer) не конфліктують з місцем розгортання Traefik. Журнали налагодження дуже детальні, але є ключовими для виявлення проблем маршрутизації або TLS.
Поєднавши Docker, Traefik та Portainer, ви можете налаштувати повноцінне легке середовище оркестрації на одному сервері з графічними панелями інструментів, автоматичними сертифікатами та дуже швидким процесом розгортання, де додавання, оновлення або видалення сервісів зводиться до налаштування кількох рядків YAML та дозволяє Traefik виконувати брудну роботу зворотного проксування та TLS.
