Herramientas de usuario

Herramientas del sitio


guias:traefikv2

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
guias:traefikv2 [2021/05/20 22:19] – [Entry Point] Sergio Alvariñoguias:traefikv2 [2021/10/29 10:35] (actual) – [Nuestro primer servicio: Portainer] Sergio Alvariño
Línea 35: Línea 35:
 ===== Ejemplo01: Uno facilito ===== ===== Ejemplo01: Uno facilito =====
  
-El siguiente fichero //docker-compose// contiene una configuración lo más sencilla posible con el %%__%%docker provider_.+El siguiente fichero //docker-compose// contiene una configuración lo más sencilla posible con el **//docker provider//**.
  
 Preparamos los ficheros y directorios de trabajo: Preparamos los ficheros y directorios de trabajo:
Línea 46: Línea 46:
 El contenido del fichero ''%%~/work/docker/ejemplo01/traefik/docker-compose.yml%%'' sería: El contenido del fichero ''%%~/work/docker/ejemplo01/traefik/docker-compose.yml%%'' sería:
  
-<code yml>+<code yaml>
 version: '3' version: '3'
  
Línea 99: Línea 99:
 Con este //Traefik// básico que hemos lanzado, ya prodríamos lanzar servicios que conectaran con el mismo. Vamos a añadir unas lineas a nuestro fichero //docker-compose//, que quedaría así: Con este //Traefik// básico que hemos lanzado, ya prodríamos lanzar servicios que conectaran con el mismo. Vamos a añadir unas lineas a nuestro fichero //docker-compose//, que quedaría así:
  
-<code yml>+<code yaml>
 version: '3' version: '3'
  
Línea 219: Línea 219:
 ==== Services ==== ==== Services ====
  
-Serían los componentes del //“backend”"//, en nuestro caso serán servicios implementados en contenedores Docker.+Serían los componentes del //“backend”//, en nuestro caso serán servicios implementados en contenedores Docker.
  
 **Los //services// son parte de la configuración dinámica.** **Los //services// son parte de la configuración dinámica.**
Línea 239: Línea 239:
 Vamos con un ejemplo un pelín más complejo. Vamos a definir un contenedor de //Traefik// que simplemente expone su //Dashboard//, de momento no vamos a definir más contenedores, pero podremos añadirlos a este escenario en el futuro. Vamos con un ejemplo un pelín más complejo. Vamos a definir un contenedor de //Traefik// que simplemente expone su //Dashboard//, de momento no vamos a definir más contenedores, pero podremos añadirlos a este escenario en el futuro.
  
-La gracia del ejemplo es que //Traefik// obtendrá los certificados SSL del dominio (p.ej. miDominio.com) automáticamente desde [[https://letsencrypt.org/|//Let’s Encrypt//]]. Y expondrá el //dashboard// en un subdominio, digamos en https://dashtraefik.miDominio.com.+La gracia del ejemplo es que //Traefik// obtendrá los certificados SSL del dominio (p.ej. miDominio.com) automáticamente desde //[[https://letsencrypt.org/|Let’s Encrypt]]//. Y expondrá el //dashboard// en un subdominio, digamos en https://dashtraefik.miDominio.com.
  
 Preparamos los directorios y los ficheros de trabajo. Preparamos los directorios y los ficheros de trabajo.
Línea 259: Línea 259:
 Dentro de esta configuración definiremos: Dentro de esta configuración definiremos:
  
-  * ****//entry points//**** Definiremos dos //entry points//: ''%%http%%'' y ''%%https%%'' que aceptarán peticiones en los puertos 80 y 443.+  * **//entry points//** Definiremos dos //entry points//: ''%%http%%'' y ''%%https%%'' que aceptarán peticiones en los puertos 80 y 443. \\ Los nombres de los //entry points// son etiquetas arbitrarias, puedes llamarlos como quieras.
  
-Los nombres de los //entry points// son etiquetas arbitrarias, puedes llamarlos como quieras. +<code yaml>
- +
-<code traefik.yml>+
 entryPoints: entryPoints:
   http:   http:
Línea 273: Línea 271:
 La redirección de puertos se solía hacer con un //middleware// pero desde la version 2.2 de //Traefik// podemos definirla en la configuración estática añadiendo unas lineas en la propia definición de los //entry points//: La redirección de puertos se solía hacer con un //middleware// pero desde la version 2.2 de //Traefik// podemos definirla en la configuración estática añadiendo unas lineas en la propia definición de los //entry points//:
  
-<code traefik.yml>+<code yaml>
 entryPoints: entryPoints:
   http:   http:
Línea 283: Línea 281:
   https:   https:
     address: :443     address: :443
 +</code>
  
 +  * **//providers//** \\ Vamos a definir dos _providers_ diferentes, uno de tipo ''docker'' y otro de tipo ''file''. \\ Nuestro objetivo es usar _Traefik_ en Docker así que siempre deberíamos definir el _provider_ docker. Recordemos que a través de este //provider// los contenedores (servicios) que definamos en nuestro //Docker// informarán a //Traefik// de que rutas necesitan para recibir peticiones.
  
-__providers___ +<code yaml>
- +
-: Vamos a definir dos _providers_ diferentes, uno de tipo `docker` y +
-otro de tipo `file`. +
- +
-Nuestro objetivo es usar _Traefik_ en Docker así que siempre deberíamos +
-definir el _provider_ docker. Recordemos que a través de este +
-_provider_ los contenedores (servicios) que definamos en nuestro +
-_Docker_ informarán a _Traefik_ de que rutas necesitan para recibir +
-peticiones. +
- +
-```traefik.yml+
 entryPoints: entryPoints:
   http:   http:
Línea 315: Línea 304:
 </code> </code>
  
-El //docker provider// de //Traefik// se comunica con //Docker// (en la máquina //host//) a traves del //socket// de //Docker// (en el sistema de ficheros de la máquina _host). Así que necesitaremos que el contenedor //Docker// pueda acceder al //socket// con otro //bind mount//+El //docker provider// de //Traefik// se comunica con //Docker// (en la máquina //host// ) a traves del //socket// de //Docker// (en el sistema de ficheros de la máquina _host). Así que necesitaremos que el contenedor //Docker// pueda acceder al //socket// con otro //bind mount//
  
 El parámetro ''%%exposedByDefault%%'' por defecto vale ''%%true%%'' y hace que todos los contenedores en //Docker// sean visibles para //Traefik//. El valor recomendado es justo el contrario: ''%%false%%'', para que //Traefik// “vea” únicamente los contenedores que tiene que tiene que enrutar. El parámetro ''%%exposedByDefault%%'' por defecto vale ''%%true%%'' y hace que todos los contenedores en //Docker// sean visibles para //Traefik//. El valor recomendado es justo el contrario: ''%%false%%'', para que //Traefik// “vea” únicamente los contenedores que tiene que tiene que enrutar.
  
-{{admonition type=warning >}} +<WRAP center round important 60%
- +En este ejemplo concreto el ''%%docker provider%%'' no hará nada. Pero como estamos viendo como usar //Traefik// con //Docker// es mejor acostumbrarse a definirlo siempre. En cuanto definamos algún contenedor será imprescindible
-En este ejemplo concreto el ''%%docker provider%%'' no hara nada. Pero como estamos viendo como usar //Traefik// con //Docker// es mejor acostumbrarse a definirlo siempre. En cuanto definamos algún contenedor nos hará falta+</WRAP>
- +
-{{< /admonition >}}+
  
 Además del //provider docker// definimos un segundo //provider// de tipo //file//. Este segundo //provider// nos permitirá especificar la configuración dinámica mediante un fichero. En el futuro la configuración dinámica podría ampliarse a través del //docker provider// si definimos nuevos contenedores. Además del //provider docker// definimos un segundo //provider// de tipo //file//. Este segundo //provider// nos permitirá especificar la configuración dinámica mediante un fichero. En el futuro la configuración dinámica podría ampliarse a través del //docker provider// si definimos nuevos contenedores.
  
-{{admonition type=info title=“provider file: dirname vs filename” state=open >}} +<WRAP center round info 60%>
 Podemos definir un //provider file// especificando un ''%%dirname%%'' en lugar de un ''%%filename%%''. En ese caso podríamos tener varios ficheros en el directorio especificado para añadir modificaciones a la configuración dinámica de //Traefik// Podemos definir un //provider file// especificando un ''%%dirname%%'' en lugar de un ''%%filename%%''. En ese caso podríamos tener varios ficheros en el directorio especificado para añadir modificaciones a la configuración dinámica de //Traefik//
 +</WRAP>
  
-{{< /admonition >}} 
  
-  * ****certificates resolvers**** Se encargará de negociar los certificados SSL con //Let’s Encrypt// ¡automáticamente! 
  
-Los //certificates resolvers// son parte de la configuración estática.+  * **//certificates resolvers//** Se encargará de negociar los certificados SSL con //Let’s Encrypt// ¡automáticamente! \\ **Los //certificates resolvers// son parte de la configuración estática.** \\ Hay [[https://doc.traefik.io/traefik/v2.0/https/acme/|varias maneras]] de que //Traefik// obtenga los certificados, en este ejemplo usamos una muy simple, el //http challenge//.
  
-Hay [[https://doc.traefik.io/traefik/v2.0/https/acme/|varias maneras]] de que //Traefik// obtenga los certificados, en este ejemplo usamos una muy simple, el //http challenge//+<code yaml>
- +
-<code traefik.yml>+
 entryPoints: entryPoints:
   http:   http:
Línea 370: Línea 353:
 //Traefik// no va a pedir certificados de dominio por iniciativa propia, tendremos que indicar, en la configuración dinámica, que servicios queremos asegurar con un certificado (en principio todos) //Traefik// no va a pedir certificados de dominio por iniciativa propia, tendremos que indicar, en la configuración dinámica, que servicios queremos asegurar con un certificado (en principio todos)
  
-Tambien tenemos que acordarnos de que más adelante tendremos que crear un //bind mount// para tener fácil acceso al fichero ''%%acme.json%%''. +También tenemos que acordarnos de que más adelante tendremos que crear un //bind mount// para tener fácil acceso al fichero ''%%acme.json%%''.
- +
-{{< admonition type=tip title=“Protocolo ACME” state=open >}}+
  
 +<WRAP center round info 80%>
 El agente ACME de //Traefik// genera una pareja de claves pública-privada para hablar con la autoridad certificadora (CA) de //Let’s Encrypt//. Después “pregunta” a la CA que debe hacer para probar que controla un dominio determinado. El agente ACME de //Traefik// genera una pareja de claves pública-privada para hablar con la autoridad certificadora (CA) de //Let’s Encrypt//. Después “pregunta” a la CA que debe hacer para probar que controla un dominio determinado.
  
Línea 381: Línea 363:
  
 La CA comprueba la solución del desafío y que la firma del //nonce// son válidas. A partir de este punto la pareja de claves asociada al dominio se considera autorizada, y el agente ACME ya puede solicitar certificados y/o revocarlos usando esta pareja de claves. La CA comprueba la solución del desafío y que la firma del //nonce// son válidas. A partir de este punto la pareja de claves asociada al dominio se considera autorizada, y el agente ACME ya puede solicitar certificados y/o revocarlos usando esta pareja de claves.
 +</WRAP>
  
-{{< /admonition >}} 
  
-  * ****//dashboard//**** Activamos el //dashboard//. Necesitamos el //dashboard// activo. Más adelante cuando definamos la configuración dinámica indicaremos en que URL podemos acceder al //dashboard// y le añadiremos seguridad para que no sea público.+  * **//dashboard//** Activamos el //dashboard//. Necesitamos el //dashboard// activo. Más adelante cuando definamos la configuración dinámica indicaremos en que URL podemos acceder al //dashboard// y le añadiremos seguridad para que no sea público.
  
-<code traefik.yml>+<code yaml>
 entryPoints: entryPoints:
   http:   http:
Línea 439: Línea 421:
 Ya hemos dicho que nuestro router básico solo expondrá el //dashboard//, así que tenemos que definir la capa de seguridad de acceso al //dashboard// y una ruta apuntando al servicio. Ya hemos dicho que nuestro router básico solo expondrá el //dashboard//, así que tenemos que definir la capa de seguridad de acceso al //dashboard// y una ruta apuntando al servicio.
  
-Para usar el //middleware// [[https://doc.traefik.io/traefik/middlewares/basicauth/|//Basic Auth//]], necesitamos declarar parejas de usurio:password. Las contraseñas deben ser //hash// MD5, SHA1 o BCrypt.+Para usar el //middleware// [[https://doc.traefik.io/traefik/middlewares/basicauth/|Basic Auth]], necesitamos declarar parejas de usurio:password. Las contraseñas deben ser //hash// MD5, SHA1 o BCrypt.
  
 Para generar las credenciales, es decir la pareja de usuario y password “//hasheada//” podemos usar distintas herramientas. Para generar las credenciales, es decir la pareja de usuario y password “//hasheada//” podemos usar distintas herramientas.
Línea 456: Línea 438:
 </code> </code>
  
-{{admonition type=info title=“Hashes” state=open >}} +<WRAP center round info 60%>
 Si ejecutas varias veces el comando ''%%openssl%%'' con la misma contraseña los resultados serán **distintos**. Si ejecutas varias veces el comando ''%%openssl%%'' con la misma contraseña los resultados serán **distintos**.
  
Línea 471: Línea 452:
  
 Por otro lado veréis que en muchos sitios de internet indican que hay que duplicar los símbolos ‘$’ para escaparlos, tipicamente usando algún filtro //sed// como ''%%| sed -E "s:[\$]:\$\$:g"%%'' pero **solo aplica** cuando usamos //labels// para configurar los servicios, **no en nuestro caso** ya que usamos un fichero la configuración dinámica. Por otro lado veréis que en muchos sitios de internet indican que hay que duplicar los símbolos ‘$’ para escaparlos, tipicamente usando algún filtro //sed// como ''%%| sed -E "s:[\$]:\$\$:g"%%'' pero **solo aplica** cuando usamos //labels// para configurar los servicios, **no en nuestro caso** ya que usamos un fichero la configuración dinámica.
- +</WRAP>
-{{< /admonition >}}+
  
 Una vez que tenemos nuestra contraseña super segura en formato //hash// podemos añadir las siguientes lineas a nuestra configuración dinámica, para definir un //middleware// que llamaremos ''%%myauth%%'': Una vez que tenemos nuestra contraseña super segura en formato //hash// podemos añadir las siguientes lineas a nuestra configuración dinámica, para definir un //middleware// que llamaremos ''%%myauth%%'':
Línea 487: Línea 467:
 </code> </code>
  
-Una vez definido nuestro //middleware// de tipo //basicAuth// solo nos falta definir el [[https://doc.traefik.io/traefik/routing/routers/|//router//]] para nuestro //dashboard//. Lo llamaremos ''%%mydash%%'':+Una vez definido nuestro //middleware// de tipo //basicAuth// solo nos falta definir el //[[https://doc.traefik.io/traefik/routing/routers/|router]]// para nuestro //dashboard//. Lo llamaremos ''%%mydash%%'':
  
 <code yaml> <code yaml>
Línea 554: Línea 534:
 Vamos a organizar nuestro //Docker// con dos //networks//: Vamos a organizar nuestro //Docker// con dos //networks//:
  
-  * ****//frontend//**** En la red //frontend// tendremos todos los contenedores que expongan un interfaz de usuario “al exterior”. Evidentemente nuestro contenedor //Traefik// tiene que estar en esta red. Otro ejemplo sería un servidor web. En realidad todos los contenedores que van implementar servicios a través de //Traefik// tienen que estar conectados a esta red. (Podríamos haberla llamado //traefik//+  * **//frontend//** En la red //frontend// tendremos todos los contenedores que expongan un interfaz de usuario “al exterior”. Evidentemente nuestro contenedor //Traefik// tiene que estar en esta red. Otro ejemplo sería un servidor web. En realidad todos los contenedores que van implementar servicios a través de //Traefik// tienen que estar conectados a esta red. (Podríamos haberla llamado //traefik//
-  * ****//backend//**** Los contenedores que no exponen servicios al exterior solo tienen que estar en esta red. Por ejemplo un servidor de base de datos es muy posible que esté conectado exclusivamente a la red //backend//.+  * **//backend//** Los contenedores que no exponen servicios al exterior solo tienen que estar en esta red. Por ejemplo un servidor de base de datos es muy posible que esté conectado exclusivamente a la red //backend//.
  
 Los contenedores de la red //frontend// pueden necesitar una conexión adicional con la red //backend//. Por ejemplo un contenedor //Wordpress// tiene que estar en la red //frontend// para publicar las páginas web a través de //Traefik// pero también en la red //backend// para comunicarse con el servidor de base de datos. Los contenedores de la red //frontend// pueden necesitar una conexión adicional con la red //backend//. Por ejemplo un contenedor //Wordpress// tiene que estar en la red //frontend// para publicar las páginas web a través de //Traefik// pero también en la red //backend// para comunicarse con el servidor de base de datos.
Línea 570: Línea 550:
 Los rangos de direcciones IP son arbitrarios, igual que los nombres (//frontend// y //backend//) de las redes. Podríamos usar otros cualquiera. Los rangos de direcciones IP son arbitrarios, igual que los nombres (//frontend// y //backend//) de las redes. Podríamos usar otros cualquiera.
  
-{{admonition type=warning title=“Traefik V1: frontend y backend” state=open >}}+<WRAP center round important 60%>
  
 **Ojo** en //Traefik V1// los términos //frontend// y //backend// tienen un significado especial. Nada que ver con las redes definidas en el ejemplo03. Cuando consultes información en internet **asegúrate** de que referencian la versión actual de //Traefik// (2.4 cuando escribo esto). Si hablan mucho de definir el //frontend// y el //backend// es muy posible que estén hablando de //Traefik V1// **Ojo** en //Traefik V1// los términos //frontend// y //backend// tienen un significado especial. Nada que ver con las redes definidas en el ejemplo03. Cuando consultes información en internet **asegúrate** de que referencian la versión actual de //Traefik// (2.4 cuando escribo esto). Si hablan mucho de definir el //frontend// y el //backend// es muy posible que estén hablando de //Traefik V1//
- +</WRAP>
-{{< /admonition >}}+
  
 ==== Traefik ==== ==== Traefik ====
Línea 591: Línea 570:
 Definimos los //middlewares//: Definimos los //middlewares//:
  
-  * ****//secureHeaders//**** Que define una serie de cabeceras que vamos a aplicar a todas las conexiones HTTP de nuestro //Traefik//. * **//frameDeny: true//** Para evitar ataques [[https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#click-jacking|//click-jacking//]] * **//sslRedirect: true//** Para permitir solo peticiones //https// * **//browserXssFilter//** Para paliar ataques de [[https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#cross-site_scripting_xss|//cross site scripting//]] * **//contentTypeNosniff: true//** Ver [[https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options|referencia]] * **//forceSTSHeader: true//**: fuerza cabeceras STS para todas las conexiones, con el flag //preload// y la directiva //includeSubdomains// y un //max-age// de un año. +  * **//secureHeaders//**\\ Que define una serie de cabeceras que vamos a aplicar a todas las conexiones HTTP de nuestro //Traefik//. 
-  * ****//local-whitelist//**** Los servicios a los que apliquemos este //middleware// sólo se podrán acceder desde IP en la //whitelist//. Este //middleware// es interesante si accedes a los servicios desde la intranet. +  * **//frameDeny: true//**\\ Para evitar ataques //[[https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#click-jacking|click-jacking]]// 
-  * ****//user-auth//**** Para definir credenciales de acceso a nuestros servicios con //basicAuth//. //Traefik// nos pedirá usuario y contraseña para los servicios a los que apliquemos este //middleware//+  * **//sslRedirect: true//**\\ Para permitir solo peticiones //https// 
-  * ****//localsec//**** Este es un ejemplo de “cadena de //middlewares//”, aplicar este //middleware// equivale a aplicar //secureHeaders// y //local-whitelist//. **//chain//** es muy interesante para organizar nuestros //middlewares// y aplicar la misma configuración a varios contenedores.+  * **//browserXssFilter//**\\ Para paliar ataques de //[[https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#cross-site_scripting_xss|cross site scripting]]// 
 +  * **//contentTypeNosniff: true//**\\ Ver [[https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options|referencia]] 
 +  * **//forceSTSHeader: true//**:\\ fuerza cabeceras STS para todas las conexiones, con el flag //preload// y la directiva //includeSubdomains// y un //max-age// de un año. 
 +  * **//local-whitelist//**\\ Los servicios a los que apliquemos este //middleware// sólo se podrán acceder desde IP en la //whitelist//. Este //middleware// es interesante si accedes a los servicios desde la intranet. 
 +  * **//user-auth//**\\ Para definir credenciales de acceso a nuestros servicios con //basicAuth//. //Traefik// nos pedirá usuario y contraseña para los servicios a los que apliquemos este //middleware//
 +  * **//localsec//**\\ Este es un ejemplo de “cadena de //middlewares//”, aplicar este //middleware// equivale a aplicar //secureHeaders// y //local-whitelist//. **//chain//** es muy interesante para organizar nuestros //middlewares// y aplicar la misma configuración a varios contenedores.
  
 Contenido del fichero ''%%middlewares.yml%%'': Contenido del fichero ''%%middlewares.yml%%'':
Línea 684: Línea 668:
 ==== docker-compose.yml ==== ==== docker-compose.yml ====
  
-Ahora que ya tenemos listos los ficheros de configuración de //Traefik// vamos a definir el fichero ''%%docker-compose.yml%%'': * Definimos siempre la versión de nuestras imágenes //Docker// explicitamente. Es muy mala idea usar ''%%:latest%%'' en producción, hay que saber que versión usamos y hacer las actualizaciones con conocimiento de causa. * Definimos un nombre (''%%traefik%%'') para nuestro contenedor, y definimos una política para ''%%restarts%%'' * Establecemos la opción ''%%security_opt: no-new-privileges%%'' para impedir escaladas de privilegios con ''%%setuid%%'' * Definimos los //volumes// del contenedor //Traefik// * Mapeamos ''%%/etc/localtime%%'' para que el contenedor sincronice la hora con el //host// * Mapeamos el //socket// de //Docker//, imprescindible para el //provider docker// * Mapeamos el fichero de configuración estática ''%%traefik,yml%%'', el directorio de configuraciones dinámicas ''%%/configurations%%'' y el fichero ''%%acme.json%%'' para el //certresolver// * Añadimos etiquetas (//labels//) para la configuración dinámica del contenedor //Traefik// (concretamente del //dashboard//): * El servicio (se refiere al //dashboard//)se proveerá a través de //Traefik// * El contenedor se conecta a la red //frontend// * Se configura el router ''%%traefik-secure%%'' * Para el servicio //Traefik dashboard//(''%%api@internal%%'') * Con //middleware// ''%%user-auth%%'' * Con la regla ''%%Host(`dashtraefik.yourdomain.com`)%%'' * Por último declaramos la red (//network//) //frontend// como ''%%external%%'' ya que la hemos creado previamente.+Ahora que ya tenemos listos los ficheros de configuración de //Traefik// vamos a definir el fichero ''%%docker-compose.yml%%'': 
 +  * Definimos siempre la versión de nuestras imágenes //Docker// explicitamente. Es muy mala idea usar ''%%:latest%%'' en producción, hay que saber que versión usamos y hacer las actualizaciones con conocimiento de causa. 
 +  * Definimos un nombre (''%%traefik%%'') para nuestro contenedor, y definimos una política para ''%%restarts%%'' 
 +  * Establecemos la opción ''%%security_opt: no-new-privileges%%'' para impedir escaladas de privilegios con ''%%setuid%%'' 
 +  * Definimos los //volumes// del contenedor //Traefik// 
 +  * Mapeamos ''%%/etc/localtime%%'' para que el contenedor sincronice la hora con el //host// 
 +  * Mapeamos el //socket// de //Docker//, imprescindible para el //provider docker// 
 +  * Mapeamos el fichero de configuración estática ''%%traefik,yml%%'', el directorio de configuraciones dinámicas ''%%/configurations%%'' y el fichero ''%%acme.json%%'' para el //certresolver// 
 +  * Añadimos etiquetas (//labels//) para la configuración dinámica del contenedor //Traefik// (concretamente del //dashboard//): 
 +    * El servicio (se refiere al //dashboard//) se proveerá a través de //Traefik// 
 +    * El contenedor se conecta a la red //frontend// 
 +    * Se configura el router ''%%traefik-secure%%'' 
 +      * Para el servicio //Traefik dashboard// (''%%api@internal%%'') 
 +      * Con //middleware// ''%%user-auth%%'' 
 +      * Con la regla ''%%Host(`dashtraefik.yourdomain.com`)%%'' 
 +  * Por último declaramos la red (//network//) //frontend// como ''%%external%%'' ya que la hemos creado previamente.
  
 <code yaml> <code yaml>
Línea 789: Línea 788:
 Añadimos un nuevo servicio ''%%portainer%%'', con las opciones de rearranque y de seguridad iguales a las de //Traefik//. Mapeamos también el fichero ''%%/etc/localtime%%'' para que el contenedor se ponga en hora con el //host//; y el //socket// ''%%docker.sock%%'' que //Portainer// necesita (//Portainer// es un //frontend// para //Docker//) Añadimos un nuevo servicio ''%%portainer%%'', con las opciones de rearranque y de seguridad iguales a las de //Traefik//. Mapeamos también el fichero ''%%/etc/localtime%%'' para que el contenedor se ponga en hora con el //host//; y el //socket// ''%%docker.sock%%'' que //Portainer// necesita (//Portainer// es un //frontend// para //Docker//)
  
-Añadimos también las etiquetas para informar a //Traefik// del nuevo servicio* El servicio se llama //portainer// * Acepta peticiones en el puerto 9000 * //Portainer// usará el //entry point// ''%%https%%'' de //Traefik// * Y la regla de enrutado será ''%%Host(`portainer.yourdomain.com`)%%''+Añadimos también las etiquetas para informar a //Traefik// del nuevo servicio
 +  * El servicio se llama //portainer// 
 +  * Acepta peticiones en el puerto 9000 
 +  * //Portainer// usará el //entry point// ''%%https%%'' de //Traefik// 
 +  * Y la regla de enrutado será ''%%Host(`portainer.yourdomain.com`)%%''
  
 Una vez completada la configuración del DNS, podemos levantar nuestro nuevo servicio con: Una vez completada la configuración del DNS, podemos levantar nuestro nuevo servicio con:
Línea 797: Línea 800:
 </code> </code>
  
-{{admonition type=warning title=“Login en Portainer” state=open >}}+<WRAP center round important 60%>
  
 //Portainer// implementa su propio sistema de gestión y autenticación de usuarios. Además da problemas si activamos el //middleware// ''%%user-auth%%'' //Portainer// implementa su propio sistema de gestión y autenticación de usuarios. Además da problemas si activamos el //middleware// ''%%user-auth%%''
  
 **Tendrás que crear un usuario ''%%admin%%'' y protegerlo con contraseña tan pronto como lo arranques.** **Tendrás que crear un usuario ''%%admin%%'' y protegerlo con contraseña tan pronto como lo arranques.**
- +</WRAP>
-{{< /admonition >}} +
- +
- +
  
guias/traefikv2.1621549154.txt.gz · Última modificación: 2021/05/20 22:19 por Sergio Alvariño