Basics: Reverse Proxy- & Containereinrichtung für ein eCommerce Business

Einleitung

Der Einstieg in eine technische Reise kann einschüchternd sein, besonders angesichts der unterschiedlichen Fähigkeitsniveaus und Hintergründe, die jeder von uns mitbringt. Als jemand, der seit über einem Jahrzehnt tief in die Welt des E-Commerce eingetaucht ist, verstehe ich die Notwendigkeit, eine solide Grundlage zu schaffen, damit alle mitkommen können, wenn wir in zukünftigen Inhalten tiefer eintauchen. Daher ist dieser Blogbeitrag für uns alle: egal, ob Du gerade erst anfängst oder schon seit Jahren mit Servern herumbasteln. Lassen uns gemeinsam die Hände schmutzig machen und einen VPS-Server mit allem Drum und Dran einrichten, der unser E-Commerce-Geschäft auf das nächste Level technischer Autonomie bringen wird.

🧙 Dieser Artikel ist KI-übersetzt
🚀 Auch wenn Deutsch meine Muttersprache ist, habe ich Englisch in diesem Blog und auch auf anderen Plattformen den Vorzug. Mein Ziel ist es mein Wissen mit so vielen Menschen wie möglich zu teilen, da komme ich mit der englischen Sprache einfach weiter. Die deutsche Version wurde daher mit Hilfe von KI übersetzt 😉 🤖, wenn Du Fehler findest, darfst Du sie gerne behalten.

Fangen wir an

DNS und Subdomains: Unser Ausgangspunkt

Unsere digitale Reise beginnt mit dem Domain Name System (DNS) – einem Internetdienst, der Domainnamen in IP-Adressen übersetzt. Wir werden eine Subdomain einrichten; in meinem eigenen Anwendungsfall soll dies ca.m3tam3re.com sein, um als dediziertes Portal zur Verwaltung von Containern und Diensten zu dienen.

Der Einrichtungsprozess ist ziemlich einfach:

  1. Melde Dich bei Deinem Domain-Registrar an und navigiere zu den DNS-Einstellungen Deiner Domain.
  2. Füge einen neuen ‘A’-Eintrag hinzu, gib die gewünschte Subdomain (z.B. ‘ca’) ein und weise ihr die öffentliche IP-Adresse Deines Servers zu.
  3. Lege eine angemessene TTL fest
So sieht es bei GoDaddy aus

Obwohl jeder Domain-Registrar seine eigenen Besonderheiten hat, ist der übergeordnete Prozess derselbe: Anmelden, DNS-Einstellungen finden und einen A-Eintrag für Deine gewünschte Subdomain erstellen, der auf die IP Deines Servers zeigt. Pro-Tipp: Ein TTL-Wert von 600 Sekunden bietet uns eine gute Mischung aus schnellen Updates und Verbreitung im Internet.

Ubuntu und SSH-Schlüssel: Unsere Festung absichern

Wenn es darum geht, ein Betriebssystem für unseren Server zu wählen, ist Ubuntu eine solide Wahl. Die Installation besteht in der Regel aus ein paar Klicks auf den meisten Cloud-Plattformen. Noch wichtiger ist es jedoch, unseren Server sicher zu halten, und das bedeutet, SSH-Schlüssel anstelle von Passwörtern zu verwenden. Sie sind wie der VIP-Pass zu unserem Server – kein Schlüssel, kein Zutritt.

Hier ist die Kurzanleitung zur sicheren Einrichtung:

1. SSH-Schlüsselpaar erstellen

1
ssh-keygen -t ed25519

Hinweis: Während des Schlüsselerstellungsprozesses wirst Du aufgefordert, eine Datei einzugeben, in der der Schlüssel gespeichert werden soll (`Enter file in which to save the key (your_home_path.ssh/id_ed25519):`). Du kannst hier einen benutzerdefinierten Pfad angeben oder einfach Enter drücken, um den Standardort und Dateinamen zu akzeptieren.

Deine Schlüssel werden typischerweise in Deinem Benutzerverzeichnis gespeichert, genau in `~/.ssh/`. Wenn Du einen Dateinamen angibst, wie z.B. `cloud-demo`, wird der private Schlüssel als `~/.ssh/cloud-demo` und der öffentliche Schlüssel als `~/.ssh/cloud-demo.pub` erstellt.

