web-dev-qa-db-fra.com

Traefik v2.1.4 - Comment créer une route statique et rediriger vers un hôte et un port spécifiques

Je suis un débutant avec Traefik v2.1.4. J'utilise dans un conteneur Docker. J'essaye de mettre en place une route statique. J'ai trouvé quelques exemples utilisant le fichier de configuration toml.

[providers]
[providers.file]
[http]
    [http.routers]
        [http.routers.netdata]
            rule = "Host(`netdata.my-domain.com`)"
            service = "netdata"
            entrypoint=["http"]

    [http.services]
          [http.services.netdata.loadbalancer]
            [[http.services.netdata.loadbalancer.servers]]
              url = "https://192.168.0.2:19999"

En suivant cet exemple, je voudrais le convertir en étiquettes docker de mon docker-compose.

Mon fichier docker-compose:

version: "3.7"
services:

  traefik:
    image: traefik:v2.1.4
    container_name: traefik
    restart: always
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsresolver.acme.tlschallenge=true"
      - "--certificatesresolvers.letsresolver.acme.email=my-email@domain.com"
      - "--certificatesresolvers.letsresolver.acme.storage=/letsencrypt/acme.json"
    labels:
      - "traefik.enable=true"
      # middleware redirect
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      # global redirect to https
      - "traefik.http.routers.redirs.rule=hostregexp(`{Host:.+}`)"
      - "traefik.http.routers.redirs.entrypoints=web"
      - "traefik.http.routers.redirs.middlewares=redirect-to-https" 
      # dashboard
      - "traefik.http.routers.traefik.rule=Host(`traefik.my-domain.com`)"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=admin"
      - "traefik.http.routers.traefik.tls.certresolver=letsresolver"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.middlewares.admin.basicauth.users=user:hash-passwordXXX"

    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"


 networks:
    default:
        external:
            name: network
3
Edson Junior

Il est possible de tiliser 2 fournisseurs ensemble: file et docker.

Votre docker-compose.yml:

services: 
 traefik: 
 image: traefik: 2.2.1 
 commande: traefik --configFile =/etc/traefik/traefik.yml 
 ports: 
 - "80:80" 
 - "8080: 8080" 
 Volumes: 
 - ./traefik.yml:/etc/traefik/traefik.yml
 - ./routes.yml:/etc/traefik/routes.yml
 - /var/run/docker.sock:/var/run/docker.sock[.____. </font>
 # vos services vont ici ... 

Votre traefik.yml:

api:
  dashboard: true
  insecure: true

entryPoints:
  web:
    address: :80

providers:
  docker: {}

  file:
    filename: /etc/traefik/routes.yml
    watch: true

Votre routes.yml:

http:
  routers:
    hello:
      rule: PathPrefix(`/hello`)
      service: hello@docker
      rule: PathPrefix(`/world`)"
      service: world@docker

Ce ne sont que des exemples, ne les utilisez pas directement dans l'environnement de production, bien sûr.

1
Nick Roz

Il n'y a pas d'étiquette de docker mentionnée pour spécifier l'url (dans https://docs.traefik.io/v2.1/routing/providers/docker/#routers ). Et j'ai essayé d'utiliser l'url au lieu du port, mais cela ne fonctionne pas.
Je suggère donc d'utiliser le fournisseur de fichiers ( https://docs.traefik.io/v2.1/providers/file/ ).

suggestion pour la mise en œuvre:

mettez à jour votre configuration avec:

services:
  ...
  traefik:
    ...
    command:
      ...
      - "--providers.file.directory=/path/to/dynamic/conf"
    config:
    - source: redirect.toml
      target: /path/to/dynamic/conf/redirect.toml
    ...

...
configs:
  redirect.toml:
    file: redirect.toml

et créez redirect.toml avec votre redirection (comme dans votre exemple).

Bien sûr, vous pouvez également monter la configuration dans le conteneur, ou créer votre propre image traefik contenant la configuration, ou ...


Si vous souhaitez travailler avec des étiquettes, vous pouvez démarrer un service qui redirige avec socat

services:
  ...

  netdata:
    image: Alpine/socat
    command: tcp-listen:80,fork,reuseaddr tcp-connect:192.168.0.2:19999
    deploy:
      labels:
        traefik.enable: "true"
        traefik.http.routers.netdata.rule: Host(`netdata.my-domain.com`)
        traefik.http.services.netdata_srv.loadbalancer.server.port: 80
        # hm, and probably tell to forward as https, ...
1
simohe