Root-Server Tutorial

ROOT-SERVER TUTORIAL

Einrichten des Caddy Servers - Der einfachste Weg zu einer sicheren HTTPS-Verbindung

Caddy ist ein Webserver, der einfach zu bedienen und zu konfigurieren ist. Caddy nutzt sogar automatisch Let's Encrypt-Zertifikate ohne zusätzliche Konfiguration oder Programme!

Einführung

In diesem Tutorial zeige ich dir, wie du den Caddy-Webserver installierst und grundlegend konfigurierst. Außerdem erkläre ich dir, wie du statische Dateien mit Caddy bereitstellst und wie du einen Reverse Proxy einrichtest, um beispielsweise Dienste, die in Docker ausgeführt werden, über HTTPS im Internet verfügbar zu machen.

Caddy ist aufgrund seines Konfigurationsdateiformats einfach zu verwenden und zu konfigurieren. Eine einfache Konfigurationsdatei für einen Reverse Proxy mit automatischem HTTPS könnte so aussehen:

my-cool-domain.de {

   reverse_proxy localhost:8080

}

Wir werden später im Detail auf die Caddy-Serverkonfiguration eingehen.

Eine äquivalente Konfiguration für einen Nginx-Server könnte so aussehen (und erfordert zusätzliche Tools wie Certbot):
server {
    listen 80;
    server_name my-cool-domain.de www.my-cool-domain.de;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /.well-known/acme-challenge {
        allow all;
    }

    location = /.well-known/acme-challenge/ {
        return 404;
    }

    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/my-cool-domain.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my-cool-domain.de/privkey.pem;
}

Eine äquivalente Konfiguration für einen Apache2-Server könnte so aussehen (auch hier bräuchte man zusätzlich z.B. Certbot):
<VirtualHost *:80>
    ServerName my-cool-domain.de
    ServerAlias www.my-cool-domain.de

    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/

    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/

</VirtualHost>


Im Vergleich dazu ist die Caddy-Konfiguration viel einfacher und verständlicher. Zudem kümmert sich Caddy auch um das Let's Encrypt-Zertifikat ohne jegliche zusätzliche Konfiguration!

Also los geht's mit der Einrichtung von Caddy auf deinem eigenen Server!

Anforderungen

Für die Anleitungen in diesem Tutorial benötigst du Folgendes:

  • Einen Server (z. B. VPS), auf dem eine aktuelle Version von Ubuntu läuft, mit Zugriff über SSH
    • Der Server benötigt eine öffentliche IPv4- oder IPv6-Adresse. netcup VPS / RS-Server verfügen immer über IPv4- und IPv6-Adressen.
    • Die Anleitung könnte auch auf anderen Linux-Distributionen nutzbar sein, insbesondere der Teil über das Caddyfile.
    • Getestet wurde die Anleitung mit Ubuntu 22.04.
  • Einen Domainnamen oder eine Subdomain, bei der du die DNS-Einstellungen bearbeiten kannst
  • Optional: Wenn du einen Reverse Proxy mit Caddy erstellen möchtest, benötigst du einen Dienst, der auf deinem Server läuft und den du nach außen freigeben möchtest. Das kann z.B. ein Docker Container sein.

In dieser Anleitung verwenden wir die Domain "my-cool-domain.de" als Beispiel. Gegebenenfalls solltest du diese durch deine eigene Domain / Subdomain ersetzen, z.B. in den Konfigurationsbeispielen.

Schritt 1 - Einrichten der DNS-Einträge

Um deine Domain mit deinem Server verwenden zu können, musst du die DNS-Einträge so einrichten, dass sie auf die öffentliche IPv4- und/oder IPv6-Adresse deines Servers "zeigen". Wenn Einträge für IPv4 und IPv6 vorhanden sind, sucht sich der Client aus, ob er eine Verbindung über IPv4 oder IPv6 herstellt.

Schritt 1.1 - Abrufen der IP-Adressen deines Servers

Zuerst müssen wir die öffentlichen IPv4- und IPv6-Adressen deines Servers herausfinden. Das kannst du mit dem folgenden Befehl tun:

echo -n -e "\n\nIPv4-Adresse:  " && curl -4 ifconfig.co
echo -n -e "\nIPv6-Adresse:  " && curl -6 ifconfig.co

Notiere dir die IPv4- und IPv6-Adresse deines Servers. Die brauchen wir im nächsten Schritt.

Wenn du eine Meldung in der Art von "IPv6-Adresse: curl: (7) Couldn't connect to server" siehst, hat dein Server möglicherweise keine IPv6-Adresse. In diesem Fall kannst du nur die IPv4-Adresse verwenden, das funktioniert auch.

Schritt 1.2 - Einrichten der DNS-Einträge

Die DNS-Einträge können von deinem DNS-Anbieter geändert werden. Wenn du die Standard-Einstellungen nicht geändert hast, handelt es sich höchstwahrscheinlich um den Ort, an dem du deine Domain gekauft hast. Wenn du deine Domain bei netcup gekauft hast, kannst du die DNS-Einträge im Kundenkontrollpanel ändern. Dort musst du Domains > my-cool-domain.de > DNS aufrufen.

