ADMIN

2023

10

2023-09-28T12:00:00

Proaktive IT-Sicherheit

PRAXIS

052

Open-Source-Tipp

Kommunikation

Webserver

Blog mit Caddy und Ghost betreiben

Nicht nur der Inhalt zählt

von Thorsten Scherf

Veröffentlicht in Ausgabe 10/2023 - PRAXIS

Um einen Blog zu betreiben, verwenden Admins oft die bewährte Kombination aus NGINX als Webserver und WordPress als Plattform. Doch sind die beiden populären Werkzeuge im Betrieb keine Leichtgewichte. Unser Open-Source-Tipp in diesem Monat stellt als Alternative das Duo Caddy und Ghost vor. Zum Setup greift der Artikel auf Container zurück, die Sie mithilfe der Container-Engine Podman erzeugen.

In diesem Artikel möchten wir Ihnen eine einfache und komfortable Möglichkeit aufzeigen, wie Sie schnell einen Blog mithilfe fertiger Container-Images aufsetzen. Die Anforderungen an das Setup sind ein sicherer und performanter Betrieb. Sämtliche eingesetzten Webkomponenten sollen dabei eine einfache und strukturierte Konfiguration verwenden.
Automatisches TLS dank Caddy
Caddy [1] eignet sich gut als Webserver und Reverse-Proxy für die eigentliche Blogging-Plattform. Die Software verwendet nämlich standardmäßig und automatisch HTTPS für sämtliche Kommunikation und kümmert sich komplett selbstständig um das TLS-Setup. Für das automatische Deployment eines X.509-Zertifikats setzt Caddy auf das "Automatic Certificate Management Environment" (ACME) und nutzt standardmäßig Let's Encrypt als Certificate Authority (CA). Das Open-Source-Projekt verwendet Go als Programmiersprache und stellt sämtliche Sourcen auf GitHub [2] zur Verfügung.
Ghost [3] als Blogging-Platform können Sie sowohl kostenpflichtig als Clouddienst wie auch lokal einsetzen. Auch hier stehen die Quellen auf GitHub zur Verfügung. Die Software ist in JavaScript geschrieben und verwendet NodeJS als Laufzeitumgebung. Über ein intuitives Webfrontend lässt sich die Plattform sowohl administrieren als auch Content erzeugen und veröffentlichen.
In diesem Artikel möchten wir Ihnen eine einfache und komfortable Möglichkeit aufzeigen, wie Sie schnell einen Blog mithilfe fertiger Container-Images aufsetzen. Die Anforderungen an das Setup sind ein sicherer und performanter Betrieb. Sämtliche eingesetzten Webkomponenten sollen dabei eine einfache und strukturierte Konfiguration verwenden.
Automatisches TLS dank Caddy
Caddy [1] eignet sich gut als Webserver und Reverse-Proxy für die eigentliche Blogging-Plattform. Die Software verwendet nämlich standardmäßig und automatisch HTTPS für sämtliche Kommunikation und kümmert sich komplett selbstständig um das TLS-Setup. Für das automatische Deployment eines X.509-Zertifikats setzt Caddy auf das "Automatic Certificate Management Environment" (ACME) und nutzt standardmäßig Let's Encrypt als Certificate Authority (CA). Das Open-Source-Projekt verwendet Go als Programmiersprache und stellt sämtliche Sourcen auf GitHub [2] zur Verfügung.
Ghost [3] als Blogging-Platform können Sie sowohl kostenpflichtig als Clouddienst wie auch lokal einsetzen. Auch hier stehen die Quellen auf GitHub zur Verfügung. Die Software ist in JavaScript geschrieben und verwendet NodeJS als Laufzeitumgebung. Über ein intuitives Webfrontend lässt sich die Plattform sowohl administrieren als auch Content erzeugen und veröffentlichen.
Wir verwenden in unserem Artikel sowohl für Caddy als auch Ghost Container-Images. Als Backend-Datenbank für Ghost verrichtet ein MariaDB-Container seine Arbeit. Um das Setup weiter zu vereinfachen, können Sie das Listing 2 zusammen mit podman-compose verwenden. Das Tool arbeitet analog zu docker-compose, erfordert aber natürlich keinen Docker-Daemon, sondern lediglich Podman als Container-Engine.
Caddy-Konfiguration mit Let's Encrypt
Bevor wir uns nun an das Setup der einzelnen Container machen, benötigen Sie noch eine Konfigurationsdatei für den Caddy-Webserver, den Sie in diesem Fall als reverse Proxy für die eigentliche Blogging-Plattform einsetzen. Das Listing 1 zeigt ein einfaches Beispiel. Um ein X.509-Zertifikat mittels ACME von der Let's-Encrypt-CA zu beziehen, reicht es bereits aus, wenn Sie Ihren Domänennamen für den reverse Proxy in der Konfigurationsdatei eintragen. Zu Testzwecken sollten Sie jedoch zuerst die Let's-Encrypt-Staging-Umgebung als CA-Endpoint festlegen.
Listing 1: Caddyfile zur Webserver-Konfiguration
{
         # E-Mail-Adresse für LetsEncrypt
         email foobar@example.com
         # LetsEncrypt-Staging-Umgebung zum Testen.
        # Funktioniert alles, bitte diese Zeile entfernen oder auskommentieren.
         acme_ca https://acme-staging-v02.api. letsencrypt.org/directory
}
# Einfacher Reverse-Proxy für Ghost.example.com {
         reverse_proxy ghost:2368
}
# Redirect für www-Anfragen auf die Domäne www.example.com {
         redir https://example.com{uri}
}
In der Konfigurationsdatei "Caddyfile" können Sie hierfür die Option "acme_ ca" verwenden und dort als URL "https://acme-staging-v02.api.letsencrypt.org/directory" hinterlegen. Starten Sie dann den Caddy-Container, wird ein Zertifikat aus dieser Testumgebung angefordert. Waren die Tests erfolgreich, sollten Sie diesen Eintrag wieder entfernen, um ein Zertifikat aus der produktiven Let's-Encrypt-Umgebung zu erhalten. Webbrowser sind dann auch in der Lage, dieses korrekt zu verifizieren. Die ausgestellten Zertifikate für Ihre Domäne finden Sie innerhalb des Caddy-Containers im Verzeichnis "/data/caddy/ certificates/".
Container mit podman-compose erzeugen
Im besten Fall erzeugen Sie zuerst einen Projektordner, beispielsweise "blog", und erstellen in diesem ein weiteres Verzeichnis, wie etwa "Caddy", das die Konfigurationsdatei "Caddy" enthält. Diese wird dann später in den eigentlichen Caddy-Container eingebunden.
Listing 2: Datei "compose.yml"
### Das Tool podman-compose verwendet die Datei compose.yml für das Deployment der einzelnen Container.
---
version: '3.8'
services:
     # Caddy dient als Webfrontend-System und zum Bezug eines Zertifikates mittels Lets­Encrypt.
     caddy:
         image: caddy:latest
         container_name: caddy
         depends_on:
             - ghost
         ports:
             - caddy_data:/data
             - caddy_config:/config
     # Ghost ist die eigentliche Blogging-Plattform