Nachdem Du Dein SSH-Schlüsselpaar erstellt hast, ist es erwähnenswert, dass die meisten Cloud-Anbieter eine praktische Funktion bieten. Sie ermöglichen es Dir, Deinen öffentlichen SSH-Schlüssel bereits zum Zeitpunkt der Einrichtung Deines neuen Servers hinzuzufügen. Dies ist unglaublich praktisch, da es Ihnen die zusätzlichen Schritte des manuellen Übertragens und Konfigurierens des Schlüssels erspart, nachdem der Server bereits läuft.

Wenn Dein Cloud-Anbieter dies unterstützt und Du Deinen öffentlichen Schlüssel (nicht den privaten Schlüssel!) bereitgestellt hast, kannst Du einen neuen Eintrag in Deiner ~/.ssh/config Datei erstellen:

1
2
3
4
5
# ~/.ssh/config
Host cloud-demo
HostName 65.21.180.91
User root
IdentityFile ~/.ssh/cloud-demo

Dies ermöglicht es Dir grundsätzlich, Dich per SSH in Deinen VPS einzuloggen, indem Du nur eingibst:

1
ssh cloud-demo

Ohne die Definition von cloud-demo in der Konfigurationsdatei würde Dein Login-Befehl so aussehen:

1
ssh -i ~/.ssh/cloud-demo root@65.21.180.91

Wenn Du Deinen öffentlichen Schlüssel nicht an Deinen Cloud-Anbieter übermittelt hast oder dies nicht unterstützt wird, würde Dein Login-Befehl in etwa so aussehen und Du wirst nach dem Root-Passwort gefragt:

1
ssh root@65.21.180.91

2. Benutzereinrichtung auf dem entfernten Server

Das erste, was ich tue, ist, einen neuen Benutzer mit meinem eigenen Benutzernamen m3tam3re zu erstellen.

1
adduser m3tam3re

Nun werde ich den neuen Benutzer zur sudo-Gruppe hinzufügen, die es meinem glänzenden neuen Benutzer ermöglicht, Befehle als Superuser auszuführen. Eigentlich werde ich nach der ursprünglichen Einrichtung des Servers den root-Benutzer wahrscheinlich nie wieder verwenden. Also füge ich unseren Benutzer zur sudo-Gruppe hinzu:

1
usermod -aG sudo m3tam3re

Nun werde ich mit dem folgenden Befehl zu meinem neuen Benutzer wechseln:

1
su m3tam3re

Nun werde ich einen .ssh-Ordner erstellen und sichere Berechtigungen einrichten:

1
2
mkdir .ssh
chmod 700 ~/.ssh

Nachdem dies erledigt ist, werde ich exit eingeben, um von meinem neuen Benutzer zurück zu root zu wechseln, und exit erneut eingeben, um meine SSH-Verbindung zu schließen.

Zurück auf meinem lokalen Rechner werde ich meinen öffentlichen Schlüssel auf meine entfernte Maschine kopieren:

1
scp ~/.ssh/cloud-demo.pub m3tam3re@65.21.180.91:/home/m3tam3re

Nun logge ich mich mit SSH wieder in meinen entfernten Server ein:

1
ssh m3tam3re@65.21.180.91

Ich möchte mich später mit meinem privaten Schlüssel einloggen können. Der SSH-Server sucht nach einer Datei namens authorized_keys in meinem .ssh-Ordner. Mit dem folgenden Befehl kann ich den Inhalt meiner öffentlichen Schlüsseldatei zu ~/.ssh/authorized_keys: hinzufügen:

1
cat ~/cloud-demo.pub >> ~/.ssh/authorized_keys

Nun kann ich die Schlüsseldatei löschen:

1
rm ./cloud-demo.pub
🧙 ssh-copyid

🚀 Unter Linux kannst Du den gesamten Prozess des Kopierens des öffentlichen Schlüssels auf den entfernten Server usw. mit nur einem Befehl durchführen:

ssh-copyid -i ~/.ssh/cloud-demo.pub m3tam3re@65.21.180.91.

Das Gleiche gilt für MacOS, aber da viele Benutzer ein Windows-System haben könnten, wollte ich sicherstellen, dass dies auch unter Windows reproduziert werden kann.

3. SSH sicherer machen

