Назад | Перейти на главную страницу

Нужна помощь в настройке traefik по WAN и LAN

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

Я предполагаю, что доступ к доменам, размещенным в моей сети, из моей сети может вызвать некоторые проблемы. Вот почему я в первую очередь сосредотачиваюсь на доступе к WAN, поскольку у меня всегда есть доступ к WAN, но не к LAN (4G).

Если я хочу получить доступ к серверу через WAN, запрос (plex.domain.tld: 80) пойдет

  1. На DNS-сервер - DNS настроен и указывает на IP-адрес моего маршрутизатора
  2. На мой маршрутизатор - порт 80 перенаправляется на мой хост-докер
  3. Моему хозяину - Проблема Я не знаю, как перенаправить это в мой контейнер traefik. В моем docker-compose.yml Я определил настраиваемую сеть с подсетью и дал статический IP своему контейнеру traefik.
  4. Траэфик - Предупреждение Я не уверен, что мой docker-compose.yml правильно. Он должен перенаправить запрос на plex.domain.tld на порт 80 в мой контейнер plex, но я еще не мог его проверить.

Мои вопросы: Во-первых, верны ли мои предположения выше? Я далек от сетевого парня и хочу начать с хорошей базы. Во-вторых, если моя единственная проблема - перенаправить трафик, поступающий на мой хост, в конкретный контейнер, IP которого я знаю; как перенаправить указанный трафик?

docker-compose.yml: Последняя версия

version: '3.2'

networks:
  proxy:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24

services:
  traefik:
    image: traefik
    container_name: traefik
    hostname: traefik
    restart: unless-stopped  
    networks:
      proxy:
        ipv4_address: 172.16.238.2
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TIMEZONE}
    ports:
      - 8080:8080
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ${ROOT_FOLDER}\\traefik\\config:/etc/traefik
      #- ${ROOT_FOLDER}\\traefik\\config\\acme.json:/acme.json
    labels:
      - "traefik.enable=false"
      - "traefik.docker.network=proxy"
      - "traefik.port=80"
      - "traefik.frontend.rule=Host:traefik.${DOMAIN_NAME}"
      - "traefik.frontend.rule=Host:${DOMAIN_NAME}"

  plex: # https://hub.docker.com/r/linuxserver/plex
    image: linuxserver/plex
    container_name: plex
    hostname: plex
    restart: unless-stopped
    networks:
      - proxy
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TIMEZONE}
      - PLEX_CLAIM=${PLEX_CLAIM}
      - VERSION=public
      - UMASK_SET=022
    ports:
      - 32400:32400/tcp
      - 3005:3005/tcp
      - 8324:8324/tcp
      - 32469:32469/tcp
      - 1900:1900/udp
      - 32410:32410/udp
      - 32412:32412/udp
      - 32413:32413/udp
      - 32414:32414/udp
    volumes:
      - "${ROOT_FOLDER}\\library:/library"
      - "${ROOT_FOLDER}\\plex\\database:/config"
      - "${ROOT_FOLDER}\\plex\\tmp\\transcode:/transcode"
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=proxy"
      - "traefik.port=80"
      - "traefik.frontend.rule=Host:plex.${DOMAIN_NAME}"
    depends_on:
      - traefik

Ваши предположения верны, поэтому

  1. сначала запрос отправится на DNS-сервер, который указывает на ваш публичный IP-адрес.
  2. Ваш маршрутизатор перенаправит входящий запрос на ваш докер-хост через порт 80.
  3. На вашем хосте докеров traefik будет прослушивать каждый запрос, поступающий на порт 80.
  4. В зависимости от вашей конфигурации traefik направит запрос в конкретный док-контейнер.

Итак, прежде всего, вы должны добавить сеть докеров (proxynetwork), где traefik может найти все ваши контейнеры докеров.

docker network create proxynetwork

После этого вы должны сохранить файл конфигурации treafik в папке traefik ($ {ROOT_FOLDER} \ traefik \ traefik.toml). Замените youremail@mail.com своим адресом электронной почты.

