In diesem Beitrag möchte ich einen kurzen Erfahrungsbericht zur Einrichtung und dem Betrieb des Open Source Flat-File-CMS Grav beim Strato Webhosting (shared hosting) geben.

Motivation

In den vergangenen Jahren habe ich hauptsächlich auf das in PHP geschriebene und unter MIT-Lizenz verfügbare CakePHP Webframework [1] gesetzt. Gefühlt war CakePHP aber immer überdimensioniert für meine Anliegen und auch die Einrichtung auf meinem Webhostingpaket bei Strato hatte so ihre Tücken.

Zwar sind die in CakePHP verwendeten Konzepte und Techniken, u. a. Model-View-Controller (MVC-Pattern) [2], Don’t repeat yourself (DRY) [3] und Convention over Configuration (CoC) [4] oder auch die Bakery-Funktion [5], sehr spannend und helfen ungemein bei der Strukturierung einer Webanwendung, aber über die Zeit empfand ich auch die Ladezeiten (sog. page load performance) als zu lang.

Ein paar Informationen zu Grav

Auf der Suche nach einer schlankeren Alternative stieß ich letztendlich auf das Grav [6] und testete dieses einige Zeit auf meinem Linux-System, bevor ich mich final für Grav entschied. Grav ist ein sogenanntes Flat-File-Content-Management-System (FFCMS) [7]. Die Inhalte einer Seite werden in einfachen Dateien abgespeichert. Es muss also keine Datenbank betrieben werden.

Zur Strukturierung der wesentlichen Informationen für eine Seite geben die jeweiligen FFCMS das Format für die Daten (z. B. JSON oder XML oder Markdown) und die wesentlichen zu hinterlegenden Informationen als Schema vor. Neue Seiteninhalte müssen dann nur in den entsprechenden Formaten an die dafür vorgesehenen Stellen hinterlegt werden. Bei Grav sind die Dateien in einem Metadatenbereich und einem Inhaltsbereich unterteilt. Der Inhalt wird über die vereinfachte Auszeichnungssprache Markdown formatiert [8].

Die Anforderungen für eine Inbetriebnahme sind überschaubar (ein Webserver und PHP 7.3.6 oder höher) [9]. Zudem bietet Grav gängige Funktionen (statische Seiten, Blogs, Gallerien) out-of-the-box an und verfügt über eine gute Dokumentation [10], die bisher keine Wünsche offen gelassen hat. In der Dokumentation werden zudem bereits Anleitungen für die Inbetriebnahme von Grav bei shared hosting Anbietern (allerdings nur zu amerikanische Anbieter) angeboten [11].

Grav lokal installieren

Grav kann auf verschiedenen Wegen installiert werden (manuelle Installation über ein ZIP-Paket, Installation via composer, Installation von GitHub) [12]. Für die Installation von Grav auf meinem lokalen System (Linux Mint) wählte ich den Weg via composer (ein sogenannter Dependency Manager für PHP [13]). Grav verfügt über einen Built-in PHP Webserver, sodass im Grunde keine weiteren Schritte für eine lokale Entwicklungsumgebung notwendig sind [12]. Ich persönlich habe auf meinem Linuxsystem aber bereits einen Apache2 Server mit PHP-Modul eingerichtet, sodass ich den Built-in Webserver von Grav nicht nutze.

Die Installation via composer ist schnell erledigt. Über ein Terminal wird folgender Befehl eingegeben: composer create-project getgrav/grav

Anschließend lädt composer die notwendigen Dateien herunter und übernimmt die erste Grundkonfiguration von Grav. Somit wäre das FFCMS Grav bereit für die Ausarbeitung der auf der Webseite bereitzustellenden Inhalte sowie die Anpassung der Konfiguration an die persönlichen Anforderungen und Bedürfnisse.

Einrichten und Übertragung auf den Strato Webserver

Sind die Arbeiten an der Webseite abgeschlossen, erfolgt die Übertragung der auf Grav basierenden Webseite auf den Webspace von Strato. Die im Guide beschriebenen Wege zur Einrichtung von Grav bei shared hosting Anbietern erfordern einen SSH-Zugang, der bei Strato nicht in allen Paketen (wie im von mir gebuchten Paket) verfügbar ist, wodurch diese Anleitungen für diese Fallkonstellation leider nicht hilfreich sind. Das Einrichten und Übertragen muss daher auf klassischen Weg erfolgen, also durch Übertragung der Webseite und des Grav-Basissystems via SFTP-Client. Als SFTP-Client nutze ich die freien Open Source Anwendung FileZilla [14]. Die Einrichtung von FileZilla für die Übertragung beschreibt Strato im FAQ [15].

