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.
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;
}
<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!
Für die Anleitungen in diesem Tutorial benötigst du Folgendes:
Caddyfile
.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.
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.
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.
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:
Typ | Host | Wert |
---|---|---|
A | @ | IPv4-Adresse deines Servers |
AAAA | @ | IPv6-Adresse deines Servers |
Wenn dir entweder IPv4 oder IPv6 fehlt, kannst du den entsprechenden Eintrag weglassen.
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.
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:
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /usr/share/keyrings/caddy.asc
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
sudo apt update
Jetzt können wir Caddy mit dem folgenden Befehl installieren:
sudo apt install caddy
Super! Du hast Caddy erfolgreich auf deinem Server installiert!
Die Konfigurationsdatei von Caddy, das Caddyfile
, befindet sich unter /etc/caddy/Caddyfile
.
Caddyfile
Die Standardkonfiguration kannst du wie folgt anzeigen:
sudo cat /etc/caddy/Caddyfile
## 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
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.
Beginnen wir damit, statische HTML-Dateien bereitzustellen. Dazu verwenden wir die Direktive file_server
.
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.
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
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!
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.
By making a contribution to this project, I certify that:
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
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
The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it.
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.