Caddy v2 als Proxy

Caddy v2 als Proxy

Warum Caddy und nicht nginx?

Caddy ist quasi ein “oneline” Textdokument, welches nach der Installation alle Aufgaben für SSL-Certifikate von Letsencrypt automatisch abruft und aktualisiert. “Installieren und vergessen” ist hier das Zauberwort.

Installation

Zunächst müssen unter Apt-Distros die Repositorys und Schlüssel geholt werden, Repository update und danach die Installation:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
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 install caddy

Ports am Router/Firewall freigeben

Caddy benötigt zwingend den Port 80 und Port 443. Also den http Port und den https Port. Auch wenn man annimmt, dass andere Webservices diese Ports benötigen. Diese Webservices sollten dann auf höhere Ports umgestellt werden (vierstellig z.B.)

Caddyfile editieren

Für die Configuration ist nur eine Datei notwendig. Die Caddyfile Datei:

sudo nano /etc/caddy/Caddyfile

Der hier enthaltende Erklärungstext kann quasi komplett entfernt werden. Wir benötigen lediglich den folgenden Aufbau:

sub.domain.de {
   reverse_proxy 192.168.1.21:3333
} 

sub.domain.de durch die eigene Domain ersetzen sowie die IP-Nummer und den Port. Es gilt vorher zu testen ob diese IP+Port aktuell auch wirklich zu dem gewünschten Webservice führen.

Caddy systemd ausführen

Um nun Caddy als systemd Service zu nutzen ist es notwendig den systemd service zum Einen zu aktivieren:

sudo systemctl enable caddy.service

dann den Service starten:

sudo systemctl start caddy.service

und zu guter Letzt jede Änderung der Caddyfile benötigt einen Neustart des Services, das wird wie folgt gelöst:

sudo systemctl reload caddy.service

Um den Status zu überprüfen auf eventuelle Fehlermeldungen ist folgende Eingabe notwendig:

sudo systemctl status caddy.service

Caddy zusätzliche Variablen und Extras

file_server ist z.b. eine Variable die gerne bei Cloud Anwendungen notwendig ist. Andere Webdienste wie dieses Wiki oder auch Blogs wie Wordpress benötigen kleinere Funktionsergänzungen:

sub.domain.de {
   reverse_proxy 192.168.1.21:3333
   encode zstd gzip

   header / {
               Strict-Transport-Security               "max-age=31536000; includeSubdomains; preload"
               X-Content-Type-Options                  "nosniff"
               X-XSS-Protection                        "1; mode=block"
               X-Robots-Tag                            "none"
               X-Download-Options                      "noopen"
               X-Permitted-Cross-Domain-Policies       "none"
               Referrer-Policy                         "no-referrer"
       }
}

Dies ist beispielhaft für die HSTS Funktionalität, preload in Browsern sowie gzip Komprimierung. Letztendlich alles Verbesserungen für die Geschwindigkeit.

Quellenangaben

https://caddyserver.com/docs/install#debian-ubuntu-raspbian

Bonus: Caddy in Docker-Compose

Wer keine Bare-Metal Installation möchte, kann Caddy auch mit Docker-Compose installieren. Dies hat u.A. den Vorteil, sehr einfach DNS-over-Quic zu nutzen bzw. http/3. Der Trick ist als Port auch 443/udp einzusetzen. Wichtig ist nur daran zu denken auch 443 udp in den entprechenden Firewall-Einträgen zu ergänzen. Danach werden quasi alle Dienste und Webdeploys per http/3 im Netz verfügbar gemacht (mit Fallback auf http/2 natürlich)

services:
  caddy_reverse_proxy:
    image: caddy:latest
    restart: unless-stopped
    container_name: caddy_proxy
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
    volumes:
      - .Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
    networks:
      - caddy_net
volumes:
  caddy_data: null
  caddy_config: null
networks:
  caddy_net: null

Man kann auch gerne meinen Blog auf http/3 Funktionalität überprüfen:

HTTP/3 Check - piriot.de
Is my site using HTTP3? Check HTTP3 service on any URL. Test QUIC service, too.