Aprovenchando que tengo el nuevo VPSqueria ponerle traefik y que además se puede hacer a traves de docker y asi poder aprovechar todas las posibilidades que nos da. Al final (cuando estoy escribiendo esto) lo tengo todo en funcionamiento, pero me ha costado horrores y aqui os explico mi odisea.

Lo que primero que hice, fue empaparme muy bien de los videos de atareao donde explica el proceso que uso el para su instalación. Os aconsejo que empeceis con estos 2:

Tiene unos cuantos más, pero lo mejor es ir directamente a la fuente, yo he puesto los que más han hecho servicio.

Lo primero de todo es crear el fichero de docker-compose.yml que en mi caso, es el siguiente:

docker-compose.yml

traefik:
  image: traefik:v2.11.2
  container_name: traefik
  init: true
  restart: unless-stopped
  security_opt:
    - no-new-privileges:true
  # ES LA RED QUE FARA SERVI TRAEFIK I QUE UTILIZAREM PER A LA RESTA DE SERVEIS
  # QUE VULGUEM CONECTAR AMB TRAEFIK
  networks:
    - proxy
  ports:
    - 80:80
    - 443:443
  environment:
    - TZ=Europe/Madrid
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro
    - ${HOME}/config/traefik/traefik.yml:/traefik.yml:ro
    - ${HOME}/config/traefik/dynamic.yml:/dynamic.yml:ro
    - ${HOME}/config/traefik/users.txt:/users.txt:ro
    - ${HOME}/config/traefik/acme.json:/acme.json
    - logs:/var/log/traefik
  labels:
    - traefik.enable=true
    - traefik.http.services.traefik.loadbalancer.server.port=80
    - traefik.http.routers.traefik-secure.entrypoints=websecure
    - traefik.http.routers.traefik-secure.rule=Host(`${TRAEFIK_SERVER}`)
    - traefik.http.routers.traefik-secure.middlewares=myauth@file
    - traefik.http.routers.traefik-secure.service=api@internal
    - traefik.http.routers.traefik-secure.tls=true
    - traefik.http.routers.traefik-secure.tls.certresolver=letsencrypt

volumes:
  logs: {}
# XARXA PER A TRAEFIK
networks:
  internal: {}
  proxy:
    external: true

⚠️ Antes de lanzarnos a la piscina con la instalación, tenemos que tener en cuenta 2 cosas, en mi caso estoy usando un fichero .env donde tengo las variables, los passwords y las URL que utilizo:

  • ${HOME} que es el directorio HOME de mi usuario
  • ${TRAEFIK_SERVER} que es la URL de acceso a este servicio.

Una vez tenemos el fichero, lo siguiente y antes de ponerlo en marcha es mejor crear los 4 ficheros que necesita para su correcto funcionamiento que son los siguientes:

traefik.yml

api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true
  websecure:
    address: ":443"
    http:
      tls:
        certresolver: letsencrypt

serversTransport:
  maxIdleConnsPerHost: 1

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    watch: true
    network: proxy
  file:
    filename: /dynamic.yml

log:
  level: INFO
  filePath: "/var/log/traefik/traefik.log"
accessLog:
  filePath: "/var/log/traefik/access.log"
  bufferingSize: 100
  fields:
    defaultMode: keep
    names:
      ClientUsername: keep
    headers:
      defaultMode: keep
      names:
        Content-Type: keep
        X-Forwarded-For: keep
  filters:
    statusCodes:
      - "300-302"
      - "400-409"
    retryAttempts: true
    minDuration: "10ms"
    
certificatesResolvers:
  letsencrypt:
    acme:
      email: elteu@email.com
      storage: acme.json
      httpChallenge:
        entryPoint: web
# ESTIC FEN PROVES PER VEURE COM FUNCIONA
# PERO DE MOMENT NO TINC SORT
#experimental:
#  plugins:
#    GeoBlock:
#      moduleName: "github.com/PascalMinder/geoblock"
#      version: "v0.2.5"

dynamic.yml

# FITXER ON ESTAN, EN AQUEST CAS LA CONFIGURACIÓ DE LA SEGURETAT PER ACCEDIR ALS LLOCS
http:
  middlewares:
    myauth:
      basicAuth:
        usersfile: /users.txt

Ahora en el caso de querer securizar (pedir usuario y password) para acceder a los servicios que tenemos detras de traefik, se puede hacer a traves del archivo:

usuari@debian:~$ls -l users.txt

Y para añadir los usuarios que tienen acceso, se realiza con la siguiente orden:

usuari@debian:~$sudo apt install apache2-utils
usuari@debina:~$htpasswd -nb usuario contraseña >> users.txt

Ahora el archivo que contendra los certificados:

usuari@debian:~$ls -l acme.json

Pero antes de nada, tenemos que crear la red proxy, porque sino, luego a la hora de hacer el docker compose no dara error. Esto se hace de la siguiente manera:

usuari@debian:~$docker network create proxy

Una vez que ya tenemos todo preparado solamente nos falta decir las palabras magicas

usuari@debian:~$docker compose up -d traefik

Como podeis observar, estoy haciendo uso de docker compose y no de docker-compose. Esto se debe, creo, que con las nuevas versiones, se ha unificado, lo que antes era un paquete solo docker-compose y lo han convertido en una opción más de docker.

Y si todo va bien, ya lo tenemos en funcionamiento y además, con el certificado SSL para conectarnos al dashboard y si hemos activado la seguridad de acceso a traves de usuarios, antes del acceso, nos pedira el usuario y password.

Con esto, ya tenemos la instalación de traefik en marcha. Ahora viene lo más dificil, que es configurar el resto de servicios para que hagan uso de traefik y poder usarlo.

⚠️ Aqui tengo que informar que el fichero docker-compose.yml de traefik ha sufrido algunas modificaciones como consecuencia de lo que podeis leer en este articulo, quedando de la siguiente manera:

  labels:
    - traefik.enable=true
    - traefik.http.services.traefik.loadbalancer.server.port=80
    - traefik.http.routers.traefik-secure.entrypoints=websecure
    - traefik.http.routers.traefik-secure.rule=Host(`${TRAEFIK_SERVER}`)
    - traefik.http.routers.traefik-secure.middlewares=myauth@file
    - traefik.http.routers.traefik-secure.service=api@internal
#    - traefik.http.routers.traefik-secure.tls=true
#    - traefik.http.routers.traefik-secure.tls.certresolver=letsencrypt

Referencia