Ich möchte sicherstellen, dass mein glänzender neuer Server sicher ist. Also nehme ich einige kleine Änderungen an der SSH-Serverkonfiguration vor. Ich möchte 3 Dinge erreichen:

  1. Der Login auf den Server sollte nur mit einem Schlüsselpaar möglich sein
  2. Der Login mit Passwörtern sollte nicht möglich sein
  3. Dem Root-Benutzer sollte es nicht erlaubt sein, sich über SSH einzuloggen
1
sudo nano /etc/ssh/sshd_config

Es gibt 3 Zeilen in dieser Datei, die am Ende so aussehen müssen:

1
2
3
PermitRootLogin no
PasswordAuthentication no
UsePAM no

Nun muss ich SSH neu starten, um die Änderungen anzuwenden:

1
sudo systemctl restart ssh

Da Fehler passieren können, werde ich zuerst von einem anderen Terminal aus meine Einstellungen überprüfen. Also logge Dich noch nicht aus!

In einem neuen Terminalfenster auf meinem lokalen Rechner werde ich einige Tests durchführen, die meine neuen Einstellungen überprüfen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Test auf Root-Zugang / dies sollte fehlschlagen
ssh root@65.21.180.91

# Test auf Root-Zugang mit Schlüssel/ dies sollte auch fehlschlagen
ssh -i ~/.ssh/cloud-demo root@65.21.180.91

# Test auf Benutzerzugang / dies sollte fehlschlagen
ssh m3tam3re@65.21.180.91

# Test auf Benutzerzugang mit Schlüssel/ dies sollte funktionieren
ssh -i ~/.ssh/cloud-demo m3tam3re@65.21.180.91

Da all dies die erwarteten Ergebnisse liefert, kann ich zu meiner immer noch geöffneten entfernten SSH-Sitzung zurückkehren und mich mit exit ausloggen.

Erinnerst Du Dich an die Sache mit der SSH-Konfigurationsdatei zu Beginn. Hier kann ich den Root-Benutzer einfach durch meinen Benutzernamen ersetzen:

1
2
3
4
5
# ~/.ssh/config
Host cloud-demo
HostName 65.21.180.91
User m3tam3re
IdentityFile ~/.ssh/cloud-demo

Und jetzt kann ich mich so einloggen:

1
ssh cloud-demo

4. Die Firewall aktivieren

Die Bedeutung einer Firewall verstehen

Eine Server-Firewall ist Dein digitaler Sicherheitswächter; sie entscheidet, welcher Datenverkehr in und aus Deinem System gelassen wird. Hier sind die Gründe, warum das entscheidend ist:

  • Zugriffskontrolle: Sie verhindert den Zugriff von unbefugten Benutzern und schädlichen Daten auf Deinen Server.
  • Angreifer abwehren: Sie hilft dabei, Cyber-Bedrohungen wie Eindringlingsversuche und Denial-of-Service-Angriffe zu verhindern.
  • Privatsphäre wahren: Eine Firewall schränkt die Exposition Deiner Daten gegenüber potenziellen Angreifern ein.
  • Individuelle Regeln: Du kannst festlegen, was erlaubt ist, und so die Sicherheit an das Profil Deines Servers anpassen.
  • Verkehr überwachen: Sie ermöglicht es Dir, Protokolle über ein- und ausgehenden Verkehr für Sicherheitsüberprüfungen zu führen.

Kurz gesagt, eine Firewall ist ein wesentliches Werkzeug, um Deinen Server gegen eine Vielzahl von Online-Sicherheitsrisiken zu schützen.

Jetzt gehen wir zur Einrichtung der Firewall, um Deinem Server diese entscheidende Schutzebene zu geben.

Zuerst werde ich Verbindungen für alle drei freigeben:

1
2
3
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

Nun kann ich die Firewall aktivieren und den Status überprüfen.

1
2
sudo ufw enable
sudo ufw status

Gut gemacht: Der Server sollte jetzt sicher sein 🚀

Caddy installieren

Bevor wir uns der Installation zuwenden, sollten wir kurz erläutern, was Caddy ist. Caddy ist ein Open-Source-Webserver, der automatisiert sicheren Webverkehr mit eingebautem HTTPS ermöglicht. Er ist benutzerfreundlich, verwaltet automatisch SSL-Zertifikate und dient als robuste Plattform für Webhosting und Reverse-Proxy-Konfigurationen. Mit seiner Einfachheit und Sicherheitsfunktionen hebt sich Caddy als bevorzugte Wahl für Entwickler und Systemadministratoren ab, die einen zuverlässigen, wartungsarmen Webserver suchen.

