Traefik
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
-
docker-compose up
-
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 🚀