Що таке Traefik і навіщо він потрібен?
Уявіть, що у вас є сервер, на якому працює кілька веб-додатків у Docker контейнерах. Кожен додаток має свій порт, і вам треба:
- Підключити SSL сертифікати для HTTPS
- Налаштувати домени для кожного додатку
- Керувати маршрутизацією трафіку
Traefik – це “розумний шлюз”, який автоматично виконує всі ці завдання за вас.
Як це працює?
Стара схема (без Traefik):
|
1 2 3 4 5 6 |
Інтернет → nginx:443 → ваш додаток ↑ треба вручну налаштовувати SSL треба вручну оновлювати сертифікати окремі налаштування для кожного домену |
Нова схема (з Traefik):
|
1 2 3 4 5 6 7 |
Інтернет → Traefik:443 → nginx:80 → ваш додаток ↓ автоматично отримує SSL автоматично оновлює сертифікати знаходить нові контейнери сам керує всіма доменами |
Переваги Traefik
✅ Автоматичний SSL – Let’s Encrypt сертифікати отримуються та оновлюються автоматично ✅ Один Traefik для багатьох додатків – можна запустити 10 різних проєктів з різними доменами ✅ Не треба редагувати конфіги – просто додаєте labels до контейнера ✅ Автоматичне виявлення – Traefik сам знаходить нові контейнери Docker
Структура проєкту
Після налаштування у вас буде така структура:
|
1 2 3 4 5 6 7 8 9 10 |
~/your-project/ ├── docker-compose-traefik.yml # Конфігурація Traefik ├── docker-compose-php83_delta.yml # Ваш основний проєкт ├── traefik/ │ ├── traefik.yml # Налаштування Traefik │ └── acme.json # SSL сертифікати (створюється автоматично) ├── conf/ ├── www/ └── ... (інші файли проєкту) |
Крок 1: Створюємо окремий docker-compose для Traefik
Створіть файл docker-compose-traefik.yml у вашій папці проєкту:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
version: '3.8' services: traefik: image: traefik:v2.10 container_name: traefik restart: unless-stopped security_opt: - no-new-privileges:true ports: - "80:80" # HTTP порт - "443:443" # HTTPS порт volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik/traefik.yml:/traefik.yml:ro - ./traefik/acme.json:/acme.json networks: - web labels: - "traefik.enable=true" # Dashboard - веб-інтерфейс Traefik (опціонально) - "traefik.http.routers.dashboard.rule=Host(`traefik.crumpel.site`)" - "traefik.http.routers.dashboard.entrypoints=https" - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt" - "traefik.http.routers.dashboard.service=api@internal" # Захист паролем (логін: admin, пароль: password) - "traefik.http.routers.dashboard.middlewares=auth" - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$8evjzEMf$$0CwCmxc6R6PBQkLYz5KhZ0" networks: web: external: true |
📝 Пояснення:
- ports – відкриваємо порти 80 (HTTP) та 443 (HTTPS)
- /var/run/docker.sock – дозволяє Traefik бачити всі Docker контейнери
- networks: web – спільна мережа для всіх додатків
- labels – налаштування Dashboard (веб-панелі керування Traefik)
Крок 2: Створюємо конфігураційний файл Traefik
Створіть папку traefik та файл traefik/traefik.yml:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
api: dashboard: true # Увімкнути веб-панель debug: false # Вимкнути режим налагодження entryPoints: http: address: ":80" http: redirections: entryPoint: to: https # Автоматично перенаправляти HTTP → HTTPS scheme: https https: address: ":443" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false # Не публікувати всі контейнери автоматично network: web # Використовувати мережу 'web' certificatesResolvers: letsencrypt: acme: email: your-email@example.com # ❗ ЗАМІНІТЬ на свій email storage: acme.json httpChallenge: entryPoint: http log: level: INFO # Рівень логування (DEBUG, INFO, WARN, ERROR) |
📝 Пояснення:
- entryPoints – точки входу (порти 80 і 443)
- redirections – автоматично перенаправляє HTTP на HTTPS
- providers.docker – Traefik автоматично знаходить Docker контейнери
- exposedByDefault: false – контейнери треба вручну вмикати через labels
- certificatesResolvers – налаштування Let’s Encrypt для SSL
- httpChallenge – спосіб перевірки домену (найпростіший, не потребує API ключів)
Крок 3: Оновлюємо ваш docker-compose
У вашому файлі docker-compose-php83_delta.yml змініть тільки labels у сервісі nginx:
❌ Було:
|
1 2 3 4 5 6 7 8 |
labels: - "traefik.enable=true" - "traefik.http.routers.telegram-app.rule=Host(`telegram.crumpel.site`)" - "traefik.http.routers.telegram-app.tls.certresolver=cloudflare" - "traefik.http.routers.telegram-app.service=telegram-app" - "traefik.http.services.telegram-app.loadbalancer.server.port=80" - "traefik.docker.network=web" |
✅ Стало:
|
1 2 3 4 5 6 7 8 9 10 |
labels: - "traefik.enable=true" - "traefik.http.routers.telegram-app.rule=Host(`telegram.crumpel.site`)" - "traefik.http.routers.telegram-app.entrypoints=https" # ДОДАНО - "traefik.http.routers.telegram-app.tls=true" # ДОДАНО - "traefik.http.routers.telegram-app.tls.certresolver=letsencrypt" # ЗМІНЕНО - "traefik.http.routers.telegram-app.service=telegram-app" - "traefik.http.services.telegram-app.loadbalancer.server.port=80" - "traefik.docker.network=web" |
📝 Пояснення labels:
- traefik.enable=true – увімкнути Traefik для цього контейнера
- rule=Host(
telegram.crumpel.site) – який домен веде до цього контейнера - entrypoints=https – використовувати HTTPS (порт 443)
- tls=true – увімкнути SSL
- certresolver=letsencrypt – використовувати Let’s Encrypt для SSL сертифікатів
- loadbalancer.server.port=80 – внутрішній порт контейнера (nginx слухає на порті 80)
Крок 4: Підготовка на сервері
Виконайте наступні команди на вашому сервері:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# 1. Створіть папку для конфігурації Traefik mkdir -p ~/your-project/traefik # 2. Створіть файл для SSL сертифікатів touch ~/your-project/traefik/acme.json # 3. Встановіть правильні права доступу (важливо!) chmod 600 ~/your-project/traefik/acme.json # 4. Створіть Docker мережу 'web' docker network create web |
📝 Пояснення:
- acme.json – тут зберігаються SSL сертифікати
- chmod 600 – тільки власник файлу може читати/писати (вимога Let’s Encrypt)
- docker network create web – створює спільну мережу для всіх контейнерів
Крок 5: Налаштування DNS
У панелі керування вашим доменом (ukraine.com.ua) додайте A-записи:
|
1 2 3 4 |
Тип Ім'я Значення A telegram.crumpel.site 185.161.208.125 (IP вашого сервера) A traefik.crumpel.site 185.161.208.125 (для Dashboard, опціонально) |
⏱️ Час очікування:
DNS зміни можуть застосовуватися від 5 хвилин до 24 годин.
Перевірити чи пропрацювали зміни можна командою:
|
1 2 |
nslookup telegram.crumpel.site |
Крок 6: Перевірка файрволу
Переконайтеся що порти 80 і 443 відкриті на сервері:
|
1 2 3 4 5 6 7 8 9 10 |
# Якщо використовуєте UFW sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw reload # Якщо використовуєте iptables sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo iptables-save |
Крок 7: Запуск!
Тепер запустіть все разом:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 1. Перейдіть у папку проєкту cd ~/your-project # 2. СПОЧАТКУ запустіть Traefik docker-compose -f docker-compose-traefik.yml up -d # 3. Перевірте що Traefik запустився без помилок docker logs traefik # 4. Запустіть ваш основний проєкт docker-compose -f docker-compose-php83_delta.yml up -d # 5. Перевірте логи docker logs nginx docker logs traefik -f |
📝 Порядок важливий!
Traefik повинен запуститися першим, інакше інші контейнери не зможуть до нього підключитися.
Крок 8: Перевірка
Через 1-2 хвилини після запуску:
- Перевірте сайт: https://telegram.crumpel.site
- Перевірте Dashboard: https://traefik.crumpel.site (логін: admin, пароль: password)
Що має працювати:
✅ Сайт відкривається з HTTPS
✅ Браузер показує зелений замочок (валідний SSL сертифікат)
✅ HTTP автоматично перенаправляє на HTTPS
✅ Dashboard показує активні роутери та сервіси
Типові проблеми та рішення
❌ Проблема: “SSL certificate problem”
Причина: Let’s Encrypt ще не видав сертифікат
Рішення:
|
1 2 3 4 5 |
# Перевірте логи Traefik docker logs traefik | grep -i acme # Зачекайте 2-3 хвилини, Let's Encrypt потребує часу |
❌ Проблема: “502 Bad Gateway”
Причина: Traefik не може підключитися до nginx
Рішення:
|
1 2 3 4 5 6 7 8 9 |
# Перевірте що nginx запущений docker ps | grep nginx # Перевірте що обидва контейнери в мережі 'web' docker network inspect web # Перезапустіть контейнери docker-compose -f docker-compose-php83_delta.yml restart |
❌ Проблема: “404 page not found”
Причина: Traefik не знайшов роутер
Рішення:
|
1 2 3 4 5 |
# Перевірте що labels правильно встановлені docker inspect nginx | grep -A 10 Labels # Перевірте Dashboard - там мають бути видні роутери |
❌ Проблема: DNS не резолвиться
Причина: DNS зміни ще не пропрацювали
Рішення:
|
1 2 3 4 5 6 |
# Перевірте DNS nslookup telegram.crumpel.site # Якщо не працює - зачекайте або очистіть кеш DNS sudo systemd-resolve --flush-caches |
Додавання нових доменів
Хочете додати ще один домен? Просто додайте labels до нового контейнера:
|
1 2 3 4 5 6 7 8 9 10 11 |
services: my-new-app: image: nginx:latest networks: - web labels: - "traefik.enable=true" - "traefik.http.routers.new-app.rule=Host(`newapp.crumpel.site`)" - "traefik.http.routers.new-app.entrypoints=https" - "traefik.http.routers.new-app.tls.certresolver=letsencrypt" |
Traefik автоматично знайде новий контейнер і налаштує для нього SSL!
Моніторинг через Dashboard
Traefik має вбудований Dashboard де ви можете:
- Бачити всі активні роутери
- Перевіряти статус SSL сертифікатів
- Дивитися метрики трафіку
- Знаходити помилки в конфігурації
Доступ: https://traefik.crumpel.site (логін: admin, пароль: password)
Як згенерувати свій пароль для Dashboard:
|
1 2 3 4 5 6 7 8 |
# Встановіть htpasswd sudo apt-get install apache2-utils # Згенеруйте пароль (замініть 'yourpassword' на свій) echo $(htpasswd -nb admin yourpassword) | sed -e s/\\$/\\$\\$/g # Скопіюйте результат у docker-compose-traefik.yml |
Корисні команди
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Перезапустити Traefik docker compose -f docker-compose-traefik.yml restart # Подивитися логи в реальному часі docker logs traefik -f # Перевірити які контейнери підключені до мережі 'web' docker network inspect web # Перевірити SSL сертифікати cat traefik/acme.json # Видалити всі сертифікати (для тестування) echo "{}" > traefik/acme.json docker compose -f docker-compose-traefik.yml restart<img class="alignnone size-medium wp-image-396" src="http://nodejs.jdymora.com/wp-content/uploads/2025/12/Lucid_Origin_Modern_minimalist_network_diagram_Traefik_gateway_2-300x168.jpg" alt="" width="300" height="168" /> # Перевірити конфігурацію Traefik docker exec traefik cat /traefik.yml |
Оновлення Traefik
|
1 2 3 4 5 6 7 8 9 |
# Зупинити Traefik docker-compose -f docker-compose-traefik.yml down # Завантажити нову версію docker pull traefik:v2.10 # Запустити знову docker-compose -f docker-compose-traefik.yml up -d |
Безпека
🔒 Рекомендації:
- Змініть пароль Dashboard – не використовуйте дефолтний admin:password
- Обмежте доступ до Dashboard за IP (додайте middleware)
- Регулярно оновлюйте Traefik до останньої версії
- Перевіряйте логи на підозрілу активність
Приклад обмеження доступу за IP:
|
1 2 3 4 5 |
# У docker-compose-traefik.yml додайте: labels: - "traefik.http.middlewares.whitelist.ipwhitelist.sourcerange=127.0.0.1/32,YOUR_IP/32" - "traefik.http.routers.dashboard.middlewares=auth,whitelist" |
Підсумок
Тепер у вас:
✅ Traefik автоматично керує SSL сертифікатами
✅ Всі HTTP запити перенаправляються на HTTPS
✅ Можна легко додавати нові домени через labels
✅ Все працює через єдину точку входу (порти 80/443)
✅ Є веб-інтерфейс для моніторингу
Що далі?
- Налаштуйте моніторинг (Prometheus + Grafana)
- Додайте rate limiting для захисту від DDoS
- Налаштуйте автоматичне резервне копіювання acme.json
- Додайте middleware для безпеки (headers, compression)