Die Installation von Caddy ist nicht sehr umfangreich. Dies ist einfach eine Kopie der offiziellen Caddy-Dokumentation. Ich habe sie hier eingefügt, um Ihnen den Weg zur Caddy-Website und das Kopieren von dort zu ersparen:

1
2
3
4
5
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt -y install caddy

Diese Befehle fügen Deinem Ubuntu-Installationsprogramm Paketquellen von Caddy hinzu, überprüfen die Quelle mit einem GPG-Schlüssel und installieren das Caddy-Paket.

Nun müssen wir die Caddy-Konfiguration mit der Caddyfile bearbeiten. Diese Datei befindet sich unter /etc/caddy/Caddyfile und benötigt Root-Zugriff zum Bearbeiten. Wir werden nano zum Bearbeiten verwenden, da dies für die meisten Menschen einfacher ist (Entschuldigung Vim, ich liebe dich immer noch)

1
sudo nano /etc/caddy/Caddyfile

Nun geben wir folgendes in die Datei ein:

1
2
3
ca.m3tam3re.com {
    reverse_proxy localhost:9000
}
1
sudo systemctl restart caddy

Docker: Unser Software-Container-Maestro

Docker ermöglicht es uns im Grunde, unsere Webdienste in ordentliche kleine Pakete zu verpacken, die wir leicht bewegen und duplizieren können. Es ist eine mühelose Skalierung und Bereitstellung, was in unserem Geschäft so ziemlich Gold wert ist.

1
2
sudo apt-get update
sudo apt-get -y install docker docker-compose

Bevor wir mit der Einrichtung von Portainer fortfahren, nehmen wir uns einen Moment Zeit, um die Technologien zu verstehen, mit denen wir arbeiten. Docker und Docker Compose sind Tools, die den Prozess der Bereitstellung und Verwaltung von Anwendungen erheblich vereinfachen.

Docker ist eine Container-Plattform, die eine Anwendung und ihre Abhängigkeiten in einen Container verpackt und dadurch Konsistenz über verschiedene Rechenumgebungen hinweg garantiert. Denke an eine Möglichkeit, Deine Anwendung zu “kontainern”, indem Du sie vom System, auf dem sie läuft, isolierst.

Docker Compose ist ein Werkzeug zum Definieren und Ausführen von Multi-Container-Docker-Anwendungen. Mit einer einfachen YAML-Datei skizzierst Du die Komponenten, die für den Betrieb Deiner Anwendung notwendig sind, und mit ein paar Befehlen bringst Du die gesamte Umgebung zum Leben.

Zusammen erleichtern Docker und Docker Compose den Prozess der Bereitstellung und Verwaltung von Anwendungen und ermöglichen es Entwicklern, sich mehr auf den Bau ihrer Software zu konzentrieren, anstatt sich um die zugrundeliegende Infrastruktur zu sorgen.

Portainer: Ein Auge auf unsere Container halten

Portainer ist der Wingman von Docker und bietet uns eine elegante Schnittstelle zur Verwaltung all dieser Container. Es ist, als hätten wir ein zentrales Dashboard, auf dem wir uns durch Aufgaben klicken können, die normalerweise ein Mundvoll Befehle wären.

Zuerst erstellen wir ein Volume für Portainer, das ist notwendig, damit die Daten zwischen Containerneustarts erhalten bleiben.

1
sudo docker volume create portainer_data

Nun kann ich den Portainer-Container mit dem folgenden Befehl starten:

1
sudo 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:latest
So sieht es bei Portainer aus

Nun sollten wir, indem wir ca.m3tam3re.com aufrufen, auf den Login-Bildschirm von Portainer stoßen, wo wir ein Login mit einem sicheren Passwort erstellen.

Warnungen und Vorsichtsmaßnahmen: Umgang mit potenziellen Fallstricken

Obwohl das Einrichten Deines VPS und das Konfigurieren von Diensten ein lohnender Prozess sein kann, gibt es einige häufige Fallstricke, deren man sich bewusst sein sollte, um eine reibungslose Einrichtung zu gewährleisten. Hier sind einige mögliche Probleme und Tipps, wie Du sie vermeiden kannst:

