Seit langem betreibe ich einen (inzwischen kleinen) Server im Keller, auf dem via KVM verschiedene virtuelle Maschinen laufen. Zum einen Spielwiese, zum anderen “kostengünstiges” Hosting für meine eigenen kleinen Projekte.

Da ich hauptsächlich mit Java unterwegs bin und das Webframework meiner Wahl Apache Wicket ist, läuft jede Webanwendung in einer eigenen virtuellen Maschine (Ubuntu Server 22.04LTS).

Eine Zeitlang hatte ich lighttpd im Einsatz, bin dann aber, wegen irgendwelcher Probleme (ich glaube damals gab es noch keinen HTTP/2 Support in Verbindung mit der ReverseProxy-Funktion) zu Apache2 gewechselt, um die einzelnen VMs nach außen sichtbar zu machen.

Nachfolgend eine Beispielkonfiguration, wie ich meinen kleinen privten GIT (damals basierend auf gogs) angebunden habe:

  <IfModule mod_ssl.c>
    <VirtualHost *:443>
        Protocols h2 h2c http/1.1
        ServerAdmin ....
        ServerName git.sperber.info

        DocumentRoot /var/www/html

        Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        SSLProxyEngine          On
        ProxyRequests           Off
        ProxyPreserveHost       On
        ProxyPass               /       http://192.168.0.16:6000/
        ProxyPassReverse        /       http://192.168.0.16:6000/

        RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
        RequestHeader set "X-Forwarded-SSL" expr=%{HTTPS}
        RequestHeader set "X-Forwarded-For" expr=%{REMOTE_ADDR}
        RequestHeader set "X-Forwarded-Host" expr=%{SERVER_NAME}

        ErrorLog /var/log/apache2/error.log
        LogLevel warn

        CustomLog /var/log/apache2/ssl_access_git_sperber_info.log combined

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/git.sperber.info/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/git.sperber.info/privkey.pem
        SSLCACertificateFile /etc/letsencrypt/live/git.sperber.info/chain.pem

    </VirtualHost>
  </IfModule>

Diese 38 Zeilen sehen eigentlich überschaubar aus. Etwas aufwändiger war aber die Verwaltung der SSL-Zertifikate mit certbot.

Hier kommt jetzt Caddy ins Spiel. Caddy übernimmt die gleiche Aufgabe, wie bisher Apache2, reduziert aber den Konfigurationsaufwand für mich deutlich:

knufftuff.de, www.knufftuff.de {
        reverse_proxy 192.168.0.25:8080
}

gitea.sperber.info {
        reverse_proxy 192.168.0.14:3000
}

git.sperber.info {
        reverse_proxy 192.168.0.16:6000
}

ssh.sperber.info {
        basicauth / {
                flo JDJhJDE0JH......
        }
        reverse_proxy 192.168.0.2:8888
}

sperber.info, www.sperber.info {
        reverse_proxy 192.168.0.19:80
}

Besonders schön ist aber, dass Caddy sich selbst darum kümmert, für meine Hosts ein passendes SSL-Zertifikat zu beantragen (und auch zu erneuern), solange der dazugehörige DNS Eintrag gepflegt ist.

Was ich mir noch nicht angeschaut habe, sind folgende Features:

  • Konfiguration über eine API
  • Caddy als Webserver für dieses Wordpress via FastCGI
  • Monitoring