› Foros › PC › Software libre
version: "3.7"
services:
traefik:
image: traefik:v2.9 # así siempre cargará la última 2.9 disponible, sin saltar a la versión 3 cuando salga
ports:
- target: 80
published: 80
protocol: tcp
mode: host # En docker-swarm es necesario esto para que reciba bien las cabeceras de IP, de otro modo, todas las peticiones le parecerá que vienen de la red de ingress y no de fuera.
- target: 443
published: 443
protocol: tcp
mode: host
volumes:
# Mapeamos:
# La API interna de docker, para que traefik descubra nuevos contenedores
# Un directorio para almacenar un .json que contendrá los certificados SSL generados por let's encrypt.
# La configuración de traefik
# El timezone del host, para que el contenedor tenga la misma hora.
- /var/run/docker.sock:/var/run/docker.sock
- /etc/letsencrypt:/letsencrypt
- /home/user/docker/volumes/traefik:/etc/traefik
- /etc/timezone:/etc/timezone:ro
networks:
- traefik-public
deploy:
placement:
constraints: [node.role == manager] #aunque esto no es necesario, porque sólo tenemos un nodo, podemos agregar más nodos y funcionará, siempre que haya un único manager.
labels:
- "traefik.enable=true" # habilitamos este contenedor en traefik para habilitar el dashboard
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.miurl.com`)" #cambiar por tu dominio # url por la que entraremos al dashboard
- "traefik.http.services.traefik-secure.loadbalancer.server.port=8080" # Loadbalancer de mentira para docker swarm, omitir si sólo usamos docker
- "traefik.http.routers.traefik-secure.service=api@internal" #Le indicamos a qué servicio apuntat traefik las llamadas a traefik.miurl.com, en estet caso, apunta a la api de traefik
- "traefik.http.routers.traefik-secure.middlewares=ip-list" # Creamos un middleware, que usaremos para limitar las IPs que serán ruteadas a nuestro servicio de dashboard
- "traefik.http.middlewares.ip-list.ipwhitelist.sourcerange=192.168.1.0/24" # Le indicamos al middleware el rango de IPs que pueden acceder al servicio de dashboard, usad el vuestro de casa, usad "ip a" en linux o "ipconfig" en windows para ver vuestra IP local.
# Aquí definimos la red traefik-public que usamos en este yml:
networks:
traefik-public:
external: true
driver: overlay
name: traefik-public
entryPoints:
#habilitamos dos entrypoints, el web para http y el websecure para https, además añadimos redirección forzosa de http a https
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
http:
tls:
certResolver: le
# Habilitamos la API de traefik y el dashboard
api:
insecure: true
dashboard: true
# Le indicamos el proveedor, en nuestro caso docker, en modo swarm, si sólo usas docker, elimina el swarmmode.
providers:
docker:
swarmmode: true
exposedbydefault: false
endpoint: "unix:///var/run/docker.sock"
network: traefik-public
# Habilitamos los logs por stdout
log:
level: ERROR
# Habilitamos los logs de acceso http/s por stdout
accesslog: {}
# Creamos el cert resolver "le" (sólo es un nombre) y lo configuramos
certificatesResolvers:
le:
acme:
email: miemail@email.com # usar nuestro email real ya que así letsencrypt nos avisará de cualquier cambio en sus políticas.
storage: /letsencrypt/acme.json # Path DENTRO del contetnedor donde se almacenan los certificados
httpChallenge:
entryPoint: web
docker-compose -f /home/user/docker/traefik.yml up
webapp:
image: httpd
deploy:
labels:
- "traefik.enable=true" # Habilitamos traefik para este contenedor
- "traefik.http.routers.apache.rule=Host(`apache.miurl.com`)" # Le indicamos la URL por la que vendrán las peticiones a traefik
- "traefik.http.services.apache.loadbalancer.server.port=80" # Le indicamos a Traefik el puerto donde el contenedor expone el servicio.
docker-compose -f /home/user/docker/apache.yml up