Füge dann die folgenden Einträge zu den anderen DNS-Einträgen hinzu:

TypHostWert
A@IPv4-Adresse deines Servers
AAAA@IPv6-Adresse deines Servers

Wenn dir entweder IPv4 oder IPv6 fehlt, kannst du den entsprechenden Eintrag weglassen.

Schritt 1.3 - Überprüfen der DNS-Einträge

Prinzipiell kann es bis zu 24 Stunden dauern, bis die DNS-Einträge aktualisiert sind. Normalerweise dauert es jedoch nur wenige Minuten. Du kannst überprüfen, ob die DNS-Einträge erfolgreich aktualisiert wurden, indem du den folgenden Befehl verwendest:

dig +short my-cool-domain.de

Wenn die IPv4- und/oder IPv6-Adressen deines Servers ausgegeben werden, sind die DNS-Einträge aktualisiert, und du kannst mit dem nächsten Schritt fortfahren.

Schritt 2 - Installation von Caddy

Schritt 2.1 - Hinzufügen des Caddy-Repositorys

Da Caddy nicht in den Standard Ubuntu-Repositorys verfügbar ist, müssen wir zuerst das Caddy-Repository hinzufügen. Dafür sind die folgenden Schritte nötig:

  • Lade den Signaturschlüssel des Repositorys herunter und installiere ihn, damit die Pakete überprüft werden können:
    • Gib dein Passwort ein, wenn du dazu aufgefordert wirst (dies gilt auch für die folgenden Befehle):
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /usr/share/keyrings/caddy.asc
  • Installiere das Repository-Listing:
echo "deb [signed-by=/usr/share/keyrings/caddy.asc] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main" | sudo tee -a /etc/apt/sources.list.d/caddy-stable.list
  • Aktualisiere den Paket-Cache, damit die Pakete aus dem neuen Repository verfügbar sind:
sudo apt update

Schritt 2.2 - Installation von Caddy

Jetzt können wir Caddy mit dem folgenden Befehl installieren:

sudo apt install caddy

Super! Du hast Caddy erfolgreich auf deinem Server installiert!

Schritt 3 - Konfiguration von Caddy

Die Konfigurationsdatei von Caddy, das Caddyfile, befindet sich unter /etc/caddy/Caddyfile.

Schritt 3.1 - Überprüfung der Standardkonfiguration und Leeren des Caddyfile

Die Standardkonfiguration kannst du wie folgt anzeigen:

sudo cat /etc/caddy/Caddyfile
Dein `Caddyfile` sollte so oder so ähnlich aussehen:
## Mit dem Caddyfile kannst du deinen Caddy-Webserver ganz einfach konfigurieren.
#
## Sofern die Datei nicht mit einem globalen Optionsblock beginnt, ist die erste
## nicht auskommentierte Zeile immer die Adresse deiner Website.
#
## Um deinen eigenen Domainnamen (mit automatischem HTTPS) zu verwenden, stelle sicher,
## dass die A/AAAA-DNS-Einträge deiner Domain auf die öffentliche IP dieses Servers
## zeigen, und ersetze ":80" unten durch deinen Domainnamen.

:80 {
        ## Setze diesen Pfad auf das Verzeichnis deiner Website.
        root * /usr/share/caddy

        ## Aktiviere den statischen Dateiserver.
        file_server

        ## Eine andere häufige Aufgabe ist die Einrichtung eines Reverse-Proxys:
        ## reverse_proxy localhost:8080

        ## Oder stelle eine PHP-Website über php-fpm bereit:
        ## php_fastcgi localhost:9000
}

## Weitere Informationen findest du in der Caddy-Dokumentation:
## https://caddyserver.com/docs/caddyfile

Um Caddy zu konfigurieren, ist es am einfachsten, mit einem leeren Caddyfile zu beginnen und die Konfiguration schrittweise hinzuzufügen.

Um die Standardinhalte des Caddyfile zu löschen, kannst du folgenden Befehl verwenden:

sudo truncate -s 0 /etc/caddy/Caddyfile

Wenn du magst, kannst du überprüfen, ob das Caddyfile tatsächlich leer ist:

sudo cat /etc/caddy/Caddyfile

Schritt 3.2 - Hinzufügen der ersten Konfiguration

Jetzt können wir unsere erste Konfiguration zum Caddyfile hinzufügen. Wir beginnen mit einer einfachen Konfiguration, welche die statische HTML-Seite anzeigt, die mit der Caddy-Installation geliefert wurde.

Verwende den folgenden Befehl, um Caddyfile zu öffnen und zu bearbeiten:

sudo nano /etc/caddy/Caddyfile

Um die Datei zu speichern, drücke STRG + S. Um den Editor zu verlassen, drücke STRG + X. Pass auf, dass du deine Änderungen immer speicherst.

