Самохостинг (часть 3) - Traefik

Самохостинг (часть 3) - Traefik
Photo by 愚木混株 cdd20 / Unsplash

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

Traefik — это современный обратный прокси-сервер и балансировщик нагрузки, который автоматически конфигурируется при изменении инфраструктуры. Он идеально подходит для микросервисных архитектур и контейнеризированных сред, таких как Docker и Kubernetes. Основные функции Traefik включают:

  • Автоматическое обнаружение сервисов: Traefik автоматически обнаруживает новые сервисы и настраивает маршрутизацию для них.
  • Поддержка множества бэкендов: Traefik поддерживает Docker, Kubernetes, Swarm и другие платформы.
  • Интеграция с Let's Encrypt: Traefik может автоматически генерировать и обновлять SSL-сертификаты через Let's Encrypt.
  • Простая настройка через метаданные (labels): Конфигурация сервисов осуществляется через метки в Docker Compose или Kubernetes.
  • Встроенная панель управления: Traefik предоставляет удобный веб-интерфейс для мониторинга и управления.

Разворачивание Traefik с помощью Docker Compose

Для запуска Traefik мы будем использовать Docker Compose.

Перед запуском Traefik установите docker и его плагин compose и выполните следующие подготовительные шаги:

  1. Создайте файл acme.json для хранения сертификатов Let's Encrypt:
mkdir -p /opt/docker/traefik
touch /opt/docker/traefik/acme.json
chmod 600 /opt/docker/traefik/acme.json
  1. Убедитесь, что файл acme.json находится в той же директории, где вы запускаете docker-compose.

Ниже приведен пример конфигурационного файла docker-compose.yml:

x-defaults: &defaults
  restart: always
  logging:
    driver: json-file
    options:
      max-size: "10m"
      max-file: "5"

services:
  traefik:
    <<: *defaults
    image: traefik:v2.10
    container_name: "traefik"
    command:
      - "--api.insecure=true"
      - "--providers.docker"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.http.address=:80"
      - "--entrypoints.https.address=:443"
      - "--serverstransport.insecureskipverify=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=http"
      - "--certificatesresolvers.myresolver.acme.email=your-email@example.com"
      - "--certificatesresolvers.myresolver.acme.storage=/acme.json"
      - "--entrypoints.http.http.redirections.entryPoint.to=https"
      - "--entrypoints.http.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.http.http.redirections.entrypoint.permanent=true"
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
      - "traefik.enable=true"
      - "traefik.http.middlewares.httpsheader.headers.customrequestheaders.X-Forwarded-Proto=https"
    ports:
      - "80:80"
      - "443:443"
      - "127.0.0.1:8088:8080" # Доступ к API только с localhost
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/docker/traefik/acme.json:/acme.json
      - /etc/resolv.conf:/etc/resolv.conf

Ключевые моменты конфигурации:

  • --providers.docker.exposedbydefault=false: Отключает автоматическую маршрутизацию всех контейнеров. Это позволяет явно указывать, какие сервисы должны быть проксированы.
  • Редирект HTTP → HTTPS: Все запросы по HTTP автоматически перенаправляются на HTTPS.
  • Let's Encrypt: Используется для автоматической генерации SSL-сертификатов.
  • Защита API: Доступ к API Traefik ограничен только локальным хостом.

Настройка проксируемых сервисов через labels

Чтобы добавить новый сервис за Traefik, достаточно запустить контейнер с правильными метками. Рассмотрим пример настройки простого echo-сервера:

services:
  example_service:
    image: containous/whoami
    container_name: "example_service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.example.rule=Host(`example.yourdomain.com`)"
      - "traefik.http.routers.example.entrypoints=https"
      - "traefik.http.routers.example.tls.certresolver=myresolver"

Что мы указали в метках:

  • traefik.http.routers.example.rule: Правило маршрутизации по хосту. В данном случае сервис будет доступен по адресу example.yourdomain.com.
  • traefik.http.routers.example.entrypoints: Указывает, что сервис должен использовать HTTPS.
  • traefik.http.routers.example.tls.certresolver: Указывает решатель сертификатов, который будет использоваться для получения SSL-сертификата.

После запуска этого контейнера, он автоматически станет доступен по адресу https://example.yourdomain.com.

Запускаем сервисы:

docker compose up -d

Дополнительные рекомендации

  • DNS-записи: Убедитесь, что DNS-записи вашего домена указывают на сервер с Traefik.
  • Защита файла acme.json: Убедитесь, что файл acme.json, в котором хранятся SSL-сертификаты, защищен правильными правами доступа. Выполните команду chmod 600 acme.json.
  • Дополнительные middleware: При необходимости добавьте дополнительные middleware для защиты от DDoS-атак или других угроз. Например, можно использовать middleware для ограничения скорости запросов или для добавления базовой аутентификации.

Расширение функциональности Traefik

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

  • Плагины для аутентификации: Traefik поддерживает OAuth, Basic Auth и другие методы аутентификации.
  • Мониторинг и логирование: Traefik интегрируется с Prometheus, Grafana и другими инструментами для мониторинга и анализа трафика.
  • Балансировка нагрузки: Traefik поддерживает различные алгоритмы балансировки нагрузки, такие как Round Robin, Weighted и другие.

Traefik — это мощный и гибкий инструмент для организации обратного проксирования и балансировки нагрузки в современных микросервисных архитектурах. Благодаря автоматической конфигурации и интеграции с Docker, Kubernetes и Let's Encrypt, Traefik значительно упрощает управление инфраструктурой.

Read more

Cold pull — как вытащить засор из сопла и не сломать мозг

Cold pull — как вытащить засор из сопла и не сломать мозг

Знаете, что общего у принтера Flashforge 5M Pro и кофемашины, которая внезапно перестала варить кофе? Правильно — если в узком месте что-то застряло, всё остальное тут же идёт по одному месту. В 3D-принтерах это место — сопло. И когда оно забивается, без паники. Есть старый добрый способ — cold pull. А теперь по-человечески:

Проблемы с вводом-выводом на диск: что может пойти не так

Проблемы с вводом-выводом на диск: что может пойти не так

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

Самохостниг (часть 10) - AudiobookShelf

Самохостниг (часть 10) - AudiobookShelf

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