Acogedor servidor VPS para pequeños proyectos: cómo configurarlo



Siempre quise tener un espacio personal en la web. Un lugar donde todo se arreglara de la manera más conveniente para mí Vi la mejor solución como un VPS económico que podía equipar según mis necesidades. Durante mucho tiempo no pude abordar la solución de este problema, pero de alguna manera surgió imperceptiblemente un conjunto de herramientas que me permitieron organizar el entorno de software que quería. 



Si también desea crear su propio espacio personal en la red, pero no sabe por dónde empezar, o simplemente está interesado en productos de software tan maravillosos como Docker, Portainer, Traefik, bienvenido bajo cat.



Introducción



Para ser honesto, no me gusta mucho la línea de comandos. Es decir, me gusta la idea misma de una interfaz universal, minimalista y ligera que casi no requiere recursos, pero una ventana negra con un cursor parpadeante me hace sentir frustrado e indefenso. E incluso sé de dónde lo saqué. 



Cuando estaba estudiando en el instituto (es la época en que acaba de aparecer Internet con tarjetas y el primer cibercafé en mi ciudad), mi amigo, que para ese momento había logrado conseguir trabajo como ayudante de laboratorio en el Departamento de Ciencias de la Computación, trató activamente de engancharme a Linux. Y aquí estoy, considerándome un científico informático avanzado, con experiencia, probablemente, cientos de instalaciones de Windows, vuelvo a casa después de graduarme y con un movimiento seguro inserto el disco con el kit de distribución de Linux en la unidad ... ¿Y qué? Y nada. 



Durante muchos años no recuerdo todos los detalles, probablemente incluso logré establecerlo, pero luego hubo un error, simplemente no entendía qué hacer. La forma habitual que funcionaba en Windows: hurgar en el panel de control al azar incluyendo diferentes configuraciones hasta que todo funciona (o se rompe por completo, pero luego fue posible reinstalar Windows y comenzar de nuevo) no funcionó aquí. Todo lo que tenía era una consola que rechazaba mis intentos de modificar las cosas una y otra vez. Recuerdo que incluso tenía un libro sobre Linux, que tampoco ayudó de ninguna manera: los comandos que se dieron allí, por alguna razón, por alguna razón, no funcionaron. En general, después de sufrir durante varios días, decidí por mí mismo que Linux es una especie de tontería, y con alivio volví a mi Windows habitual. 



También hubo intentos de dominar Linux, la vida una y otra vez me unió a sus fanáticos, quienes intentaron arrastrarme a su campamento, incluso de alguna manera traté de poner un gante (sin éxito, claro, aunque tenía una copia impresa con un guía paso a paso sobre cómo hacerlo), pero la maldición de la consola se cernía sobre mí, y con cada falla esa misma sensación de impotencia se hacía más fuerte. Después de la interfaz gráfica de Windows, donde todas las configuraciones están frente a ti de un vistazo, chocando con la consola, me sentí ciego, tratando de encontrar mi camino con el tacto en un lugar desconocido. Así que durante mucho tiempo fui partidario de la pila de tecnología de Microsoft, programando en .net usando VisualStudio (es magnífico y no tiene consola). Por favor, no juzgues estrictamente, quizás si en ese momento tuve la oportunidad de poner Linux en una máquina virtual,Para afrontarlo con calma y disponer de un Internet decente, esta historia daría un giro completamente diferente.



Ahora todo ha cambiado. Con el advenimiento de la web en su forma moderna en nuestra vida, me cambié a Node.js y, de cualquier manera, comencé a imbuirme de la ideología de la consola y Linux. Para albergar mis desarrollos, necesitaba un VPS, y resultó que los VPS con Windows son mucho más caros, por lo que mi sapo superó mis frustraciones con respecto a la consola, y la presencia de Internet de alta velocidad hizo posible encontrar instantáneamente respuestas a los emergentes. preguntas. 



Aprendí a usar ssh, me di cuenta del poder de git y comencé a usar Docker activamente, pero también me gusta usar una interfaz gráfica para mis tareas, y en este artículo quiero presentarles un maravilloso conjunto de herramientas que me permiten resolver mis tareas cotidianas, sin referirme una vez más a la consola.



Preparación