Sicherheit geht vor

  • Verwende niemals Standardpasswörter: Ändere Standardpasswörter sofort nach der Installation neuer Software oder Dienste auf Deinem Server. Standardpasswörter sind ein erhebliches Sicherheitsrisiko.
  • Sei vorsichtig mit Root-Zugriff: Fehler mit Root-Berechtigungen können katastrophale Folgen haben. Überprüfe daher immer doppelt, bevor Du Befehle als Root ausführst.

SSH-Schlüsselkonfiguration

  • Verwechse nicht private mit öffentlichen Schlüsseln: Wenn Du Deinen SSH-Schlüssel auf einem Server oder einem Cloud-Anbieter-Panel hinzufügst, stelle sicher, dass Du Deinen öffentlichen Schlüssel (typischerweise `~/.ssh/your_key_name.pub`) bereitstellst und nicht Deinen privaten Schlüssel. Die Preisgabe Deines privaten Schlüssels kommt der Herausgabe der Schlüssel zu Deinem Königreich gleich.
  • Dateiberechtigungen sind entscheidend: Die SSH-Schlüsseldateien sollten strengste Berechtigungen gesetzt haben, und Dein `.ssh`-Verzeichnis sollte auf `700` gesetzt werden. Dein privater Schlüssel sollte `600` und der öffentliche Schlüssel `644` sein.

DNS-Einstellungen

  • Verbreitungszeit: Nach Anpassen Deiner DNS-Einstellungen beachte, dass Änderungen nicht sofort wirksam werden. Die DNS-Verbreitung kann von wenigen Minuten bis zu 48 Stunden dauern. Vermeide es, in dieser Zeit weitere Änderungen vorzunehmen, da dies zu Verwirrungen und verlängerten Verzögerungen führen kann.

Firewall-Konfiguration

  • Überprüfe, bevor Du die Firewall aktivierst: Stelle immer sicher, dass der SSH-Port (`22` standardmäßig) durch die Firewall zugelassen ist, bevor Du sie aktivierst. Wenn Du das vergisst, kannst Du Dich von Deinem Server ausschließen.
  • Minimale Anzahl offener Ports: Öffne nur die Ports, die für den Betrieb notwendig sind. Jeder offene Port ist ein potenzieller Zugangspunkt für Angreifer.

Docker und Container

  • Daten dauerhaft speichern: Wenn Du Docker-Container verwendest, denke daran, dass das Dateisystem des Containers standardmäßig flüchtig ist. Für alle Daten, die Du dauerhaft speichern möchtest, stelle sicher, dass Du Volumes verwendest.

Updates und Wartung

  • Bleiben aktuell: Aktualisiere regelmäßig die Software Deines Servers. Veraltete Anwendungen können Sicherheitslücken aufweisen, die ausgenutzt werden können.
  • Backups: Machen vor wichtigen Änderungen an Deinem Server ein Backup Deiner Daten. Sollte etwas schiefgehen, wirst Du erleichtert sein, einen Wiederherstellungspunkt zu haben.

Gehe langsam durch jeden Konfigurationsschritt, verstehe die Befehle, die Du ausführst, und überprüfe die Konfigurationen doppelt, bevor Du Dienste oder den Server selbst neu startest. Ein kleiner Tippfehler könnte dazu führen, dass ein Dienst nicht startet oder schlimmer noch, zu einem Serverproblem führt. Wenn Du Dir unsicher bist, konsultiere die Dokumentation oder suche Rat bei einem sachkundigen Kollegen oder der Technik-Community.

Schlussfolgerung

Um ehrlich zu sein, finde ich immer noch heraus, wie ich die Dinge handhaben möchte. Einerseits ist es gut zu zeigen, wie ich Dinge in meinem eigenen E-Commerce-Geschäft tatsächlich handhabe, andererseits möchte ich den meisten Menschen helfen, Technologien zu erlernen, die die Automatisierung eines E-Commerce-Geschäfts unterstützen. Fürs Erste habe ich mich entschieden, die Dinge einfach zu halten und meine Inhalte so zu gestalten, dass sie hoffentlich leicht zu folgen sind. Die Dinge werden auf dem Weg ohnehin komplizierter.

Die Empfehlung von Ubuntu, Docker und Portainer ist eine vernünftige Wahl. Die Lösungen sind weit verbreitet und es ist einfach, zusätzliche Hilfe, Tutorials usw. im Internet zu finden, falls jemand stecken bleibt oder ein Problem hat.

0%