ghost:
         image: docker.io/library/ghost:5
         container_name: ghost
         restart: always
         depends_on:
             -ghostdb
         environment:
             url: https://example.com
             database__client: mysql
             database__connection__host: ghostdb
             database__connection__user: ghost
             database__connection__password: PassW0rd456
             database__connection__database: ghostdb
         volumes:
             - ghost:/var/lib/ghost/content
     # MariaDB stellt die Backend-Datenbank für Ghost zur Verfügung
         ghostdb:
         image: docker.io/library/mariadb:11
         container_name: ghostdb
         restart: always
         environment:
             MYSQL_ROOT_PASSWORD: PassW0rd123
            MYSQL_USER: ghost
             MYSQL_PASSWORD: PassW0rd456
             MYSQL_DATABASE: ghostdb
         volumes:
             - ghostdb:/var/lib/mysql
volumes:
         caddy_config:
         caddy_data:
         ghost:
         ghostdb:
Verwenden Sie Listing 2 als Datei "compose.yml" und speichern Sie diese ebenfalls in Ihrem Projektordner, also beispielsweise "blog", ab:
$ tree ~/blog/
/home/tscherf/blog/
|--  caddy
|    `-- Caddyfile
`-- compose.yml
 
1 directory, 2 files
Passen Sie dann Ihren Domänennamen für den Ghost-Container an und wählen Sie die passenden Passwörter für den MariaDB-Container. Im Anschluss erzeugen Sie die Container mithilfe von podman-compose aus dem Verzeichnis heraus, in das Sie die Datei "compose.yml" gespeichert haben:
# podman-compose up
Das Tool steht, ebenso wie die benötigte Podman Container-Engine, in vielen Linux-Distributionen zur Verfügung, lässt sich aber alternativ auch aus den Quellen [5] heraus übersetzen. Hat alles geklappt, sollte der Aufruf von podman ps schließlich einen caddy, ghost und ghostdb Container anzeigen (Bild 1).
Bild 1: Nach dem Aufruf von podman-compose stehen alle drei Container zur Verfügung.
Sicherer Zugriff mit TLS
Rufen Sie nun die im "Caddyfile" angegebene URL in Ihrem Webbrowser auf, also "http://example.com", führt Caddy automatisch eine Umleitung auf den Port 443 durch und verwendet so mittels HTTPS einen sicheren Zugriff auf Ihren Blog. Dies ist wichtig, da Sie zur Konfiguration des Blogs im ersten Schritt ein Passwort für dem Admin-Benutzer festlegen müssen. Das Admin-Panel erreichen Sie, indem Sie an Ihre URL den String "/ghost" anhängen.
Denken Sie an dieser Stelle auch unbedingt daran, dass Caddy nicht mehr die Let's-Encrypt-Staging-Umgebung verwendet, da Sie ansonsten beim Zugriff auf Ihren Blog immer eine Fehlermeldung des Webbrowsers erhalten. Haben Sie schließlich den administrativen Benutzer eingerichtet, können Sie nach einem Login mit dem Konto weitere Konfigurationseinstellungen vornehmen oder Ihre ersten Blog-Einträge erzeugen und veröffentlichen.
Fazit
Um einen eigenen Blog zu betreiben, müssen nicht immer die Schwergewichte NGINX und WordPress zum Einsatz kommen. Mit Caddy und Ghost stehen sehr gute Alternativen zur Verfügung, die nicht nur die TLS-Konfiguration wesentlich vereinfachen, sondern auch noch eine sehr gute Performance bieten. Durch den Einsatz von entsprechenden Container-Images gelingt das Setup in kürzester Zeit.
(dr)
Link-Codes
[2] Caddy-GitHub-Repository: https://github.com/caddyserver/caddy
[4] Ghost-GitHub-Repository: https://github.com/TryGhost/Ghost
[5] podman-compose auf GitHub: https://github.com/containers/podman-compose/