Creé un VPS de configuración mínima (vCPU: 1 core, RAM: 1 GB, NVMe: 20 GB) en macloud . Para la instalación en un VPS, elegí la distribución Debian 10. Al instalar, inmediatamente agregué una clave SSH a través del panel de control, por lo que sería conveniente ingresar a la consola usando un cliente SSH. Para más experimentos, necesitará lo siguiente:



  1. Actualiza el sistema
  2. Instalar docker y docker-compose
  3. Incluir archivo de intercambio.


Puede actualizar el sistema operativo con los siguientes comandos:



# apt update

   

# apt upgrade

 ,    .
      
      





Para instalar Docker, siga las instrucciones oficiales https://docs.docker.com/engine/install/debian/



Instale las dependencias necesarias:



# apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
      
      





Agregue la clave GPG oficial de Docker:



# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
      
      





Agrega el repositorio:



# echo «deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable» | tee /etc/apt/sources.list.d/docker.list > /dev/null
      
      





Ahora queda actualizar la lista de paquetes:



# apt-get update
      
      





e instalar Docker:

# apt-get install docker-ce docker-ce-cli containerd.io
      
      





Puede comprobar que todo está instalado correctamente ejecutando el comando:



# docker run hello-world
      
      





Si aparece un saludo, todo salió bien. En el momento de escribir este artículo, tengo instalada la siguiente versión:



# docker -v

Docker version 20.10.6, build 370c289

      
      





Ahora necesita instalar docker-compose. Para hacer esto, usaremos las instrucciones oficiales:



https://docs.docker.com/compose/install/



Primero, necesitamos obtener un enlace a la última versión de docker-compose. La lista de lanzamientos se puede encontrar aquí: https://github.com/docker/compose/releases



En el momento de escribir este artículo, la versión más reciente era la 1.29.2. Necesitamos una versión de Linux, por lo que seleccionamos un archivo llamado docker-compose-Linux-x86_64. Copiemos el enlace. Ahora debe ingresar el siguiente comando en la consola (pegue el enlace que recibió arriba en el lugar correcto):



# curl -L "<  >" -o /usr/local/bin/docker-compose
      
      





 En mi caso, resultó:



# curl -L «https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64» -o /usr/local/bin/docker-compose
      
      





Ejecute el comando y descargue el binario docker-compose.



El último paso es establecer el permiso de ejecución. Esto se puede hacer con el siguiente comando:



# chmod +x /usr/local/bin/docker-compose
      
      





Si todo salió bien, entonces el proceso de instalación ha terminado, ahora puede verificar la versión de docker-compose. Lo tengo así:



# docker-compose -v

docker-compose version 1.29.2, build 5becea4c
      
      





El último paso es habilitar el archivo de paginación, dada la pequeña cantidad de memoria, definitivamente no será superfluo:



Cree un archivo de 4 GB



# fallocate -l 4G /swapfile

      
      





Démosle los derechos necesarios:



# chmod 600 /swapfile
      
      





Inicialicémoslo como un archivo de intercambio:



# mkswap /swapfile
      
      





Finalmente, activamos:



# swapon /swapfile
      
      





Puede verificar si el archivo de paginación ha aparecido en el sistema con el comando gratuito. Lo tengo todo:



# free

              total        used        free      shared  buff/cache   available

Mem:        1010900      150500      143788        2892      716612      714916

Swap:       4194300           0     4194300

      
      





Queda un último paso: para que el archivo de paginación permanezca activo después de un reinicio, agregue la siguiente línea al archivo / etc / fstab:



/swapfile swap swap defaults 0 0
      
      







Para tales tareas, me gusta usar el administrador de archivos Midnight Commander. Es un administrador de archivos de consola con una interfaz clásica. Si se ha encontrado con Norton Commander / FAR / TotalCommander, comprenderá fácilmente cómo usarlo. Puedes instalarlo con el siguiente comando:



# apt-get install mc
      
      







Y corre con el comando 



# mc

      
      





Veamos una imagen dolorosamente familiar:





Ahora encontraremos el archivo requerido y lo editaremos:





Esto completa la configuración preliminar, puede continuar.



Portainer



La primera herramienta que me gustaría presentarles es Portainer. Portainer es una herramienta de administración de contenedores para Docker, Swarm, Kubernetes y Azure ACI. Como dice la documentación de Portainer:



"Al negar la  necesidad de que los usuarios utilicen la interfaz de línea de comandos, escriban YAML o comprendan los manifiestos, Portainer hace que la implementación de aplicaciones y la resolución de problemas sea tan fácil que cualquiera puede hacerlo".



Para mis propósitos, Portainer es simplemente perfecto. Vamos a conocerlo mejor. Según la documentación https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/, la forma más sencilla de hacerlo es la siguiente:



Cree un volumen para almacenar datos:



# docker volume create portainer_data
      
      





Ahora puede iniciar Portainer con el siguiente comando:



# docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
      
      





Después de iniciar Portainer, estará disponible en http: // <ip del servidor>: 9000 /



Cuando inicie Portainer por primera vez, le pedirá que especifique la contraseña de administrador, después de lo cual le preguntará cómo conectarse a la ambiente:





Seleccioné la opción para conectarme a Docker local, después de lo cual apareció la pantalla de inicio de Portainer:





Como puede ver, hay un punto final local disponible, luego puede agregar conexiones a otros nodos si es necesario.



Entremos en él y veremos un panel conveniente con información resumida:





Aquí es donde podemos gestionar todos los aspectos del funcionamiento de Docker. Veamos qué tenemos en nuestros contenedores:





Hasta ahora, un contenedor es el propio Portainer. La interfaz es muy conveniente para ver y administrar contenedores, y también existe la posibilidad de agregar nuevos. Puede revisar el resto de las pestañas y ver lo conveniente y reflexiva que tiene Portainer.



Lo más interesante es la pestaña Pilas. Una pila es una colección de contenedores interconectados que se ejecutan y funcionan juntos. De hecho, es lo mismo que Docker Compose, cuya configuración describimos en el archivo docker-compose.yml y luego ejecutamos con el comando docker-compose up.  



Portainer le permite agregar una pila al sistema de varias formas, desde editar con el editor incorporado hasta descargar desde github.





El formato docker-compose se usa para definir la pila, que es lo que funciona aquí debajo del capó. Con esta función, me resulta más conveniente construir la infraestructura necesaria a partir de contenedores.



En este punto, propongo desviarnos del estudio de las capacidades del portainer por ahora. Creo que ya has visto que se trata de una herramienta seria, gracias a la cual puedes abandonar casi por completo el uso de la CLI de la ventana acoplable. Ahora echemos un vistazo rápido a lo que quiero obtener como resultado en este VPS.



Periódicamente tengo la necesidad de desarrollar proyectos "rápidos". Esto es lo que llamo proyectos que no requieren un estudio profundo. Estos pueden ser experimentos, sitios pequeños, bots, recolectores de información, etc. Todo lo que no requiera la construcción de una cadena CI / CD. Sería extremadamente conveniente para mí desarrollar y depurar dichas aplicaciones justo donde funcionarán. Además, a menudo tengo una situación en la que estoy lejos de mi lugar de trabajo con un entorno de desarrollo configurado, y si algo en estos proyectos míos comienza a funcionar mal, me gustaría poder comprender rápidamente la situación y solucionar el problema. o simplemente trabaje en proyectos mientras tiene un minuto libre desde cualquier computadora, incluso si no tiene nada excepto un navegador y acceso a Internet.



Para facilitar el acceso, he comprado un nombre de dominio y quiero configurar dominios de tercer nivel para varias herramientas, de modo que, por ejemplo, el portainer esté disponible en portainer.example.com. También quiero que todo funcione a través de https, y para no molestarme en comprar certificados SSL, use Let's Encrypt. Otro requisito es que todo lo que no se supone que sea de acceso público esté cerrado mediante autenticación.



Para implementar todo esto, conozcamos la siguiente gran herramienta. Eso…



Traefik



Traefik es un servidor proxy inverso que está diseñado para el manejo de contenedores. Las siguientes características son importantes para mí:



  • actualización de configuración sobre la marcha
  • soporte de Docker como proveedor de configuración
  • trabajando con Let's encripte desde el primer momento


Para ejecutar traefik con portainer, usaremos el ejemplo de docker-compose.yml proporcionado en la documentación de portainer: https://documentation.portainer.io/v2.0/ad/traefik/rp-traefik/



