Grav ist ein dateibasiertes Open-Source-CMS, das eine gute Alternative für Blogs und Webseiten darstellt. Im Gegensatz zu WordPress oder anderen komplexen Content Management Systemen kommt Grav ohne Datenbank aus und benötigt daher deutlich weniger Systemressourcen. In dieser Anleitung zeige ich euch, wie ihr das Grav CMS mittels Docker und Traefik bereitstellen könnt.
1. Voraussetzungen
Für diese Installation gehe ich davon aus, das ihr bereits Docker und den Traefik-Reverse Proxy installiert habt. Falls das noch nicht der Fall ist solltet ihr zunächst die Grundinstallation vornehmen. Die hierfür notwendigen Anleitungen findet ihr hier:
- Docker & Docker Compose v2 (Debian / Ubuntu)
- TRAEFIK V2 + 3 – REVERSE-PROXY MIT CROWDSEC IM STACK EINRICHTEN
2. Installation
Es existiert ein vorkonfiguriertes Docker-Image mit einer Grav-Installation inklusive optionalem Admin-Dashboard. Dieses Image wird von linuxserver.io zur Verfügung gestellt und gewartet. Wir werden die jeweils aktuellste Version des Images in die docker-compose.yml-Datei einbinden und verwenden.
Ich verwende in dieser Anleitung die fiktive Domain „example.com“. Diese Domain muss von euch durch die zu verwendende Domain ersetzt werden. Wenn nur eine Subdomain erreichbar sein soll, kann auch eine Subdomain wie z.B. „blog.example.com“ verwendet werden.
2.1 DNS-Einträge erzeugen
Bevor wir den Service erstmalig starten, müssen wir sicherstellen, dass für die gewählte Domain ein Eintrag im DNS vorgenommen wurde. Dieser Eintrag sorgt dafür, dass die Webseite nach der Einrichtung erreichbar ist und das automatische Einrichten eines Zertifikates erfolgen kann. Dieser Schritt ist nur notwendig, wenn ihr eine Domain benutzen wollt, die keine Subdomain eurer Standard-Domain ist. Ansonsten reicht der existierende Wildcard-Eintrag, und es sind keine weiteren Schritte notwendig.
Wie der notwendige Eintrag bei euch vorgenommen werden muss, hängt von dem Provider ab, über den ihr eure Domain registriert habt. Grundsätzlich wird hier nur ein A- und/oder ein AAAA-Eintrag nötig sein, und der Inhalt ist die öffentlich erreichbare Adresse eures Servers.
2.2 Ordnerstruktur erzeugen
Zunächst müssen wir nun einen Ordner anlegen. In meinem Fall und um eine bessere Übersicht zu haben, verwende ich jeweils den Domain-Namen als Ordnernamen. Alle meine Container liegen in einem Ordner „/opt/containers/“.
Wir legen nun zunächst den Ordner „example.com“ und darin einen Unterordner „config“ an mit folgendem Kommando: (Ihr solltet example.com hier durch euren eigenen Domain-Namen ersetzen.)
Wichtig ist: Ihr könnt – anders als in meinem Beispiel – anstelle des Domain-Namen jeden beliebigen anderen Namen verwenden, Ich habe auf dem Server mehrere Installation von Grav gleichzeitig laufen, daher habe ich mich für den Domainnamen entschieden. So kann ich bereits auf den ersten Blick sehen an welcher Anwendung (CMS, Webseite …) ich gerade arbeite.
mkdir /opt/containers/example.com/config -p
Wir wechseln nun mit Installationsordner
cd /opt/containers/example.com
2.3 Environment Datei .env erzeugen
Im bisher leeren Installationsordner legen wir zunächst eine Datei „.env“ an und füllen diese mit dem Inhalt aus dem folgendem Beispiel.
touch .env
Ich habe alle für die Einrichtung notwendigen Werte in dieser Datei zusammengefasst, und wir werden diese Variablen in der docker-compose.yml-Datei verwenden, um die Einrichtung durchzuführen. Der Vorteil hierbei ist, dass wir die docker-compose.yml-Datei unverändert für verschiedene Projekte verwenden können und auch Änderungen an einzelnen Werten keine Änderung an der Datei erzwingen. Hier findet ihr die notwendigen Zeilen, die ihr in die gerade angelegte Datei einfügt und an eure Bedürfnisse anpasst.
# docker container image IMAGE_NAME=lscr.io/linuxserver/grav IMAGE_VERSION=latest # der Name unseres internen Dienstes SERVICE_NAME=example # Der oeffentlich sichtbare Domainname DOMAIN_NAME=example.com
Ersetzt hierbei bitte den Wert für DOMAIN_NAME mit dem für euer Projekt zu verwendenden Domainnamen. Als Beispiel für ein echtes Projekt würde dann dort stehen: DOMAIN_NAME=muster-firma.de
Den Wert für SERVICE_NAME setzen wir auf einen auf eurem System bisher nicht verwendeten Namen für den Dockerservice, den wir anlegen wollen. Zum Beispiel: SERVICE_NAME=muster-firma
2.4 Konfigurationsdatei docker-compose.yml anlegen
Hier findet ihr die von mir verwendete docker-compose.yml-Datei. Diese verwendet die Variablen aus der Datei .env, bindet die oben angesprochene Image-Datei „lscr.io/linuxserver/grav:latest“ ein und richtet die Verbindung zum Traefik-Proxy automatisch her.
touch docker-compose.yml
WICHTIG: Damit ich diese Datei für verschiedene Projekte verwenden kann, habe ich in dieser Datei ein paar Platzhalter verwendet, die wir nun noch fix furch den richtigen Wert ersetzen müssen. Das geht ganz einfach durch Ausführen des Befehls, den ihr unterhalb des Dateiinhaltes findet.
version: '3.9' services: <service-label>: image: "${IMAGE_NAME}:${IMAGE_VERSION}" container_name: "${DOMAIN_NAME}" environment: - PUID=1000 - PGID=1000 - TZ=Europe/Berlin labels: traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.<service-label>-secure.entrypoints: websecure traefik.http.routers.<service-label>-secure.middlewares: default@file traefik.http.routers.<service-label>-secure.rule: Host(`${DOMAIN_NAME}`) traefik.http.routers.<service-label>-secure.service: "${SERVICE_NAME}" traefik.http.routers.<service-label>-secure.tls: "true" traefik.http.routers.<service-label>-secure.tls.certresolver: http_resolver traefik.http.services.<service-label>.loadbalancer.server.port: "80" networks: default: null proxy: null restart: always volumes: - /$PWD/config:/config networks: default: proxy: external: true
sed -i "s/<service-label>/example/g" docker-compose.yml
Bei diesem Kommando müsst ihr nur das Wort “example” durch den in eurer .env-Datei definierten SERVICE_NAME ersetzen. Für mein Beispielprojekt wäre das dann:
sed -i “s/<service-label>/muster-firma/g” docker-compose.yml
Damit ist die Konfiguration bereits abgeschlossen und wir können weitermachen.
2.5 Der “config” Ordner
Der “config”-Ordner, den wir im Schritt 2.2 mit angelegt haben, ist zu diesem Zeitpunkt noch leer. Das wird sich nach dem ersten Starten des Containers ändern. Mehr dazu weiter unten.
2.6 Den Docker Container starten
Nachdem wir sichergestellt haben, dass die DNS-Einträge vorgenommen sind, die Dateien „.env“ und „docker-compose.yml“ angelegt und die notwendigen Anpassungen erledigt wurden, können wir nun den Container ein erstes Mal starten.
cd /opt/containers/example.com docker compose up -d
Das Kommando wird alle notwendigen Dateien erzeugen und installieren. Wenn wir vorher Docker und Traefik+CrowdSec gemäß der Anleitung installiert haben und der DNS-Eintrag richtig gesetzt ist, wird automatisch ein LetsEncrypt-Zertifikat erzeugt und installiert.
Wenn alles so weit funktioniert hat, werden wir im Traefik-Dashboard einen neuen HTTP-Router-Eintrag vorfinden:
3. Erste Schritte
Wir können nun die Webseite ein erstes Mal aufrufen. Das gewählte Docker-Image liefert bereits eine vorinstallierte Grav-Instanz mit dem Admin-Plugin. Beim ersten Aufruf werden wir automatisch auf die Einrichtungsseite umgeleitet, über die wir unseren Admin-Benutzer anlegen können. Das Grav CMS kann auch ohne das Admin-Plugin genutzt werden,. Dazu muss einfach das Admin-Plugin vom System gelöscht werden. Ich finde aber einige Funktionen – wie das Umsortieren von Seiten und Artikeln – sehr praktisch, von daher lassen wir das Admin-Plugin aktiviert.
3.1. Administrator anlegen
Beim ersten Aufruf der Webseite werden wir ins Admin-Plugin umgelenkt und können hier weitere Einstellungen vornehmen. Hier sollten wir zunächst einmal eine Aktualisierung der Grav-Installation und der installierten Plugins vornehmen.
3.2 Aktualisieren des Systems über das Admin-Dashboard
Wir sollten zunächst einmal eine Aktualisierung der Installation und der Plugins vornehmen. Hierzu verwenden wir zunächst das Admin-Dashboard. Ich erkläre im Punkt 3.4 wie wir das auch über die Kommandozeile durchführen können.
3.3 Zugriff auf die Dokumente
Das Grav-CMS kommt ohne Datenbank aus und alle Artikel liegen als einfache Markdown Textdateien im System. Nach dem ersten Start des Containers werden im Ordner „config“ automatisch einige weitere Unterordner angelegt. Uns interessieren hierbei zunächst nur die Ordner:
– config/www/user/accounts/
Hier liegen für alle angelegten Benutzer jeweils eigenen Dateien.
– config/www/user/pages/
Hier finden wir für die erstellten Webseiten die notwendigen Dateien.
– www/user/config/
Hier finden wir die Dateien mit den Grundeinstellungen des Systems
3.4 Zugriff auf das Grav-System
Wenn wir das Admin-Plugin installiert haben, benötigen wir diesen direkten Zugriff auf das System eigentlich nicht. Sollten wir das Admin-Plugin deinstalliert haben oder zusätzliche Plugins und Themes aus der Komandozeile installieren wollen, können wir diese mit folgendem Kommando erreichen.
docker exec -it example.com bash
Um Einstellungen an Grav von der Kommandozeile zu verwalten, wechseln wir in der Container Shell zunächst in den Ordner
cd /app/www/public
Hier stehen uns diese drei Grav Tools zur Verfügung.
./bin/grav – Grav CLI Application
./bin/gpm – Grav Package Manager
./bin/plugin – Grav Plugin Manager für Plugins mit eigener CLI
Um das Grav CMS und die installierten Plugins zu aktualisieren reicht es das folgende Kommando auszuführen.
./bin/gpm update
Die Verwendung der einzelnen Tools ist ausführlich in der Grav-Dokumentation erklärt; ich spare mir daher diesen Inhalt hierhin zu kopieren und füge an dieser Stelle nur den Link auf die Dokumentation hinzu. https://learn.getgrav.org/17/cli-console
4 Zusammenfassung
Mit wenigen einfachen Schritten haben wir eine vollständige Installation eines Grav CMS durchgeführt und diese in den Traefik Proxy eingebunden. Wir verfügen nun über ein vollständiges Grav CMS, das wir jederzeit nach unseren Bedürfnissen anpassen können.
Durch die Verwendung einer Environment-Datei, die alle notwendigen Variablen enthält, sind wir in der Lage diese Installation mit wenigen Änderungen zu modifizieren oder für weitere Installationen zu verwenden.