In den folgenden Schritten werden nur Teile des Caddyfile gezeigt. Verschiedene Konfigurationen können prinzipiell einfach untereinander stehen. Du musst jedoch sicherstellen, dass für einen Namen (z.B. my-cool-domain.de) nur ein Eintrag vorhanden ist, dies ist wichtig für Domains sowie Subdomains. Wenn du mehrere Einträge für einen Namen hast, wird der Start von Caddy fehlschlagen, da nicht eindeutig ist, welcher Eintrag für den Namen genutzt werden soll.

Schritt 3.2.1 - Deine erste Konfiguration: Bereitstellen von statischen HTML-Dateien

Beginnen wir damit, statische HTML-Dateien bereitzustellen. Dazu verwenden wir die Direktive file_server.

Hinweis: Wenn du eine Firewall eingerichtet hast, musst du eingehende Verbindungen auf den Ports 80 und 443 für Caddy zulassen.

Wenn du magst, kannst du das folgende Beispiel zu deinem Caddyfile hinzufügen. In dem Verzeichnis liegt eine HTML-Datei, die von Caddy als Beispiel mitgeliefert wurde. Denke daran, my-cool-domain.de durch deinen eigenen Domainnamen oder die Subdomain zu ersetzen, bei der du die DNS-Einträge in Schritt 1.2 gesetzt hast.

my-cool-domain.de {

   root * /usr/share/caddy

   file_server

}

Damit deine Änderungen wirksam werden, musst du Caddy die Konfiguration mit dem folgenden Befehl neu laden lassen:

sudo systemctl reload caddy

Um zu überprüfen, ob Caddy läuft und um einige Debugging-Ausgaben anzuzeigen, z. B. wenn ein Fehler in deinem Caddyfile vorliegt, kannst du den folgenden Befehl verwenden:

sudo systemctl status caddy

Nun kannst du deine Domain in deinem Browser öffnen, und du solltest die Standard-Caddy-Seite unter deiner Domain/Subdomäne sehen. Gib einfach https://my-cool-domain.de in deinem Browser ein, und du solltest die Standard-Caddy-Seite sehen. Wenn das nicht sofort funktioniert, warte ca. eine Minute, da Caddy das TLS-Zertifikat anfordern und für deine Domain konfigurieren muss. Wenn du genau hinsiehst (je nach Browser), siehst du ein Schlosssymbol in der Adressleiste, das darauf hinweist, dass die Verbindung über HTTPS verschlüsselt ist. Im Hintergrund hat Caddy ein TLS-Zertifikat von Let's Encrypt angefordert und nutzt dieses nun, um die Seite über HTTPS zu verschlüsseln.

Schritt 3.2.2 - Optional: Caddy als Reverse Proxy

Wenn auf deinem Server ein Webservice läuft, den du nach außen freigeben möchtest, kannst du Caddy als Reverse Proxy verwenden.

Hierfür verwendest due die Direktive reverse_proxy. Die reverse_proxy-Direktive leitet alle Anfragen an die angegebene Adresse weiter.

Wenn du einen Webservice auf Port 8080 auf deinem Server ausführst, kannst du die folgende Konfiguration verwenden, um deinen Webservice über deine Domain / Subdomain über eine verschlüsselte HTTPS-Verbindung öffentlich verfügbar zu machen:

my-cool-domain.de {

   reverse_proxy localhost:8080

}

Stelle sicher, dass du keine anderen Einträge für my-cool-domain.de in deinem Caddyfile hast, da das neuerliche Laden des Caddyfile scheitern wird, wenn mehrere Einträge für einen Namen vorhanden sind.

Um deine Änderungen zu aktivieren, musst du Caddy die Konfiguration mit dem folgenden Befehl neu laden lassen:

sudo systemctl reload caddy

Fazit

Jetzt weißt du, wie du den Server mit zwei grundlegenden Konfigurationen einrichtest. Mit Caddy stehen jedoch viele weitere Konfigurationsmöglichkeiten zur Verfügung, und auch die gezeigten Konfigurationen können erweitert werden.

Diese und noch mehr Informationen findest du in der Caddy-Dokumentation.

Wenn du magst, kannst du andere Direktiven aus der Dokumentation ausprobieren, genauso wie wir die anderen Konfigurationen in diesem Tutorial ausprobiert haben. Füge die Direktiven einfach zum Caddyfile hinzu und lade Caddy mit sudo systemctl reload caddy neu.

Ich finde das Arbeiten mit Caddy und dem Caddyfile sehr einfach und intuitiv. Ich hoffe, dir geht es genauso!

License

MIT

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicence, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Contributor's Certificate of Origin

By making a contribution to this project, I certify that:

  1. The contribution was created in whole or in part by me and I have the right to submit it under the license indicated in the file; or

  2. The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same license (unless I am permitted to submit under a different license), as indicated in the file; or

  3. The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it.

  4. I understand and agree that this project and the contribution are public and that a record of the contribution ( including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the license(s) involved.

Veröffentlicht am 29.9.2023 von Anton Mrosek

Tutorial einreichen

Erhalte einen 60€ netcup Gutschein für jedes veröffentlichte Tutorial.