version: «3.9»

services:

  traefik:

    container_name: traefik

    image: «traefik:latest»

    container_name: traefik

    command:

      - «--entrypoints.web.address=:80»

      - «--entrypoints.websecure.address=:443»

      - «--providers.docker=true»

      - «--providers.docker.exposedbydefault=false»

      - «--log.level=ERROR»

      - «--certificatesresolvers.leresolver.acme.httpchallenge=true»

      - «--certificatesresolvers.leresolver.acme.email=user@mymail.com»

      - «--certificatesresolvers.leresolver.acme.storage=./acme.json»

      - «--certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web»

      - «--entrypoints.web.http.redirections.entryPoint.to=websecure»

      - «--entrypoints.web.http.redirections.entryPoint.scheme=https»

      - «--metrics.prometheus=true»

    ports:

      - «80:80»

      - «443:443»

    volumes:

      - «/var/run/docker.sock:/var/run/docker.sock:ro»

      - «./acme.json:/acme.json»

    networks:

      - intranet

    labels:

      - «traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)»

      - «traefik.http.routers.http-catchall.entrypoints=web»

      - «traefik.http.routers.http-catchall.middlewares=redirect-to-https»

      - «traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https»

portainer:

    image: portainer/portainer-ce:2.5.0-alpine

    container_name: portainer

    command: -H unix:///var/run/docker.sock

    restart: always

    volumes:

      - /var/run/docker.sock:/var/run/docker.sock

      - portainer_data:/data

    networks:

      - intranet

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.frontend.rule=Host(`portainer.example.com`)»

      - «traefik.http.routers.frontend.entrypoints=websecure»

      - «traefik.http.services.frontend.loadbalancer.server.port=9000»

      - «traefik.http.routers.frontend.service=frontend»

      - «traefik.http.routers.frontend.tls.certresolver=leresolver»

volumes:

  portainer_data:

networks:

  intranet:

    name: intranet
      
      





Para que el proceso de obtención del certificado Let's encrypt sea exitoso, debe asegurarse de que los registros DNS estén configurados correctamente antes de comenzar. Utilizo cloudflare para estos fines, y en él la configuración debería verse así:





La columna "Contenido" debe contener la dirección de nuestro VPS.



Ahora, si copia el docker-compose.yml resultante en el servidor, ejecute el siguiente comando:



 # docker-compose up -d
      
      





Luego, después de iniciar en portainer.example.com, aparecerá la siguiente imagen:





Además, ya estará protegido por el certificado Let's Encrypt:





Traefik tiene un panel de control muy útil para ayudarlo a comprender si los ajustes de configuración se aplicaron correctamente. Para activarlo, debe agregar las siguientes líneas a docker-compose.yml:



services:

  traefik:

  ...

    command:

      ...

      - «--api.dashboard=true»

    labels:

      ...

      - «traefik.enable=true»

      - «traefik.http.routers.traefik.entrypoints=websecure»

      - «traefik.http.routers.traefik.rule=Host(`traefik.example.com`)»

      - «traefik.http.routers.traefik.tls=true»

      - «traefik.http.routers.traefik.service=api@internal»

      - «traefik.http.routers.traefik.tls.certresolver=leresolver»

      - «traefik.http.services.traefik.loadbalancer.server.port=8080»  
      
      





También debe agregar el dominio de tercer nivel traefik.example.com en la configuración de DNS. Esto se puede hacer por analogía con cómo se agregó anteriormente el dominio para portainer. Después de aplicar la configuración en traefik.example.com, veremos el tablero:





Como puede ver, Traefik ha demostrado ser una gran herramienta. Trabaja en estrecha colaboración con Docker y sus capacidades de configuración dinámica le permiten abandonar por completo el uso de archivos de configuración para la configuración de enrutamiento. En su lugar, simplemente escribimos todos los parámetros necesarios como etiquetas para el servicio personalizado, de modo que todas las configuraciones estén en un solo lugar.



Ahora propongo desviarnos un poco de la configuración de servicios básicos y agregar un entorno de desarrollo al sistema. Será…



Servidor de código de Visual Studio