Für die Inbetriebnahme sind ggf. vorab im Webportal von Strato einige Einstellungen vorzunehmen (Zuordnung einer oder mehrerer Domains zum Zielverzeichnis, ggf. Zuordnung einer oder mehrerer Subdomains, ggf. Zuordnung des SSL-Zertifikats etc.), auf die ich an dieser Stelle nicht näher eingehe und welche im FAQ von Strato nachgelesen werden können [16]. Ich gehe daher an dieser Stelle davon aus, dass diese Voreinstellungen bereits vorgenommen wurden und nur noch die Übertragung von Grav und der auf der Webseite bereitzustellenden Inhalte aussteht.

Für den Betrieb von Grav bei einem shared hosting Anbieter sind nicht alle im Basisverzeichnis (aka root-Verzeichnis) vorhandenen Dateien und Verzeichnisse notwendig. Grav verfügt über eine Prüfroutine, die fehlende Verzeichnisse erkennt und bei Aufruf der Webseite auf diese hinweist [17], wodurch die relevanten Ordner auch leicht zu identifizieren sind. Zudem werden auch die Anforderungen durch die Prüfroutine kontrolliert und mögliche Fehler angezeigt. Für den Betrieb müssen folgende Unterverzeichnisse des Basisverzeichnisses auf den Webspace übertragen werden:

Verzeichnis Anmerkungen
assets mit Schreibrechten
backup mit Schreibrechten
cache mit Schreibrechten
images mit Schreibrechten
logs mit Schreibrechten
system -
tmp mit Schreibrechten
user/accounts mit Schreibrechten
user/config -
user/data mit Schreibrechten
user/pages -
user/plugins/ -
user/plugins/error -
user/themes -
vendor -

Das bei der lokalen Installation erzeugten Verzeichnisse ’bin‘ beinhaltet das built-in command-line interface (CLI) [18], wird für den Betrieb auf einem shared hosting Webspace nicht benötigt und stellt als zentrales Werkzeug immer ein potenzielles Sicherheitsrisiko dar.

Im Basisverzeichnis sind auch allerhand Dateien. Von diesen werden jedoch für den Betrieb nur folgende Dateien benötigt:

  • .htaccess
  • index.php
  • now.json
  • robots.txt

Abschließend müssen ggf. noch die Dateiberechtigungen [19] angepasst werden. In der Regel sollten als Berechtigungen für Dateien ’0664‘ bzw. ’664‘ ausreichend sein (bei anderen Anbietern muss ggf. mit ’0775‘ bzw. ’775‘ berechtigt werden). Bei Verzeichnissen habe ich festgestellt, dass diese mit ’0775’ bzw. ’775‘ berechtigt werden müssen. Die Berechtigungen für die Dateien und Verzeichnisse können in FileZilla über das Kontextmenü (Klick mit rechter Maustaste auf die Dateien und Verzeichnisse) und dort über den Menüeintrag Dateiberechtigungen... gesetzt werden. Dort können die oben genannten numerischen Werte hinterlegt werden. Weitere Hinweise zu möglichen Problemen bei den Berechtigungen und wie diese gelöst werden können kann der offiziellen Dokumentation zu Grav entnommen werden [20].

Das ist es im Großen und Ganzen. Anpassungen an den PHP-Skripten oder an der htaccess-Datei - wie dies beispielsweise für CakePHP notwendig war, um das Framework unter shared hosting-Bedingungen lauffähig zu bekommen - waren nicht notwendig. Bisher traten bei meiner Webseite auch noch keine Probleme in der shared hosting-Umgebung auf (mit Ausnahme der selbstverursachten). Falls doch Probleme auftreten, widmet die offizielle Dokumentation den gängigsten Problemen ein vollständiges Kapitel [21] und wäre eine erste gute Anlaufstelle. Alternative kann auch der Kontakt mit der Community hilfreich sein, z. B. über das offizielle Forum [22].

