Traefik

2 minuto(s) de lectura

Proxy Reverse + SSL

Hola muchach@s, hoy estaremos desarrollando un entorno de prueba en nuestro localhost, donde expondremos aplicaciones web con certficado autofirmado ssl y mucho más mediante docker,

¿Por qué Traefik?

Además de cumplir excepecionalmente con la función de Proxy Reverse tiene muchas más funcionalidades que lo hacen único.

  • Encriptación HTTPS con LetsEncrypt
  • Dashboard para monitorear el estado de los servicios
  • Exporte de Métricas(Prometheus, Grafana, etc …)
  • Centralización de logs
  • Balanceo de carga

Instalando Traefik

  • Creando un docker-compose.yml para el uso del proxy reverse
    services:
    prueba:
      # Imagen oficial de Traefik v2 
      image: "traefik:v2.5" 
      container_name: "prueba" 
      command: 
        # Habilitando el Dashboard  y docker como provedor 
        - "--api.insecure=true" 
        - "--providers.docker=true" 
      ports: 
        # puerto HTTP  
        - "80:80"
        # Dashboard ( --api.insecure=true)         
        - "8080:8080"               
      volumes:  
      # Para que Traefik pueda escuchar los eventos de Docker   
        - "/var/run/docker.sock:/var/run/docker.sock:ro"  
          
      networks:
        traefik_network:
    networks:
    traefik_network:
      name: traefik_net
      driver: bridge 
    
  1. docker-compose up

  2. http://localhost:8080

HTTP to HTTPS

Agregando al /etc/hosts un DNS local.

app.test 127.0.0.1
version: "3.3"

services:
  prueba:
    # Imagen oficial de Traefik v2 
    image: "traefik:v2.5" 
    container_name: "prueba" 
    command: 
      # Habilitando el Dashboard  y docker como provedor 
      - "--api.insecure=true" 
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      # Configurando el entrypoint
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443" 
      #Global HTTP -> HTTPS
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.websecure.http.tls.certresolver=myresolver"
      - "--certificatesresolvers.myresolver.acme.email=fsharker@yahoo.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    ports: 
      # puerto HTTP  
      - "80:80"
      # puerto HTTPS
      - "443:443"               
    volumes:  
      # Para que Traefik pueda escuchar los eventos de Docker   
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      #Archivo donde se guarda el certficado autofirmado
      - "./letsencrypt:/letsencrypt"  
    labels:
      - "traefik.enable=true"
      #El Host es `app.test` y el  path /api ó /dashboard
      - "traefik.http.routers.dashboard.rule=Host(`app.test`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
      - "traefik.http.routers.dashboard.service=api@internal"
      # Haciendo que Traefik use el puerto 8080  para conectarse al servicio traefik-dashboard
      - "traefik.http.services.traefik-dashboard.loadbalancer.server.port=8080"
      networks:
      	traefik_network:
networks:
  traefik_network:
    name: traefik_net
    driver: bridge
    

Securizando el dashboard

  • La salida del siguiente oneliner tendrá las credenciales en el formato adecuado para introducírselas a Traefik.
~❯ echo $(htpasswd -nb admin admin123) | sed -e s/\\$/\\$\\$/g 
admin:$$apr1$$yVY1sa6I$$c8EZMme5rLyciCajc7go70

docker-compose.yml solo el apartado labels

labels:
      - "traefik.enable=true"
      # El Host es `app.test` y el  path /api ó /dashboard
      - "traefik.http.routers.dashboard.rule=Host(`app.test`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
      - "traefik.http.routers.dashboard.service=api@internal"
      # Traefik usando el puerto 8080  para conectarse al servicio traefik-dashboard
      - "traefik.http.services.traefik-dashboard.loadbalancer.server.port=8080"
      # Activando un middleware de autenticacion en el dashboard
      - "traefik.http.routers.dashboard.middlewares=auth"
      # Usuario: admin       Pass: admin123 
      - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$fjz0ths4$$zrsJUrpO2yEO4mahrl1qS0"

Autenticación requerida para entrar al dashboard.

Exponiendo servicio vía Traefik

  • Agregamos otro DNS llamada portainer.local

Creando un docker-compose.yml para exponer el servicio portainer

version: "3.3"

services:
  portainer:
    image: portainer/portainer-ce:2.0.0
    hostname: portainer
    expose:
      - 9000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./volume/portainer:/data
    restart: always
    command: -H unix:///var/run/docker.sock
    labels:
      - "traefik.enable=true"
      - "traefik.port=9000"
      - "traefik.http.routers.portainer.entrypoints=websecure" # web
      - "traefik.http.routers.portainer.rule=Host(`portainer.local`)"
      - "traefik.http.routers.portainer.tls.certresolver=lets-encr"
      - "traefik.http.routers.portainer.service=portainer"
      - "traefik.http.services.portainer.loadbalancer.server.port=9000"
    networks:
      traefik_network:
networks:
  traefik_network:
    name: traefik_net
    driver: bridge

  • Servicio expuesto con certificado ssl gratis 🚀