Para mí, el entorno de desarrollo o IDE siempre ha sido algo muy serio. Un potente paquete de software que se instala en la máquina de un desarrollador ocupa muchos gigabytes de espacio en disco y RAM. Un ejemplo de un IDE de este tipo que he estado usando durante muchos años, y todavía creo que esta es la mejor opción si trabaja con la pila de tecnología de Microsoft, es Microsoft VisualStudio. Cuando comencé a aprender Node.js, descubrí VSCode y, a pesar de los nombres relacionados, es un IDE completamente diferente, con un concepto y capacidades completamente diferentes. El hecho de que VSCode utilice el motor Chrome para mostrar su interfaz permite que VSCode se separe. Gracias a esta arquitectura, nació Visual Studio Code Server, que puede ejecutarse en un VPS, mientras que la interfaz VSCode será accesible a través de un navegador. Y no, este no es otro editor de código en línea,es un VSCode IDE completo que tiene todas sus excelentes características.



Para agregar VSCode Server a mi VPS, crearé una nueva pila en Portainer, lo llamaré code-server y agregaré la siguiente configuración allí:



version: «3.9»

volumes:

  codeserverdata:

  codeappdir:

networks:

  intranet:

    external: true 

services:

  code-server:

    image: ghcr.io/linuxserver/code-server

    container_name: code-server

    environment:

      - PUID=1000

      - PGID=1000

      - TZ=Europe/London

#      — PASSWORD=password #optional

      - SUDO_PASSWORD=password #optional

      - PROXY_DOMAIN=code.example.com

    volumes:

      - codeserverdata:/config

      - codeappdir:/app

    extra_hosts:

      host.docker.internal: host-gateway

    restart: always

    networks:

      - intranet

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.code.rule=Host(`code.example.com`)»

      - «traefik.http.routers.code.tls=true»

      - «traefik.http.routers.code.tls.certresolver=leresolver»
      
      







Además, antes de comenzar, no olvide agregar el código de dominio de tercer nivel.ejemplo.com a sus registros DNS. Ahora queda hacer clic en el botón Implementar la pila.



Una vez finalizado el proceso, aparecerá una nueva pila en el portainer, y si vamos a code.example.com , veremos la siguiente imagen (inmediatamente encendí el tema oscuro):





Aquí puede desarrollar de la misma manera que en la versión de escritorio de VSCode. En general, la única diferencia que encontré es la diferencia en el enlace predeterminado de algunos atajos de teclado, pero te acostumbras rápidamente en el proceso de uso.



Por conveniencia, conecté el volumen que monté al directorio / app al contenedor del servidor de códigos, por lo que es mejor crear o clonar proyectos desde el repositorio allí, en cuyo caso los datos no se perderán incluso cuando el contenedor se vuelva -creado.



Esta imagen ya tiene Node.js instalado, por lo que no tuve que hacer nada y puedo comenzar a trabajar en mis proyectos de inmediato. Si necesita otros YP en su trabajo, tenga en cuenta que los creadores de esta imagen mantienen un catálogo de modificaciones que le permiten agregar soporte para varias plataformas. Puede leer sobre cómo usarlos en la descripción de la imagen en Docker Hub, y la lista de modificaciones oficiales se puede encontrar aquí: mods.linuxserver.io/?mod=code-server



Tenga en cuenta también que la contraseña de sudo se especifica en el configuración del contenedor ... Para la demostración, lo dejé simple, pero en la práctica es mejor hacerlo complejo, o incluso mejor usar la propiedad SUDO_PASSWORD_HASH para no almacenar la contraseña en texto sin cifrar. Puedes leer cómo hacer esto en la descripción de la imagen aquí: hub.docker.com/r/linuxserver/code-server



Como probablemente ya haya notado, en este momento el acceso al servidor de códigos no está protegido de ninguna manera y ahora cualquiera que visite code.example.com tendrá acceso. Esta es una opción muy mala y, aunque puede habilitar el acceso con contraseña en la configuración de la imagen, me gustaría tener un único inicio de sesión para acceder a todos los recursos ubicados en el servidor. Para hacer esto, propongo familiarizarse con la siguiente herramienta. Será…



KeyCloak 