################################################################
#
# Configuration sample for Traefik v2.
#
# For Traefik v1: https://github.com/containous/traefik/blob/v1.7/traefik.sample.toml
#
################################################################

################################################################
# Global configuration
################################################################
[global]
  checkNewVersion = true
  sendAnonymousUsage = true

################################################################
# Entrypoints configuration
################################################################

# Entrypoints definition
#
# Optional
# Default:
[entryPoints]
  [entryPoints.web]
    address = ":80"

  [entryPoints.websecure]
    address = ":443"

################################################################
# Traefik logs configuration
################################################################

# Traefik logs
# Enabled by default and log to stdout
#
# Optional
#
[log]

  # Log level
  #
  # Optional
  # Default: "ERROR"
  #
  # level = "DEBUG"

  # Sets the filepath for the traefik log. If not specified, stdout will be used.
  # Intermediate directories are created if necessary.
  #
  # Optional
  # Default: os.Stdout
  #
  # filePath = "log/traefik.log"

  # Format is either "json" or "common".
  #
  # Optional
  # Default: "common"
  #
  # format = "json"

################################################################
# Access logs configuration
################################################################

# Enable access logs
# By default it will write to stdout and produce logs in the textual
# Common Log Format (CLF), extended with additional fields.
#
# Optional
#
# [accessLog]

  # Sets the file path for the access log. If not specified, stdout will be used.
  # Intermediate directories are created if necessary.
  #
  # Optional
  # Default: os.Stdout
  #
  # filePath = "/path/to/log/log.txt"

  # Format is either "json" or "common".
  #
  # Optional
  # Default: "common"
  #
  # format = "json"

################################################################
# API and dashboard configuration
################################################################

# Enable API and dashboard
[api]

  # Enable the API in insecure mode
  #
  # Optional
  # Default: false
  #
  # insecure = true

  # Enabled Dashboard
  #
  # Optional
  # Default: true
  #
  dashboard = true

################################################################
# Ping configuration
################################################################

# Enable ping
[ping]

  # Name of the related entry point
  #
  # Optional
  # Default: "traefik"
  #
  # entryPoint = "traefik"

################################################################
# Docker configuration backend
################################################################

# Enable Docker configuration backend
[providers.docker]

  # Docker server endpoint. Can be a tcp or a unix socket endpoint.
  #
  # Required
  # Default: "unix:///var/run/docker.sock"
  #
  # endpoint = "tcp://10.10.10.10:2375"

  # Default host rule.
  #
  # Optional
  # Default: "Host(`{{ normalize .Name }}`)"
  #
  # defaultRule = "Host(`{{ normalize .Name }}.docker.localhost`)"

  # Expose containers by default in traefik
  #
  # Optional
  # Default: true
  #
  exposedByDefault = false

################################################################
# ACME configuration
################################################################