Nach erfolgreicher Übertragung und Konfiguration ist Grav einsatzbereit. Lokale Änderungen und Weiterentwicklungen müssten jeweils mittels SFTP manuell übertragen werden. Eine Automatisierung durch Etablierung eines Continuous Integration- (CI) [23] und Continuous Delivery-Prozesses (CD) [24] könnte hier durchaus Handarbeit einsparen und die Übertragung von Änderungen an der Webseite oder das Einspielen von Patches für Grav vereinfachen.

Quellen

[1] Offizielle Webseite des CakePHP Frameworks, Cake Software Foundation, Inc., https://cakephp.org/ (Zugriff am 21. April 2022).

[2] Model-View-Controller Architekturmuster, deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Model_View_Controller (Zugriff am 21. April 2022).

[3] Don’t repeat yourself Konzept, deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Don‘t_repeat_yourself (Zugriff am 21. April 2022).

[4] Konvention vor Konfiguration Softwaredesign-Paradigma, deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Konvention_vor_Konfiguration (Zugriff am 21. April 2022).

[5] Code Generation with Bake, CakePHP 2.x Cookbook der Cake Software Foundation, Inc., https://book.cakephp.org/2/en/console-and-shells/code-generation-with-bake.html (Zugriff am 21. April 2022).

[6] Offizielle Webseite des FFCMS Grav, Grav Projektteam, https://getgrav.org/ (Zugriff am 21. April 2022).

[7] Flat-File-Content-Management-System, deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Flat-File-Content-Management-System (Zugriff am 21. April 2022).

[8] What is Grav?, Offizielle Dokumentation zu Grav, Grav Projektteam, https://learn.getgrav.org/17/basics/what-is-grav (Zugriff am 21. April 2022).

[9] Anforderungen des FFCMS Grav, Offizielle Dokumentation zu Grav, Grav Projektteam, https://learn.getgrav.org/17/basics/requirements (Zugriff am 21. April 2022).

[10] Offizielle Dokumentation zu Grav, Grav Projektteam, https://learn.getgrav.org/ (Zugriff am 21. April 2022).

[11] Guides zur Inbetriebnahme von Grav, Offizielle Dokumentation zu Grav, Grav Projektteam, https://learn.getgrav.org/17/webservers-hosting (Zugriff am 21. April 2022).

[12] Installation von Grav, Offizielle Dokumentation zu Grav, Grav Projektteam, https://learn.getgrav.org/17/basics/installation (Zugriff am 21. April 2022).

[13] Offizielle Webseite des PHP Dependency Managers composer, Composer Projektteam, https://getcomposer.org/ (Zugriff am 21. April 2022).

[14] Offizielle Webseite des FTP-/SFTP-Clients FileZilla, FileZilla Projektteam, https://filezilla-project.org/ (Zugriff am 21. April 2022).

[15] Anleitung zum Einrichten von FileZilla von Strato, FAQ-Beitrag auf strato.de, https://www.strato.de/faq/hosting/so-verbinden-sie-sich-mit-dem-strato-sftp-server/ (Zugriff am 21. April 2022).

[16] FAQ von Strato zu Hosting und Domains, strato.de, https://www.strato.de/faq/ (Zugriff am 21. April 2022).

[17] Beispiel für die Fehleranzeige bei Installations- und Setupproblemen, Offizielle Dokumentation zu Grav, Grav Projektteam, https://learn.getgrav.org/17/basics/installation#installation-setup-proble (Zugriff am 21. April 2022).

[18] Kommandozeile (command-line interface), deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Kommandozeile (Zugriff am 21. April 2022).

[19] Unix-Dateiberechtigungen, deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Unix-Dateirechte (Zugriff am 21. April 2022).

[20] Troubleshooting Permissions, Offizielle Dokumentation zu Grav, Grav Projektteam, https://learn.getgrav.org/17/troubleshooting/permissions (Zugriff am 21. April 2022).

[21] Troubleshooting Kapitel, Offizielle Dokumentation zu Grav, Grav Projektteam, https://learn.getgrav.org/17/troubleshooting (Zugriff am 21. April 2022).

[22] Offizielles Forum zu Grav, Grav Projektteam, https://discourse.getgrav.org/ (Zugriff am 21. April 2022).

[23] Continuous Integration, deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Kontinuierliche_Integration (Zugriff 21. April 2022).

[24] Continuous Delivery, deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Continuous_Delivery (Zugriff 21. April 2022).