KeyCloak es una herramienta moderna para organizar el acceso a sistemas distribuidos utilizando tecnología de inicio de sesión único. De hecho, es la única herramienta gratuita con una funcionalidad tan poderosa que he podido encontrar. Si conoce una alternativa que valga la pena, asegúrese de escribir sobre ella en los comentarios.



Para agregarlo a mi sistema, creé una nueva pila llamada auth en portainer y le agregué la siguiente configuración:



version: '3.9'

networks:

  intranet:

    external: true 

services:

 keycloak:

    image: jboss/keycloak

    container_name: keycloak

    restart: always

    networks:

      - intranet

    environment: 

      KEYCLOAK_PASSWORD: password

      PROXY_ADDRESS_FORWARDING: «true»

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.keycloak.rule=Host(`auth.yourdomain.com`)»

      - «traefik.http.routers.keycloak.tls=true»

      - «traefik.http.routers.keycloak.tls.certresolver=leresolver»
      
      







Después de hacer clic en el botón Implementar la pila, KeyCloak estará disponible en auth.example.com . Si vamos allí, seremos recibidos por la ventana de bienvenida de KeyCloak:







Vayamos a la consola de administración:





El nombre de usuario será admin y la contraseña inicial es la que establecemos en la configuración de pila de la variable de entorno KEYCLOAK_PASSWORD. Después de iniciar sesión, llegaremos al panel de administración de KeyCloak:





Las recomendaciones para la configuración inicial de KeyCloak para Docker se pueden encontrar en la documentación oficial aquí www.keycloak.org/getting-started/getting-started-docker .



En resumen, debe crear un nuevo Reino personalizado, crear un usuario en él y agregar un nuevo cliente.



Para el cliente, debe configurar el Tipo de acceso: confidencial y agregar nuestros dominios a los URI de redireccionamiento válidos, mientras que estos son "https://traefik.example.com/*" y " code.example.com *":







Después de instalar Tipo de acceso: confidencial, aparecerá la pestaña Credenciales, en la que puede recoger el Secreto, nos será útil más adelante cuando lo configure.



Con esto concluye la configuración de KeyCloak por ahora. Ahora tenemos que hacernos amigos de Traefik. Permítame recordarle que queremos evitar que los usuarios no autenticados accedan a code.example.com y traefik.example.com. Para estos fines, traefik cuenta con un middleware ForwardAuth que le permite organizar la autorización a través de un servicio externo. Para asegurar su interacción KeyCloak necesitamos un servicio intermedio, usaré github.com/thomseddon/traefik-forward-auth . También está disponible como una imagen en Docker Hub, por lo que solo agregaré la configuración de pila de autenticación del portainer con este servicio:



  traefik-forward-auth:

    image: thomseddon/traefik-forward-auth

    container_name: traefik-forward-auth

    environment:

      - DEFAULT_PROVIDER=oidc

      - PROVIDERS_OIDC_ISSUER_URL=https://auth.example.com/auth/realms/example

      - PROVIDERS_OIDC_CLIENT_ID=traefik

      - PROVIDERS_OIDC_CLIENT_SECRET=d7fb86f0-71a9-44f7-ab04-967f086cd89e

      - SECRET=something-random

      - LOG_LEVEL=debug

    labels:

      - «traefik.enable=true»

      - «traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181»

      - «traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User»

      - «traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181»

    restart: always

      
      





Aquí, la variable PROVIDERS_OIDC_ISSUER_URL debe contener la ruta al Reino que creamos anteriormente en Keycloak, PROVIDERS_OIDC_CLIENT_ID debe contener el nombre del cliente que creé anteriormente en este reino, y PROVIDERS_OIDC_CLIENT_SECRET debe tomarse de la pestaña Credenciales de este cliente. En la variable SECRET, debe completar una cadena aleatoria.



Ahora, para cerrar el servicio, enrutamiento al que brinda Traefik, basta con agregar la siguiente línea a las etiquetas:



      - "traefik.http.routers.< >.middlewares=traefik-forward-auth"
      
      







Para empezar, decidí cerrar el servidor de código con autenticación, para lo cual entré en su pila y agregué su configuración. El resultado es el siguiente (por brevedad, cito solo la sección de etiquetas):



    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.code.rule=Host(`code.example.com`)»

      - «traefik.http.routers.code.tls=true»

      - «traefik.http.routers.code.tls.certresolver=leresolver»

      - «traefik.http.routers.code.middlewares=traefik-forward-auth»
      
      