# Enable ACME (Let's Encrypt): automatic SSL.
[certificatesResolvers.sgfs-httpChallenge.acme]

  # Email address used for registration.
  #
  # Required
  #
  email = "youremail@mail.com"

  # File or key used for certificates storage.
  #
  # Required
  #
  storage = "${ROOT_FOLDER}\\traefik\\acme.json"

  # CA server to use.
  # Uncomment the line to use Let's Encrypt's staging server,
  # leave commented to go to prod.
  #
  # Optional
  # Default: "https://acme-v02.api.letsencrypt.org/directory"
  #
  # caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"

  # KeyType to use.
  #
  # Optional
  # Default: "RSA4096"
  #
  # Available values : "EC256", "EC384", "RSA2048", "RSA4096", "RSA8192"
  #
  # keyType = "RSA4096"

  # Use a TLS-ALPN-01 ACME challenge.
  #
  # Optional (but recommended)
  #
  #[certificatesResolvers.sgfs.acme.tlsChallenge]

  # Use a HTTP-01 ACME challenge.
  #
  # Optional
  #
  [certificatesResolvers.sgfs-httpChallenge.acme.httpChallenge]

    # EntryPoint to use for the HTTP-01 challenges.
    #
    # Required
    #
    entryPoint = "web"

  # Use a DNS-01 ACME challenge rather than HTTP-01 challenge.
  # Note: mandatory for wildcard certificate generation.
  #
  # Optional
  #
  # [certificatesResolvers.sample.acme.dnsChallenge]

    # DNS provider used.
    #
    # Required
    #
    # provider = "digitalocean"

    # By default, the provider will verify the TXT DNS challenge record before letting ACME verify.
    # If delayBeforeCheck is greater than zero, this check is delayed for the configured duration in seconds.
    # Useful if internal networks block external DNS queries.
    #
    # Optional
    # Default: 0
    #
    # delayBeforeCheck = 0

    # Use following DNS servers to resolve the FQDN authority.
    #
    # Optional
    # Default: empty
    #
    # resolvers = ["1.1.1.1:53", "8.8.8.8:53"]

    # Disable the DNS propagation checks before notifying ACME that the DNS challenge is ready.
    #
    # NOT RECOMMENDED:
    # Increase the risk of reaching Let's Encrypt's rate limits.
    #
    # Optional
    # Default: false
    #
    # disablePropagationCheck = true

После этого вы можете настроить traefik (v2.0) с помощью следующего файла docker-compose

version: "3.3"

services:
  traefik:
    image: traefik:latest
    restart: always
    container_name: traefik
    hostname: traefik
    domainname: "domain.tld"
    networks:
      - proxynetwork
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ${ROOT_FOLDER}\\traefik\\traefik.toml:/etc/traefik/traefik.toml
      - ${ROOT_FOLDER}\\traefik\\acme.json:/etc/traefik/acme.json
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    labels:
      - traefik.enable=true
      - traefik.http.routers.api.rule=Host(`traefik.domain.tld`)
      - traefik.http.routers.api.service=api@internal
      - traefik.http.routers.api.middlewares=sgfs-auth
      - traefik.http.middlewares.auth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/,test2:$$apr1$$d9hr9HBB$$4HxwgUir3HP4EsggP/QNo0"

networks:
  proxynetwork:
    external: true

+ Изменить пароль и имя пользователя в строке:

  • traefik.http.middlewares.auth.basicauth.users = test: $$ apr1 $$ H6uskkkW $$ IgXLP6ewTrSuBkTrqE8wj /, test2: $$ apr1 $$ d9hr9HBB $$ 4HxwgUir3HP4EsggP / QNo0 "

Вы можете создать учетные данные, например, на этот сайт.

Итак, теперь у вас должна быть возможность получить доступ к панели инструментов traefik по следующему URL-адресу.

traefik.domain.tld

Итак, последний шаг, вы можете настроить контейнер медиа-докеров. Используйте для этого следующий файл docker-compose


version: "3.3"

services:
  plex: # https://hub.docker.com/r/linuxserver/plex
    image: linuxserver/plex
    container_name: plex
    hostname: plex
    restart: unless-stopped
    networks:
      - proxynetwork
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TIMEZONE}
      - PLEX_CLAIM=${PLEX_CLAIM}
      - VERSION=public
      - UMASK_SET=022
    ports:
      - 32400:32400/tcp
      - 3005:3005/tcp
      - 8324:8324/tcp
      - 32469:32469/tcp
      - 1900:1900/udp
      - 32410:32410/udp
      - 32412:32412/udp
      - 32413:32413/udp
      - 32414:32414/udp
    volumes:
      - "${ROOT_FOLDER}\\library:/library"
      - "${ROOT_FOLDER}\\plex\\database:/config"
      - "${ROOT_FOLDER}\\plex\\tmp\\transcode:/transcode"
    labels:
      - traefik.enable=true
      - traefik.docker.network=proxynetwork
      - traefik.http.routers.plex.rule=Host(`plex.domain.tld`)
      - traefik.http.routers.plex.entrypoints=web

networks:
  proxynetwork:
    external: true

Надеюсь, это сработает для вас.