Ich wollte schon immer persönlichen Platz im Web haben. Ein Ort, an dem alles so bequem für mich arrangiert würde. Ich sah die beste Lösung als kostengünstiges VPS, das ich nach meinen Bedürfnissen ausrüsten konnte. Lange Zeit konnte ich mich der Lösung dieses Problems nicht nähern, aber irgendwie kam unmerklich eine Reihe von Tools auf, mit denen ich genau die Softwareumgebung organisieren konnte, die ich wollte.
Wenn Sie auch Ihren eigenen persönlichen Bereich im Netzwerk erstellen möchten, aber nicht wissen, wo Sie anfangen sollen, oder einfach nur an so wunderbaren Softwareprodukten wie Docker, Portainer, Traefik interessiert sind - willkommen unter cat.
Einführung
Um ehrlich zu sein, mag ich die Kommandozeile nicht wirklich. Das heißt, ich mag die Idee einer leichten, minimalistischen, universellen Oberfläche, die fast keine Ressourcen benötigt, aber ein schwarzes Fenster mit einem blinkenden Cursor macht mich frustriert und hilflos. Und ich weiß sogar, woher ich es habe.
Als ich am Institut studierte (dies war die Zeit, als das Internet mit Karten und das erste Internetcafé gerade in meiner Stadt auftauchten), mein Freund, der es zu diesem Zeitpunkt geschafft hatte, einen Job als Laborassistent in der Abteilung von zu bekommen Informatik, aktiv versucht, mich an Linux zu binden. Und hier bin ich, ein fortgeschrittener Informatiker, der Erfahrung mit wahrscheinlich Hunderten von Windows-Installationen hat, nach dem Abschluss nach Hause komme und mit einer selbstbewussten Bewegung die Festplatte mit dem Linux-Distributionskit in das Laufwerk einlege ... Na und? Und nichts.
Viele Jahre lang erinnere ich mich nicht an alle Details, ich habe es wahrscheinlich sogar geschafft, sie zu ermitteln, aber dann gab es einen Fehler - ich habe einfach nicht verstanden, was ich tun soll. Die übliche Art und Weise, die in Windows funktioniert hat - das zufällige Stöbern in der Systemsteuerung mit verschiedenen Einstellungen, bis alles funktioniert (oder vollständig kaputt geht, aber dann war es möglich, Windows neu zu installieren und von vorne zu beginnen), hat hier nicht funktioniert. Alles, was ich hatte, war eine Konsole, die meine Versuche, Dinge immer wieder zu optimieren, zurückwies. Ich erinnere mich, dass ich sogar ein Buch über Linux hatte, das auch in keiner Weise half - die Befehle, die dort aus irgendeinem Grund gegeben wurden, funktionierten aus irgendeinem Grund nicht. Nachdem ich einige Tage gelitten hatte, entschied ich mich für mich selbst, dass Linux eine Art Unsinn ist, und kehrte mit Erleichterung zu meinem üblichen Windows zurück.
Es gab auch Versuche, Linux zu beherrschen, das Leben brachte mich immer wieder mit seinen Fans zusammen, die versuchten, mich in ihr Lager zu ziehen, ich versuchte sogar irgendwie, einen Gent zu setzen (erfolglos natürlich, obwohl ich einen Ausdruck mit einem hatte Schritt-für-Schritt-Anleitung), aber der Fluch der Konsole schwebte über mir, und mit jedem Fehler wurde das gleiche Gefühl der Hilflosigkeit stärker. Nach der grafischen Oberfläche von Windows, in der alle Einstellungen auf einen Blick vor Ihnen liegen und mit der Konsole kollidieren, fühlte ich mich blind und versuchte, mich durch Berühren an einem unbekannten Ort zurechtzufinden. Daher war ich sehr lange ein Unterstützer des Microsoft-Technologie-Stacks und programmierte in .net mit VisualStudio (es ist großartig und ohne Konsole). Bitte urteilen Sie nicht streng, vielleicht, wenn ich zu diesem Zeitpunkt die Gelegenheit hatte, Linux auf eine virtuelle Maschine zu setzen,Um ruhig damit umzugehen und ein anständiges Internet zur Hand zu haben, würde diese Geschichte eine ganz andere Wendung nehmen.
Jetzt hat sich alles geändert. Mit dem Aufkommen des Webs in seiner modernen Form in unserem Leben wechselte ich zu Node.js und begann wohl oder übel, von der Ideologie der Konsole und von Linux durchdrungen zu sein. Um meine Entwicklungen zu hosten, brauchte ich einen VPS, und es stellte sich heraus, dass VPS mit Windows viel teurer sind. Meine Kröte überwog meine Frustrationen bezüglich der Konsole, und das Vorhandensein von Hochgeschwindigkeitsinternet ermöglichte es, sofort Antworten auf neu auftretende Probleme zu finden Fragen.
Ich habe den Umgang mit ssh gelernt, die Leistungsfähigkeit von git erkannt und angefangen, Docker aktiv zu nutzen, aber ich verwende auch gerne eine grafische Oberfläche für meine Aufgaben. In diesem Artikel möchte ich Ihnen eine wunderbare Reihe von Tools vorstellen, die es mir ermöglichen Löse meine alltäglichen Aufgaben und beziehe mich nicht noch einmal auf die Konsole.
Vorbereitung
Ich habe einen VPS mit minimaler Konfiguration (vCPU: 1 Kern, RAM: 1 GB, NVMe: 20 GB) auf Macloud erstellt . Für die Installation auf einem VPS habe ich mich für die Debian 10-Distribution entschieden. Bei der Installation habe ich sofort einen SSH-Schlüssel über das Bedienfeld hinzugefügt, damit Sie die Konsole bequem über einen SSH-Client aufrufen können. Für weitere Experimente benötigen Sie Folgendes:
- Aktualisieren Sie das System
- Installieren Sie Docker und Docker-Compose
- Swap-Datei einschließen.
Sie können das Betriebssystem mit den folgenden Befehlen aktualisieren:
# apt update
# apt upgrade
, .
Befolgen Sie zum Installieren von Docker die offiziellen Anweisungen https://docs.docker.com/engine/install/debian/
Installieren Sie die erforderlichen Abhängigkeiten:
# apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
Fügen Sie den offiziellen Docker GPG-Schlüssel hinzu:
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Fügen Sie das Repository hinzu:
# 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
Nun bleibt die Paketliste zu aktualisieren:
# apt-get update
und Docker installieren:
# apt-get install docker-ce docker-ce-cli containerd.io
Sie können überprüfen, ob alles korrekt installiert ist, indem Sie den folgenden Befehl ausführen:
# docker run hello-world
Wenn eine Begrüßung erscheint, ist alles gut gegangen. Zum Zeitpunkt dieses Schreibens habe ich die folgende Version installiert:
# docker -v
Docker version 20.10.6, build 370c289
Jetzt müssen Sie Docker-Compose installieren. Dazu verwenden wir die offiziellen Anweisungen:
https://docs.docker.com/compose/install/
Zuerst benötigen wir einen Link zur neuesten Version von Docker-Compose. Die Liste der Releases finden Sie hier: https://github.com/docker/compose/releases
Zum Zeitpunkt dieses Schreibens war die neueste Version 1.29.2. Wir brauchen eine Linux-Version, also wählen wir eine Datei namens docker-compose-Linux-x86_64. Kopieren wir den Link dazu. Jetzt müssen Sie den folgenden Befehl in die Konsole eingeben (fügen Sie den oben erhaltenen Link an der richtigen Stelle ein):
# curl -L "< >" -o /usr/local/bin/docker-compose
In meinem Fall stellte sich heraus:
# curl -L «https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64» -o /usr/local/bin/docker-compose
Führen Sie den Befehl aus und laden Sie die Docker-Compose-Binärdatei herunter.
Der letzte Schritt besteht darin, die Ausführungsberechtigung dafür festzulegen. Dies kann mit dem folgenden Befehl erfolgen:
# chmod +x /usr/local/bin/docker-compose
Wenn alles gut gegangen ist, ist der Installationsprozess beendet. Jetzt können Sie die Version von Docker-Compose überprüfen. Ich habe es so verstanden:
# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
Der letzte Schritt besteht darin, die Auslagerungsdatei zu aktivieren, da sie aufgrund des geringen Arbeitsspeichers definitiv nicht überflüssig ist:
Erstellen Sie eine 4-GB-Datei
# fallocate -l 4G /swapfile
Weisen wir ihm die notwendigen Rechte zu:
# chmod 600 /swapfile
Initialisieren wir es als Auslagerungsdatei:
# mkswap /swapfile
Schließlich aktivieren wir:
# swapon /swapfile
Mit dem Befehl free können Sie überprüfen, ob die Auslagerungsdatei im System angezeigt wurde. Ich habe alles:
# free
total used free shared buff/cache available
Mem: 1010900 150500 143788 2892 716612 714916
Swap: 4194300 0 4194300
Es bleibt noch ein letzter Schritt: Damit die Auslagerungsdatei nach einem Neustart aktiv bleibt, fügen Sie der Datei / etc / fstab die folgende Zeile hinzu:
/swapfile swap swap defaults 0 0
Für solche Aufgaben verwende ich gerne den Midnight Commander-Dateimanager. Es ist ein Konsolendateimanager mit einer klassischen Oberfläche. Wenn Sie auf Norton Commander / FAR / TotalCommander gestoßen sind, werden Sie leicht verstehen, wie man es benutzt. Sie können es mit dem folgenden Befehl installieren:
# apt-get install mc
Und mit dem Befehl ausführen
# mc
Sehen wir uns ein schmerzlich vertrautes Bild an:
Jetzt finden wir die gewünschte Datei und bearbeiten sie:
Damit ist die Voreinstellung abgeschlossen, Sie können fortfahren.
Portainer
Das erste Tool, das ich Ihnen vorstellen möchte, ist Portainer. Portainer ist ein Containerverwaltungstool für Docker, Swarm, Kubernetes und Azure ACI. In der Dokumentation von Portainer heißt es:
"Durch die Verneinung der Notwendigkeit, dass Benutzer die Befehlszeilenschnittstelle verwenden, YAML schreiben oder Manifeste verstehen müssen, macht Portainer das Bereitstellen von Anwendungen und die Fehlerbehebung so einfach, dass jeder dies tun kann."
Für meine Zwecke ist Portainer einfach perfekt. Lass uns ihn besser kennenlernen. Gemäß der Dokumentation https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/ ist dies am einfachsten wie folgt:
Erstellen Sie ein Volume zum Speichern von Daten:
# docker volume create portainer_data
Jetzt können Sie Portainer mit dem folgenden Befehl starten:
# 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
Nach dem Starten von Portainer ist es unter http: // <Server-IP>: 9000 / verfügbar.
Wenn Sie Portainer zum ersten Mal starten, werden Sie aufgefordert, das Administratorkennwort anzugeben. Anschließend werden Sie gefragt, wie Sie eine Verbindung zum herstellen sollen Umgebung:
Ich habe die Option zum Herstellen einer Verbindung mit dem lokalen Docker ausgewählt. Danach wurde der Startbildschirm von Portainer angezeigt:
Wie Sie sehen, ist ein lokaler Endpunkt verfügbar. Später können Sie bei Bedarf Verbindungen zu anderen Knoten hinzufügen.
Lassen Sie uns darauf eingehen, und wir werden ein praktisches Dashboard mit zusammenfassenden Informationen sehen:
Hier können wir alle Aspekte der Funktionsweise von Docker verwalten. Mal sehen, was wir in unseren Containern haben:
Bisher ist ein Container Portainer selbst. Die Benutzeroberfläche ist sehr praktisch, um Container anzuzeigen und zu verwalten, und es besteht auch die Möglichkeit, neue hinzuzufügen. Sie können die restlichen Registerkarten durchgehen und sehen, wie bequem und durchdacht die Benutzeroberfläche von Portainer ist.
Von größtem Interesse ist die Registerkarte Stapel. Ein Stapel ist eine Sammlung miteinander verbundener Container, die ausgeführt werden und zusammenarbeiten. Dies ist in der Tat dasselbe wie Docker Compose, dessen Konfiguration wir in der Datei docker-compose.yml beschreiben und dann mit dem Befehl docker-compose up ausführen.
Mit Portainer können Sie dem System auf verschiedene Weise einen Stapel hinzufügen, von der Bearbeitung mit dem integrierten Editor bis zum Herunterladen von Github.
Das Docker-Compose-Format wird verwendet, um den Stapel zu definieren, was hier unter der Haube funktioniert. Mit dieser Funktion ist es für mich am bequemsten, die erforderliche Infrastruktur aus Containern aufzubauen.
An dieser Stelle schlage ich vor, vorerst von den Fähigkeiten des Portainers abzuweichen. Ich denke, Sie haben bereits gesehen, dass dies ein ernstes Tool ist, mit dem Sie die Verwendung der Docker-CLI fast vollständig aufgeben können. Lassen Sie uns nun einen kurzen Blick darauf werfen, was ich als Ergebnis auf diesem VPS erhalten möchte.
Ich muss regelmäßig "schnelle" Projekte entwickeln. Dies nenne ich Projekte, die kein gründliches Studium erfordern. Dies können Experimente, kleine Websites, Bots, Informationssammler usw. sein. Alles, was keine CI / CD-Kette erfordert. Es wäre äußerst praktisch für mich, solche Anwendungen genau dort zu entwickeln und zu debuggen, wo sie funktionieren. Außerdem habe ich häufig eine Situation, in der ich mit einer konfigurierten Entwicklungsumgebung nicht an meinem Arbeitsplatz bin und wenn etwas in meinen Projekten nicht mehr funktioniert, möchte ich in der Lage sein, die Situation schnell zu verstehen und das Problem zu beheben. oder arbeiten Sie einfach an Projekten, während Sie eine freie Minute von einem beliebigen Computer aus haben, auch wenn sich nur ein Browser und ein Internetzugang darauf befinden.
Um den Zugriff zu vereinfachen, habe ich einen gekauften Domainnamen und möchte Domains der dritten Ebene für verschiedene Tools konfigurieren, sodass der Portainer beispielsweise unter portainer.example.com verfügbar ist. Ich möchte auch, dass alles über https funktioniert. Um keine SSL-Zertifikate zu kaufen, verwenden Sie Let's Encrypt. Eine weitere Anforderung ist, dass alles, was nicht öffentlich zugänglich sein soll, durch Authentifizierung geschlossen wird.
Um all dies zu implementieren, machen wir uns mit dem folgenden großartigen Tool vertraut. Das…
Traefik
Traefik ist ein Reverse-Proxy-Server, der für die Containerhandhabung optimiert ist. Folgende Funktionen sind mir wichtig:
- On-the-Fly-Konfigurationsaktualisierung
- Docker-Unterstützung als Konfigurationsanbieter
- Arbeiten mit Lassen Sie uns sofort verschlüsseln
Um traefik mit portainer auszuführen, verwenden wir das Beispiel docker-compose.yml in der portainer-Dokumentation: 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
Damit das Erhalten des Let's-Verschlüsselungszertifikats erfolgreich ist, müssen Sie vor dem Start sicherstellen, dass die DNS-Einträge korrekt konfiguriert sind. Ich verwende Cloudflare für diese Zwecke, und darin sollte die Konfiguration ungefähr so aussehen:
Die Spalte "Inhalt" sollte die Adresse unseres VPS enthalten.
Wenn Sie nun die resultierende Datei docker-compose.yml auf den Server kopieren, führen Sie den folgenden Befehl aus:
# docker-compose up -d
Nach dem Start unter portainer.example.com wird das folgende Bild angezeigt :
Darüber hinaus wird es bereits durch das Let's Encrypt-Zertifikat geschützt:
Traefik verfügt über ein sehr praktisches Dashboard, mit dem Sie nachvollziehen können, ob die Konfigurationseinstellungen korrekt angewendet wurden. Um es zu aktivieren, müssen Sie docker-compose.yml die folgenden Zeilen hinzufügen:
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»
Sie müssen auch die Domain traefik.example.com der dritten Ebene in den DNS-Einstellungen hinzufügen. Dies kann analog dazu erfolgen, wie die Domain für Portainer zuvor hinzugefügt wurde. Nach dem Anwenden der Einstellungen auf traefik.example.com wird das Dashboard angezeigt :
Wie Sie sehen können, hat sich Traefik als großartiges Werkzeug erwiesen. Es arbeitet eng mit Docker zusammen und dank seiner dynamischen Konfigurationsfunktionen können Sie die Verwendung von Konfigurationsdateien für Routing-Einstellungen vollständig aufgeben. Stattdessen schreiben wir einfach alle erforderlichen Parameter als Beschriftungen für den benutzerdefinierten Dienst, sodass sich alle Einstellungen an einem Ort befinden.
Jetzt schlage ich vor, ein wenig vom Einrichten der Basisdienste abzuweichen und dem System eine Entwicklungsumgebung hinzuzufügen. Es wird sein…
Visual Studio Code Server
Für mich war die Entwicklungsumgebung oder IDE schon immer etwas so Ernstes. Ein leistungsstarkes Softwarepaket, das auf dem Computer eines Entwicklers installiert ist, belegt viele Gigabyte Speicherplatz und RAM. Ein Beispiel für eine solche IDE, die ich seit vielen Jahren verwende und immer noch der Meinung bin, dass dies die beste Wahl ist, wenn Sie mit dem Microsoft-Technologie-Stack arbeiten, ist Microsoft VisualStudio. Als ich anfing, Node.js zu lernen, entdeckte ich VSCode und trotz der zugehörigen Namen handelt es sich um eine völlig andere IDE mit einem völlig anderen Konzept und anderen Fähigkeiten. Die Tatsache, dass VSCode die Chrome-Engine verwendet, um seine Benutzeroberfläche anzuzeigen, ermöglicht es, dass VSCode selbst voneinander beabstandet ist. Dank dieser Architektur wurde der Visual Studio Code Server geboren, der auf einem VPS ausgeführt werden kann, während auf die VSCode-Oberfläche über einen Browser zugegriffen werden kann. Und nein, dies ist kein weiterer Online-Code-Editor.Es ist eine vollwertige VSCode-IDE mit all ihren großartigen Funktionen.
Um VSCode Server zu meinem VPS hinzuzufügen, erstelle ich einen neuen Stack in Portainer, nenne ihn Code-Server und füge dort die folgende Konfiguration hinzu:
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»
Vergessen Sie außerdem nicht, vor dem Start den Domaincode.example.com der dritten Ebene zu Ihren DNS-Einträgen hinzuzufügen. Jetzt müssen Sie nur noch auf die Schaltfläche Stapel bereitstellen klicken.
Nach dem Ende des Vorgangs wird im Portainer ein neuer Stapel angezeigt. Wenn wir zu code.example.com gehen, sehen wir das folgende Bild (ich habe das dunkle Thema sofort aktiviert ):
Hier können Sie auf die gleiche Weise wie in der Desktop-Version von VSCode entwickeln. Im Großen und Ganzen ist der einzige Unterschied, auf den ich gestoßen bin, der Unterschied in der Standardbindung einiger Tastaturkürzel, aber Sie gewöhnen sich bei der Verwendung schnell daran.
Der Einfachheit halber habe ich das Volume, das ich in das Verzeichnis / app gemountet habe, mit dem Code-Server-Container verbunden. Daher ist es am besten, dort Projekte aus dem Repository zu erstellen oder zu klonen. In diesem Fall gehen die Daten auch dann nicht verloren, wenn der Container neu erstellt wird -geschaffen.
In diesem Image ist Node.js bereits installiert, sodass ich nichts tun musste und sofort mit der Arbeit an meinen Projekten beginnen kann. Wenn Sie andere YPs in Ihrer Arbeit benötigen, beachten Sie bitte, dass die Ersteller dieses Bildes einen Katalog von Mods führen, mit denen Sie Unterstützung für verschiedene Plattformen hinzufügen können. Informationen zur Verwendung finden Sie in der Bildbeschreibung auf Docker Hub. Die Liste der offiziellen Mods finden Sie hier: mods.linuxserver.io/?mod=code-server
Bitte beachten Sie auch, dass das sudo-Passwort im angegeben ist Containereinstellungen ... Zur Demonstration habe ich es einfach gelassen, aber in der Praxis ist es besser, es komplex zu machen oder noch besser die Eigenschaft SUDO_PASSWORD_HASH zu verwenden, um das Passwort nicht im Klartext zu speichern. Wie das geht, lesen Sie in der Beschreibung des Bildes hier: hub.docker.com/r/linuxserver/code-server .
Wie Sie wahrscheinlich bereits bemerkt haben, ist der Zugriff auf den Code-Server derzeit in keiner Weise geschützt, und jetzt erhält jeder, der code.example.com besucht, Zugriff. Dies ist eine sehr schlechte Option, und obwohl Sie den Kennwortzugriff in den Bildeinstellungen aktivieren können, möchte ich ein einziges Login haben, um auf alle auf dem Server befindlichen Ressourcen zuzugreifen. Dazu schlage ich vor, sich mit dem folgenden Tool vertraut zu machen. Es wird sein…
KeyCloak
KeyCloak ist ein modernes Tool zum Organisieren des Zugriffs auf verteilte Systeme mithilfe der Single Sign-On-Technologie. Tatsächlich ist es das einzige kostenlose Tool mit solch leistungsstarken Funktionen, das ich finden konnte. Wenn Sie eine würdige Alternative kennen, schreiben Sie diese unbedingt in den Kommentaren.
Um es meinem System hinzuzufügen, habe ich einen neuen Stack namens auth in portainer erstellt und ihm die folgende Konfiguration hinzugefügt:
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»
Das Bereitstellen des Stapels Schalter gedrückt, wird KeyCloak Sie unter auth.example.com . Wenn wir dorthin gehen, werden wir vom KeyCloak-Begrüßungsfenster begrüßt:
Gehen wir zur Administratorkonsole:
Der Benutzername lautet admin, und das ursprüngliche Kennwort ist dasjenige, das wir in der Stapelkonfiguration der Umgebungsvariablen KEYCLOAK_PASSWORD festgelegt haben. Nach dem Login gelangen wir zum KeyCloak Admin Panel:
Empfehlungen für die Erstkonfiguration von KeyCloak für Docker finden Sie in der offiziellen Dokumentation hier www.keycloak.org/getting-started/getting-started-docker .
Kurz gesagt, Sie müssen ein neues benutzerdefiniertes Realm erstellen, einen Benutzer darin erstellen und einen neuen Client hinzufügen.
Für den Client müssen Sie den Zugriffstyp " vertraulich " festlegen und unsere Domänen zu den gültigen Umleitungs-URIs hinzufügen. Dabei handelt es sich um "https://traefik.example.com/*" und " code.example.com *":
Nach der Installation von Access Type: vertraulich wird die Registerkarte Anmeldeinformationen angezeigt, auf der Sie das Geheimnis abrufen können. Diese wird uns später beim Einrichten hilfreich sein.
Damit ist das KeyCloak-Setup vorerst abgeschlossen. Jetzt müssen wir uns mit Traefik anfreunden. Ich möchte Sie daran erinnern, dass wir verhindern möchten, dass nicht authentifizierte Benutzer auf code.example.com und traefik.example.com zugreifen. Zu diesem Zweck verfügt traefik über eine ForwardAuth-Middleware, mit der Sie die Autorisierung über einen externen Dienst organisieren können. Um die KeyCloak-Interaktion sicherzustellen, benötigen wir einen Zwischendienst. Ich werde github.com/thomseddon/traefik-forward-auth verwenden . Es ist auch als Image auf Docker Hub verfügbar, daher füge ich einfach die Auth-Stack-Konfiguration des Portainers mit diesem Service hinzu:
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
Hier sollte die Variable PROVIDERS_OIDC_ISSUER_URL den Pfad zu dem Bereich enthalten, den wir zuvor in Keycloak erstellt haben, PROVIDERS_OIDC_CLIENT_ID sollte den Namen des Clients enthalten, den ich zuvor in diesem Bereich erstellt habe, und PROVIDERS_OIDC_CLIENT_SECRET sollte von der Registerkarte Anmeldeinformationen dieses Clients übernommen werden. In der SECRET-Variablen müssen Sie eine zufällige Zeichenfolge eingeben.
Um den von Traefik bereitgestellten Dienst und das Routing zu schließen, reicht es aus, den Labels die folgende Zeile hinzuzufügen:
- "traefik.http.routers.< >.middlewares=traefik-forward-auth"
Zunächst habe ich beschlossen, den Codeserver mit einer Authentifizierung zu schließen, für die ich in seinen Stapel gegangen bin und seine Konfiguration hinzugefügt habe. Das Ergebnis ist das folgende (der Kürze halber zitiere ich nur den Abschnitt mit den Etiketten):
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»
Klicken Sie auf die Schaltfläche Stack aktualisieren und versuchen Sie, code.example.com zu besuchen. Wenn alles richtig gemacht wurde, erscheint das Anmeldefenster:
Nachdem ich den richtigen Benutzernamen und das richtige Passwort eingegeben hatte (die ich zuvor in KeyCloak konfiguriert hatte), kam ich zur Code-Server-Oberfläche. Alles arbeitet!
Ebenso schloss ich das Traefik-Armaturenbrett vor neugierigen Blicken. Dazu musste ich zur Konsole gehen (Portainer kann keine Änderungen an der Konfiguration des Stacks vornehmen, der nicht von ihm erstellt wurde, aber ich habe Traefik von der Konsole aus ausgelöst) und docker-compose.yml auf ähnliche Weise bearbeiten:
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»
Um dies zu überprüfen, ging ich zu traefik.example.com. Um sicherzustellen, dass alles so funktioniert, wie es sollte, musste ich ein Browserfenster im Inkognito-Modus öffnen, andernfalls erkannte mich das System und fragte nicht nach einem Passwort, da ich mich zuvor angemeldet hatte, um auf den Code-Server zuzugreifen, und daher KeyCloak authentifizierte mich automatisch.
Mit einer Kombination aus KeyCloak und Traefik gelang es mir, sensible Elemente meines Systems vor unbefugtem Zugriff zu schützen. Der Vorteil dieses Ansatzes besteht darin, dass Sie dies auch dann tun können, wenn keine proprietären Authentifizierungsmechanismen vorhanden sind. Es gibt natürlich Nachteile - KeyCloak ist ziemlich schwer, es beansprucht eine Menge Ressourcen, hauptsächlich Speicher, und in Bezug auf die Fähigkeiten ist dies ein offensichtlicher Overkill, höchstwahrscheinlich werde ich das meiste, was es kann, nicht brauchen. Alternativ könnte ein Cloud-Dienst verwendet werden, z. B. hat traefik-forward-auth eine integrierte Google OAuth-Unterstützung.
Schlussfolgerungen
In diesem Artikel haben wir eine Reihe von Tools kennengelernt, deren gemeinsame Verwendung eine Vielzahl von Aufgaben, die heute in der Praxis vieler IT-Spezialisten auftreten, erheblich vereinfachen und automatisieren kann. Einstellungen wie:
- Domain Name Verbindung
- TLS-Konfiguration
- Erhalten und Installieren von Zertifikaten
- Authentifizierung
werden in mehreren Zeilen direkt in der Servicekonfiguration ausgeführt.
Natürlich musste ich beim Einrichten viel von der Konsole aus tun, aber in Zukunft kann ich mit dem eingebauten System im täglichen Gebrauch den Verbrauch reduzieren, was zweifellos ein Plus für mich ist.
Als ich diesen Artikel schrieb, bestand die Hauptschwierigkeit darin, alle notwendigen Informationen zusammen zu sammeln. Viele Dinge aus der Dokumentation sind nicht offensichtlich und oft mussten Sie nach einer Lösung für das Problem bei verschiedenen Github-Problemen und Fragen aus dem Stackoverflow suchen, damit das System nach Bedarf funktioniert. Aus diesem Grund habe ich versucht, einige Punkte genauer hervorzuheben, und ich hoffe, dass meine Forschung jemandem hilft, die beschriebenen Produkte besser zu verstehen.
Ich freue mich auch aufrichtig auf konstruktive Kritik in den Kommentaren und auf Ideen, wie ich das, was ich hier zu implementieren versucht habe, besser umsetzen kann. Zum Beispiel würde ich wirklich gerne eine leichtere Alternative zu KeyCloak finden, weil es für diese Art von Aufgabe etwas schwer ist.
Der Einfachheit halber habe ich die Konfigurationsdateien hier im Repository abgelegt: https://github.com/debagger/vps-docker-workspace
Vielen Dank für Ihre Aufmerksamkeit!
Cloud-Server von Macleod sind schnell und sicher.
Registrieren Sie sich über den obigen Link oder indem Sie auf das Banner klicken und erhalten Sie 10% Rabatt für den ersten Monat der Anmietung eines Servers einer beliebigen Konfiguration!