Haga clic en el botón Actualizar pila e intente visitar code.example.com. Si todo se hace correctamente, aparecerá la ventana de inicio de sesión:





Después de ingresar el nombre de usuario y la contraseña correctos (que había configurado previamente en KeyCloak), ingresé a la interfaz del servidor de códigos. ¡Todo está funcionando!



 De manera similar, cerré el tablero traefik de miradas indiscretas. Para hacer esto, tuve que ir a la consola (Portainer no puede realizar cambios en la configuración de la pila, que no fue creada por él, pero levanté Traefik desde la consola) y de manera similar editar docker-compose.yml:



    labels:

      - «traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)»

      - «traefik.http.routers.http-catchall.entrypoints=web»

      - «traefik.http.routers.http-catchall.middlewares=redirect-to-https»

      - «traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https»

      - «traefik.enable=true»

      - «traefik.http.routers.traefik.entrypoints=websecure»

      - «traefik.http.routers.traefik.rule=Host(`traefik.example.com`)»

      - «traefik.http.routers.traefik.tls=true»

      - «traefik.http.routers.traefik.service=api@internal»

      - «traefik.http.routers.traefik.tls.certresolver=leresolver»

      - «traefik.http.routers.traefik.middlewares=traefik-forward-auth»

      - «traefik.http.services.traefik.loadbalancer.server.port=8080»
      
      







Para comprobarlo, fui a traefik.example.com. Para asegurarme de que todo funciona como debe, tuve que abrir una ventana del navegador en modo incógnito, de lo contrario el sistema me reconoció y no me pidió contraseña, ya que había iniciado sesión previamente para acceder al servidor de códigos y por lo tanto KeyCloak autenticado yo automáticamente. 



Por lo tanto, utilizando una combinación de KeyCloak y Traefik, logré proteger los elementos sensibles de mi sistema del acceso no autorizado. La ventaja de este enfoque es que le permite hacer esto incluso cuando no existen mecanismos de autenticación patentados. Por supuesto, hay inconvenientes: KeyCloak es bastante pesado, consume muchos recursos, principalmente memoria, y en términos de capacidades, esto es una exageración obvia, lo más probable es que no necesite la mayor parte de lo que puede hacer. Alternativamente, se podría usar un servicio en la nube, por ejemplo, traefik-forward-auth tiene soporte integrado de Google OAuth.



conclusiones



En este artículo, nos familiarizamos con un conjunto de herramientas, cuyo uso conjunto puede simplificar y automatizar en gran medida una amplia gama de tareas que surgen hoy en la práctica de muchos especialistas en TI. Configuraciones como:



  • Conexión de nombres de dominio
  • Configuración de TLS
  • Obtención e instalación de certificados
  • Autenticación


se realizan en varias líneas directamente en la configuración del servicio.



Por supuesto, a la hora de configurar, tuve que hacer mucho desde la consola, pero en el futuro, con el uso diario, el sistema construido me permitirá reducir su uso, lo que sin duda es un plus para mí.



Cuando estaba escribiendo este artículo, la principal dificultad era reunir toda la información necesaria. Muchas cosas de la documentación no son obvias y, a menudo, para que el sistema funcione según sea necesario, tuvo que buscar una solución al problema en varios problemas en github y preguntas de stackoverflow. Por lo tanto, traté de resaltar varios puntos con más detalle y espero que mi investigación ayude a alguien a comprender mejor los productos descritos.



También espero sinceramente críticas constructivas en los comentarios e ideas sobre cómo hacer mejor lo que traté de implementar aquí. Por ejemplo, realmente me gustaría encontrar una alternativa más liviana a KeyCloak, porque es algo pesado para este tipo de tarea.



Para mayor comodidad, coloqué los archivos de configuración en el repositorio aquí: https://github.com/debagger/vps-docker-workspace ¡



Gracias por su atención!






Los servidores en la nube de Macleod son rápidos y seguros.



Regístrese usando el enlace de arriba o haciendo clic en el banner y obtenga un 10% de descuento durante el primer mes de alquiler de un servidor de cualquier configuración.






All Articles