J'ai toujours voulu avoir un espace personnel sur le web. Un endroit où tout serait arrangé aussi bien pour moi. J'ai vu la meilleure solution comme un VPS bon marché que je pourrais équiper en fonction de mes besoins. Pendant longtemps, je n'ai pas pu aborder la solution de ce problème, mais de manière imperceptible, un ensemble d'outils est apparu qui m'a permis d'organiser un environnement logiciel tel que je le souhaitais.
Si vous souhaitez également créer votre propre espace personnel sur le réseau, mais que vous ne savez pas par où commencer, ou si vous êtes simplement intéressé par des logiciels aussi merveilleux que Docker, Portainer, Traefik - bienvenue sous cat.
introduction
Pour être honnête, je n'aime pas vraiment la ligne de commande. Autrement dit, j'aime l'idée même d'une interface légère, minimaliste et universelle qui ne nécessite presque aucune ressource, mais une fenêtre noire avec un curseur clignotant me rend frustré et impuissant. Et je sais même d'où je l'ai eu.
Quand j'étudiais à l'institut (c'est le moment où Internet avec des cartes et le premier cybercafé vient d'apparaître dans ma ville), mon ami, qui à ce moment-là avait réussi à trouver un emploi d'assistant de laboratoire au département de Informatique, a activement essayé de m'accrocher à Linux. Et me voici, me considérant comme un informaticien avancé, ayant probablement l'expérience de centaines d'installations Windows, rentre à la maison après l'obtention du diplôme et avec un mouvement confiant, insérez le disque avec le kit de distribution Linux dans le lecteur ... Et alors? Et rien.
Pendant de nombreuses années, je ne me souviens plus de tous les détails, j'ai probablement même réussi à les établir, mais il y a eu un échec - je ne savais tout simplement pas quoi faire. La manière habituelle qui fonctionnait sous Windows - fouiller dans le panneau de configuration au hasard en incluant différents paramètres jusqu'à ce que tout fonctionne (ou se casse complètement, mais il était alors possible de réinstaller Windows et de tout recommencer) ne fonctionnait pas ici. Tout ce que j'avais était une console qui rejetait mes tentatives de peaufiner les choses encore et encore. Je me souviens que j'avais même un livre sur Linux, qui n'a pas non plus aidé en aucune façon - les commandes qui y étaient données, pour une raison quelconque, pour une raison quelconque, ne fonctionnaient pas. En général, après avoir souffert pendant plusieurs jours, j'ai alors décidé pour moi-même que Linux était une sorte d'absurdité, et avec soulagement je suis retourné à mon Windows habituel.
Il y a eu aussi des tentatives pour maîtriser Linux, la vie m'a maintes fois réuni avec ses fans, qui ont essayé de me traîner dans leur camp, j'ai même en quelque sorte essayé de mettre un gant (sans succès, bien sûr, même si j'avais une impression avec un guide étape par étape sur la façon de le faire), mais la malédiction de la console planait au-dessus de moi, et à chaque échec, ce même sentiment d'impuissance devenait plus fort. Après l'interface graphique de Windows, où tous les paramètres sont devant vous en un coup d'œil, en collision avec la console, je me suis senti aveugle, essayant de trouver mon chemin au toucher dans un endroit inconnu. Donc, pendant très longtemps, j'ai été un partisan de la pile technologique de Microsoft, en programmant en .net en utilisant VisualStudio (c'est magnifique, et pas de console). Ne jugez pas strictement, peut-être si à ce moment-là j'ai eu l'opportunité de mettre Linux sur une machine virtuelle,pour y faire face sereinement et disposer d'un Internet décent à portée de main, cette histoire prendrait une tournure complètement différente.
Maintenant, tout a changé. Avec l'avènement du Web sous sa forme moderne dans notre vie, je suis passé à Node.js et bon gré mal gré a commencé à être imprégné de l'idéologie de la console et de Linux. Pour héberger mes développements, j'avais besoin d'un VPS, et il s'est avéré que les VPS avec Windows sont beaucoup plus chers, donc mon crapaud a compensé mes frustrations concernant la console, et la présence d'Internet haut débit a permis de trouver instantanément des réponses aux émergents. des questions.
J'ai appris à utiliser ssh, j'ai réalisé la puissance de git et j'ai commencé à utiliser activement docker, mais j'aime aussi utiliser une interface graphique pour mes tâches, et dans cet article, je veux vous présenter un merveilleux ensemble d'outils qui me permettent de résoudre mes tâches quotidiennes, sans me référer une fois de plus à la console.
Préparation
J'ai créé un VPS de configuration minimale (vCPU: 1 core, RAM: 1 GB, NVMe: 20 GB) sur macloud . Pour l'installation sur un VPS, j'ai choisi la distribution Debian 10. Lors de l'installation, j'ai immédiatement ajouté une clé SSH via le panneau de contrôle, afin qu'il soit pratique d'entrer dans la console en utilisant un client SSH. Pour d'autres expériences, vous aurez besoin des éléments suivants:
- Mettre à jour le système
- Installer docker et docker-compose
- Inclure le fichier d'échange.
Vous pouvez mettre à jour le système d'exploitation avec les commandes suivantes:
# apt update
# apt upgrade
, .
Pour installer docker, suivez les instructions officielles https://docs.docker.com/engine/install/debian/
Installez les dépendances requises:
# apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
Ajoutez la clé officielle Docker GPG:
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Ajoutez le référentiel:
# 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
Il reste maintenant à mettre à jour la liste des packages:
# apt-get update
et installez docker:
# apt-get install docker-ce docker-ce-cli containerd.io
Vous pouvez vérifier que tout est correctement installé en exécutant la commande:
# docker run hello-world
Si un message d'accueil apparaît, tout s'est bien passé. Au moment d'écrire ces lignes, j'ai la version suivante installée:
# docker -v
Docker version 20.10.6, build 370c289
Vous devez maintenant installer docker-compose. Pour ce faire, nous utiliserons les instructions officielles:
https://docs.docker.com/compose/install/
Tout d'abord, nous devons obtenir un lien vers la dernière version de docker-compose. La liste des versions peut être trouvée ici: https://github.com/docker/compose/releases
Au moment d'écrire ces lignes, la version la plus récente était la 1.29.2. Nous avons besoin d'une version Linux, nous sélectionnons donc un fichier appelé docker-compose-Linux-x86_64. Copions le lien vers celui-ci. Maintenant, vous devez entrer la commande suivante dans la console (collez le lien que vous avez reçu ci-dessus au bon endroit):
# curl -L "< >" -o /usr/local/bin/docker-compose
Dans mon cas, il s'est avéré:
# curl -L «https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64» -o /usr/local/bin/docker-compose
Exécutez la commande et téléchargez le binaire docker-compose.
La dernière étape consiste à définir l'autorisation d'exécution pour celui-ci. Cela peut être fait avec la commande suivante:
# chmod +x /usr/local/bin/docker-compose
Si tout s'est bien passé, le processus d'installation est terminé, vous pouvez maintenant vérifier la version de docker-compose. Je l'ai eu comme ça:
# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
La dernière étape consiste à activer le fichier d'échange, étant donné la petite quantité de mémoire, il ne sera certainement pas superflu:
Créez un fichier de 4 Go
# fallocate -l 4G /swapfile
Attribuons-lui les droits nécessaires:
# chmod 600 /swapfile
Initialisons-le en tant que fichier d'échange:
# mkswap /swapfile
Enfin, nous activons:
# swapon /swapfile
Vous pouvez vérifier si le fichier d'échange est apparu dans le système avec la commande gratuite. J'ai tout:
# free
total used free shared buff/cache available
Mem: 1010900 150500 143788 2892 716612 714916
Swap: 4194300 0 4194300
Il reste une dernière étape: pour que le fichier d'échange reste actif après un redémarrage, ajoutez la ligne suivante au fichier / etc / fstab:
/swapfile swap swap defaults 0 0
Pour de telles tâches, j'aime utiliser le gestionnaire de fichiers Midnight Commander. C'est un gestionnaire de fichiers console avec une interface classique. Si vous êtes tombé sur Norton Commander / FAR / TotalCommander, vous comprendrez facilement comment l'utiliser. Vous pouvez l'installer avec la commande suivante:
# apt-get install mc
Et courir avec la commande
# mc
Voyons une image douloureusement familière:
Maintenant, nous allons trouver le fichier requis et le modifier:
Ceci termine la configuration préliminaire, vous pouvez passer à autre chose.
Portainer
Le premier outil que je voudrais vous présenter est Portainer. Portainer est un outil de gestion de conteneurs pour Docker, Swarm, Kubernetes et Azure ACI. Comme l'indique la documentation de Portainer:
"En supprimant la nécessité pour les utilisateurs d'utiliser l'interface de ligne de commande, d'écrire YAML ou de comprendre les manifestes, Portainer rend le déploiement d'applications et le dépannage si faciles que n'importe qui peut le faire."
Pour mes besoins, Portainer est tout simplement parfait. Apprenons à mieux le connaître. Selon la documentation https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/, le moyen le plus simple de le faire est le suivant:
Créez un volume pour stocker les données:
# docker volume create portainer_data
Vous pouvez maintenant démarrer Portainer avec la commande suivante:
# 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
Après avoir démarré Portainer, il sera disponible sur http: // <ip serveur>: 9000 /
Lorsque vous démarrez Portainer pour la première fois, il vous demandera de spécifier le mot de passe administrateur, après quoi il vous demandera comment vous connecter au environnement:
J'ai sélectionné l'option de connexion à Docker local, après quoi l'écran d'accueil de Portainer est apparu:
Comme vous pouvez le voir, un point de terminaison local est disponible, plus tard, vous pouvez ajouter des connexions à d'autres nœuds si nécessaire.
Allons-y, et nous verrons un tableau de bord pratique avec des informations récapitulatives:
C'est là que nous pouvons gérer tous les aspects du fonctionnement de Docker. Voyons ce que nous avons dans nos conteneurs:
Jusqu'à présent, un conteneur est Portainer lui-même. L'interface est très pratique pour afficher et gérer les conteneurs, et il est également possible d'en ajouter de nouveaux. Vous pouvez parcourir les autres onglets et voir à quel point l'interface est pratique et réfléchie de Portainer.
L'onglet Piles est le plus intéressant. Une pile est un ensemble de conteneurs interconnectés qui s'exécutent et fonctionnent ensemble. En fait, c'est la même chose que Docker Compose, dont nous décrivons la configuration dans le fichier docker-compose.yml, puis exécutons avec la commande docker-compose up.
Portainer vous permet d'ajouter une pile au système de différentes manières, de l'édition avec l'éditeur intégré au téléchargement depuis github.
Le format docker-compose est utilisé pour définir la pile, ce qui fonctionne ici sous le capot. En utilisant cette fonction, il est plus pratique pour moi de créer l'infrastructure nécessaire à partir de conteneurs.
À ce stade, je propose de m'éloigner de l'étude des capacités du portier pour le moment. Je pense que vous avez déjà vu qu'il s'agit d'un outil sérieux, grâce auquel vous pouvez presque complètement abandonner l'utilisation du docker CLI. Maintenant, jetons un coup d'œil à ce que je veux obtenir en conséquence sur ce VPS.
J'ai périodiquement besoin de développer des projets «rapides». C'est ce que j'appelle des projets qui ne nécessitent pas d'étude approfondie. Il peut s'agir d'expériences, de petits sites, de bots, de collecteurs d'informations, etc. Tout ce qui ne nécessite pas la construction d'une chaîne CI / CD. Il serait extrêmement pratique pour moi de développer et de déboguer de telles applications là où elles fonctionneront. Aussi, j'ai assez souvent une situation où je suis loin de mon lieu de travail avec un environnement de développement configuré, et si quelque chose dans mes projets commence à mal fonctionner, j'aimerais être en mesure de comprendre rapidement la situation et de résoudre le problème. ou tout simplement travailler sur des projets pendant que vous disposez d'une minute gratuite depuis n'importe quel ordinateur, même s'il n'y a rien dessus sauf un navigateur et un accès Internet.
Pour faciliter l'accès, j'ai un nom de domaine acheté et je souhaite configurer des domaines de troisième niveau pour divers outils, de sorte que, par exemple, le portainer soit disponible sur portainer.example.com. Je veux aussi que tout fonctionne via https, et pour ne pas prendre la peine d'acheter des certificats SSL, utilisez Let's Encrypt. Une autre exigence est que tout ce qui n'est pas censé être accessible au public soit fermé par authentification.
Afin de mettre en œuvre tout cela, familiarisons-nous avec le formidable outil suivant. Il…
Traefik
Traefik est un serveur proxy inverse réglé pour la gestion des conteneurs. Les fonctionnalités suivantes sont importantes pour moi:
- mise à jour de la configuration à la volée
- prise en charge de docker en tant que fournisseur de configuration
- travailler avec Let's encrypt hors de la boîte
Pour exécuter traefik avec portainer, nous utiliserons l'exemple docker-compose.yml fourni dans la documentation 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
Pour que le processus d'obtention du certificat Let's encrypt aboutisse, vous devez vous assurer que les enregistrements DNS sont correctement configurés avant de commencer. J'utilise cloudflare à ces fins, et la configuration devrait ressembler à ceci:
La colonne "Contenu" doit contenir l'adresse de notre VPS.
Maintenant, si vous copiez le fichier docker-compose.yml résultant sur le serveur, exécutez la commande suivante:
# docker-compose up -d
Ensuite, après le lancement sur portainer.example.com, l' image suivante apparaîtra :
De plus, il sera déjà protégé par le certificat Let's Encrypt:
Traefik dispose d'un tableau de bord très pratique pour vous aider à comprendre si les paramètres de configuration ont été appliqués correctement. Pour l'activer, vous devez ajouter les lignes suivantes à 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»
Vous devez également ajouter le domaine de troisième niveau traefik.example.com dans les paramètres DNS. Cela peut être fait par analogie avec la façon dont le domaine pour portainer a été précédemment ajouté. Après avoir appliqué les paramètres sur traefik.example.com, nous verrons le tableau de bord:
Comme vous pouvez le voir, Traefik s'est avéré être un excellent outil. Il fonctionne en étroite collaboration avec docker et ses capacités de configuration dynamique vous permettent d'abandonner complètement l'utilisation de fichiers de configuration pour les paramètres de routage. Au lieu de cela, nous écrivons simplement tous les paramètres nécessaires sous forme d'étiquettes pour le service personnalisé, de sorte que tous les paramètres soient au même endroit.
Je propose maintenant de m'éloigner un peu de la configuration des services de base et d'ajouter un environnement de développement au système. Ce sera…
Serveur de code Visual Studio
Pour moi, l'environnement de développement ou IDE a toujours été quelque chose de si sérieux. Un progiciel puissant installé sur la machine d'un développeur occupe plusieurs gigaoctets d'espace disque et de RAM. Un exemple d'un tel IDE que j'utilise depuis de nombreuses années et que je crois toujours que c'est le meilleur choix si vous travaillez avec la pile technologique Microsoft est Microsoft VisualStudio. Quand j'ai commencé à apprendre Node.js, j'ai découvert VSCode, et malgré les noms associés, c'est un IDE complètement différent, avec un concept et des capacités complètement différents. Le fait que VSCode utilise le moteur Chrome pour afficher son interface permet à VSCode lui-même d'être espacé. Grâce à cette architecture, le Visual Studio Code Server est né, qui peut fonctionner sur un VPS, tandis que l'interface VSCode sera accessible via un navigateur. Et non, ce n'est pas un autre éditeur de code en ligne,c'est un IDE VSCode à part entière qui a toutes ses fonctionnalités.
Pour ajouter un serveur VSCode à mon VPS, je vais créer une nouvelle pile dans Portainer, l'appeler serveur de code et y ajouter la configuration suivante:
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»
Aussi, avant de commencer, n'oubliez pas d'ajouter le code de domaine de troisième niveau.example.com à vos enregistrements DNS. Il ne reste plus qu'à cliquer sur le bouton Déployer la pile.
Après la fin du processus, une nouvelle pile apparaîtra dans le portainer, et si nous allons sur code.example.com , nous verrons l'image suivante (j'ai immédiatement activé le thème sombre):
Ici, vous pouvez développer de la même manière que dans la version de bureau de VSCode. Dans l'ensemble, la seule différence que j'ai rencontrée est la différence dans la liaison par défaut de certains raccourcis clavier, mais vous vous y habituez rapidement lors du processus d'utilisation.
Pour plus de commodité, j'ai connecté le volume que j'ai monté au répertoire / app au conteneur du serveur de code, il est donc préférable de créer ou de cloner des projets à partir du référentiel, auquel cas les données ne seront pas perdues même lorsque le conteneur est re -créé.
Node.js est déjà installé sur cette image, je n'ai donc rien eu à faire et je peux commencer à travailler sur mes projets tout de suite. Si vous avez besoin d'autres YP dans votre travail, veuillez noter que les créateurs de cette image maintiennent un catalogue de mods qui vous permettent d'ajouter la prise en charge de diverses plates-formes. Vous pouvez lire comment les utiliser dans la description de l'image sur Docker Hub, et la liste des mods officiels peut être trouvée ici: mods.linuxserver.io/?mod=code-server
Veuillez également noter que le mot de passe sudo est spécifié dans le paramètres du conteneur ... Pour la démonstration, j'ai laissé les choses simples, mais en pratique il vaut mieux la rendre complexe, ou encore mieux utiliser la propriété SUDO_PASSWORD_HASH pour ne pas stocker le mot de passe en texte clair. Vous pouvez lire comment faire cela dans la description de l'image ici: hub.docker.com/r/linuxserver/code-server .
Comme vous l'avez probablement déjà remarqué, pour le moment, l'accès au serveur de code n'est en aucun cas protégé et maintenant quiconque visite code.example.com y aura accès. C'est une très mauvaise option, et bien que vous puissiez activer l'accès par mot de passe dans les paramètres d'image, j'aimerais avoir une seule connexion pour accéder à toutes les ressources situées sur le serveur. Pour ce faire, je vous propose de me familiariser avec l'outil suivant. Ce sera…
KeyCloak
KeyCloak est un outil moderne pour organiser l'accès aux systèmes distribués à l'aide de la technologie d'authentification unique. En fait, c'est le seul outil gratuit avec des fonctionnalités aussi puissantes que j'ai pu trouver. Si vous connaissez une alternative valable, assurez-vous de l'écrire dans les commentaires.
Pour l'ajouter à mon système, j'ai créé une nouvelle pile appelée auth in portainer et y ai ajouté la configuration suivante:
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»
Après avoir cliqué sur le bouton Déployer la pile, KeyCloak sera disponible sur auth.example.com . Si nous y allons, nous serons accueillis par la fenêtre d'accueil de KeyCloak:
Allons à la console d'administration:
Le nom d'utilisateur sera admin et le mot de passe initial est celui que nous avons défini dans la configuration de la pile de la variable d'environnement KEYCLOAK_PASSWORD. Après la connexion, nous accèderons au panneau d'administration de KeyCloak:
Des recommandations pour la configuration initiale de KeyCloak pour docker peuvent être trouvées dans la documentation officielle ici www.keycloak.org/getting-started/getting-started-docker .
En bref, vous devez créer un nouveau royaume personnalisé, y créer un utilisateur et ajouter un nouveau client.
Pour le client, vous devez définir le type d'accès: confidentiel et ajouter nos domaines aux URI de redirection valides, alors que ce sont "https://traefik.example.com/*" et " code.example.com *":
Après avoir installé Access Type: confidentiel, l'onglet Credentials apparaîtra, dans lequel vous pourrez récupérer le secret, il nous sera utile plus tard lors de la configuration.
Ceci conclut la configuration de KeyCloak pour le moment. Nous devons maintenant nous lier d'amitié avec Traefik. Permettez-moi de vous rappeler que nous voulons empêcher les utilisateurs non authentifiés d'accéder à code.example.com et traefik.example.com. À ces fins, traefik dispose d'un middleware ForwardAuth qui vous permet d'organiser l'autorisation via un service externe. Pour assurer son interaction KeyCloak, nous avons besoin d'un service intermédiaire, j'utiliserai github.com/thomseddon/traefik-forward-auth . Il est également disponible en tant qu'image sur Docker Hub, je vais donc simplement ajouter la configuration de la pile d'authentification du portainer avec ce service:
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
Ici, la variable PROVIDERS_OIDC_ISSUER_URL doit contenir le chemin d'accès au royaume que nous avons créé précédemment dans Keycloak, PROVIDERS_OIDC_CLIENT_ID doit contenir le nom du client que j'ai créé plus tôt dans ce domaine et PROVIDERS_OIDC_CLIENT_SECRET doit être extrait de l'onglet Credentials de ce client. Dans la variable SECRET, vous devez remplir une chaîne aléatoire.
Désormais, pour fermer le service, routage vers lequel Traefik fournit, il suffit d'ajouter la ligne suivante aux libellés:
- "traefik.http.routers.< >.middlewares=traefik-forward-auth"
Pour commencer, j'ai décidé de fermer le serveur de code avec authentification, pour lequel je suis entré dans sa pile et ai ajouté sa configuration. Le résultat est le suivant (par souci de concision, je ne cite que la section des étiquettes):
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»
Cliquez sur le bouton Mettre à jour la pile et essayez de visiter code.example.com. Si tout est fait correctement, la fenêtre de connexion apparaîtra:
Après avoir entré le nom d'utilisateur et le mot de passe corrects (que j'avais précédemment configurés dans KeyCloak), je suis entré dans l'interface du serveur de code. Tout fonctionne!
De même, j'ai fermé le tableau de bord traefik des regards indiscrets. Pour ce faire, j'ai dû aller sur la console (Portainer ne peut pas apporter de modifications à la configuration de la pile, qui n'a pas été créée par lui, mais j'ai soulevé Traefik depuis la console) et éditer de la même manière 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»
Pour vérifier, je suis allé sur traefik.example.com. Pour m'assurer que tout fonctionne comme il se doit, j'ai dû ouvrir une fenêtre de navigateur en mode incognito, sinon le système m'a reconnu et n'a pas demandé de mot de passe, puisque je m'étais précédemment connecté pour accéder au serveur de code et donc KeyCloak authentifié moi automatiquement.
Ainsi, en utilisant une combinaison de KeyCloak et Traefik, j'ai réussi à protéger les éléments sensibles de mon système contre les accès non autorisés. L'avantage de cette approche est qu'elle vous permet de le faire même en l'absence de mécanismes d'authentification propriétaires. Il y a, bien sûr, des inconvénients - KeyCloak est assez lourd, il prend beaucoup de ressources, principalement de la mémoire, et en termes de capacités, c'est une surpuissance évidente, je n'aurai probablement pas besoin de la plupart de ce qu'il peut faire. Alternativement, un service cloud peut être utilisé, par exemple traefik-forward-auth a une prise en charge intégrée de Google OAuth.
conclusions
Dans cet article, nous nous sommes familiarisés avec un ensemble d'outils dont l'utilisation conjointe peut grandement simplifier et automatiser un large éventail de tâches qui se posent aujourd'hui dans la pratique de nombreux informaticiens. Paramètres tels que:
- Connexion aux noms de domaine
- Configuration TLS
- Obtention et installation de certificats
- Authentification
se font en plusieurs lignes directement dans la configuration du service.
Bien sûr, lors de la configuration, j'ai dû faire beaucoup de choses depuis la console, mais à l'avenir, avec une utilisation quotidienne, le système intégré me permettra de réduire son utilisation, ce qui est sans aucun doute un plus pour moi.
Lorsque j'écrivais cet article, la principale difficulté était de rassembler toutes les informations nécessaires. Beaucoup de choses dans la documentation ne sont pas évidentes et souvent pour faire fonctionner le système selon les besoins, vous deviez chercher une solution au problème sur divers problèmes sur github et des questions de stackoverflow. Par conséquent, j'ai essayé de mettre en évidence un certain nombre de points plus en détail et j'espère que mes recherches aideront quelqu'un à mieux comprendre les produits décrits.
J'attends aussi sincèrement des critiques constructives dans les commentaires et des idées sur la façon de faire ce que j'ai essayé de mieux mettre en œuvre ici. Par exemple, j'aimerais vraiment trouver une alternative plus légère à KeyCloak, car elle est un peu lourde pour ce genre de tâche.
Pour plus de commodité, j'ai placé les fichiers de configuration dans le référentiel ici: https://github.com/debagger/vps-docker-workspace
Merci de votre attention!
Les serveurs cloud de Macleod sont rapides et sécurisés.
Inscrivez-vous en utilisant le lien ci-dessus ou en cliquant sur la bannière et bénéficiez d'une remise de 10% pour le premier mois de location d'un serveur de toute configuration!