Von WordPress auf Hugo: Mein Weg zu einer deutlich einfacheren Website auf Azure

Viele Jahre lief meine private Website auf einer WordPress-Installation aus dem Azure Marketplace.

Die Lösung funktionierte grundsätzlich zuverlässig. Allerdings stellte ich irgendwann fest, dass der Aufwand für Betrieb und Wartung in keinem Verhältnis mehr zu meinem tatsächlichen Nutzungsverhalten stand.

Ich veröffentliche in der Regel nur wenige Artikel pro Jahr. Trotzdem musste ich mich regelmäßig mit Themen beschäftigen wie:

  • Linux-Updates
  • WordPress-Core-Updates
  • Plugin-Updates
  • Sicherheitsupdates
  • Datenbank-Backups
  • Azure VM-Wartung
  • SSL-Zertifikate
  • Überwachung und Absicherung des Systems

Für eine aktiv gepflegte Website oder einen Online-Shop ist das völlig normal. Für einen privaten Blog mit wenigen Beiträgen pro Jahr fühlte es sich jedoch zunehmend überdimensioniert an.

Die zentrale Frage

Irgendwann stellte ich mir eine einfache Frage:

Warum betreibe ich eigentlich einen kompletten Linux-Server mit MySQL, PHP und WordPress, wenn ich hauptsächlich statische Inhalte veröffentliche?

Die Antwort war ernüchternd:

Eigentlich gab es keinen technischen Grund mehr dafür.

Meine Website bestand fast ausschließlich aus:

  • Blogartikeln
  • Bildern
  • Kategorien
  • Tags

Es gab keine dynamischen Anwendungen, keine komplexen Formulare und keine speziellen Plugins, auf die ich zwingend angewiesen war.

Auf der Suche nach einer Alternative

Bei meiner Recherche stieß ich auf sogenannte Static Site Generatoren.

Die bekanntesten Vertreter sind:

  • Hugo
  • Jekyll
  • Astro

Entschieden habe ich mich für Hugo.

Ausschlaggebend waren:

  • sehr schnelle Build-Zeiten
  • einfache Installation
  • Markdown als Eingabeformat
  • große Community
  • zahlreiche Themes
  • einfache Hosting-Möglichkeiten

Der größte Vorteil:

Am Ende entstehen ausschließlich statische Dateien.

Keine Datenbank.

Kein PHP.

Kein laufender Anwendungsserver.

Migration der Inhalte

Der erste Schritt bestand darin, alle Inhalte aus WordPress zu exportieren.

Dafür nutzte ich den integrierten WordPress-Export unter:

Werkzeuge → Daten exportieren

Zusätzlich sicherte ich sämtliche Bilder aus dem Verzeichnis:

wp-content/uploads

Anschließend wurden die Inhalte in Hugo übernommen.

Die Bilder wanderten in die Hugo-Verzeichnisstruktur und konnten größtenteils ohne größere Anpassungen weiterverwendet werden.

Die ersten Erfahrungen mit Hugo

Der Einstieg verlief nicht vollständig reibungslos.

Insbesondere die Theme-Integration erforderte etwas Fehlersuche.

Anfangs meldete Hugo beispielsweise:

found no layout file for kind home

Die Ursache war letztlich schnell gefunden:

Das Theme war nicht korrekt eingebunden.

Nachdem das behoben war, erzeugte Hugo automatisch:

  • die Startseite
  • Beitragsübersichten
  • Kategorien
  • Tags
  • RSS-Feeds

ohne dass zusätzliche Entwicklung erforderlich war.

Warum ich auf GitHub und CI/CD verzichtet habe

Viele moderne Anleitungen empfehlen folgenden Aufbau:

Hugo
+
GitHub
+
CI/CD
+
Azure Static Web Apps

Für professionelle Projekte ist das durchaus sinnvoll.

Für meinen privaten Blog erschien es jedoch unnötig komplex.

Ich veröffentliche nur wenige Male pro Jahr einen neuen Artikel.

Daher wollte ich den einfachsten möglichen Veröffentlichungsprozess.

Meine finale Architektur

Am Ende fiel die Entscheidung auf folgende Architektur:

Markdown
Hugo
HTML-Dateien
Azure Storage Static Website
Azure Front Door
www.richardts.com

Die gesamte Infrastruktur besteht heute aus:

  • Hugo
  • Azure Storage Account
  • Azure Front Door

Mehr wird nicht benötigt.

Azure Storage Static Website

Azure Storage bietet die Möglichkeit, statische Websites direkt aus einem Blob Container auszuliefern.

Nach Aktivierung der Funktion wird automatisch ein Container namens:

$web

angelegt.

Die Veröffentlichung besteht daher nur noch aus zwei Schritten:

Website generieren:

hugo

Anschließend den Inhalt des Verzeichnisses:

public

in den Container:

$web

hochladen.

Fertig.

Die unerwartete Herausforderung: SSL

Während der Migration stellte sich heraus, dass Azure Storage zwar automatisch eine HTTPS-Adresse bereitstellt:

https://myblogstatichugo.z6.web.core.windows.net

eine eigene Domain jedoch eine zusätzliche Lösung benötigt.

Mein Ziel war:

https://www.richardts.com

mit gültigem Zertifikat.

Die Lösung: Azure Front Door

Für die SSL-Terminierung und die Verwendung einer eigenen Domain habe ich Azure Front Door eingesetzt.

Die finale Architektur sieht damit so aus:

www.richardts.com
Azure Front Door
Azure Storage Static Website

Azure Front Door übernimmt:

  • SSL/TLS
  • Zertifikatsverwaltung
  • globale Auslieferung
  • Performanceoptimierungen

Besonders angenehm:

Das SSL-Zertifikat wird vollständig von Microsoft verwaltet und automatisch verlängert.

DNS-Konfiguration

Meine Domain wird bei Strato verwaltet.

Für die Einrichtung waren letztlich zwei Schritte erforderlich.

www.richardts.com

Die Subdomain verweist per CNAME auf den Azure Front Door Endpoint:

www.richardts.com
<mein-frontdoor-endpoint>.azurefd.net

richardts.com

Die Hauptdomain wird dauerhaft weitergeleitet:

https://richardts.com
301 Redirect
https://www.richardts.com

Dadurch existiert nur eine öffentliche URL für die gesamte Website.

Vorteile der neuen Lösung

Der Unterschied zur ursprünglichen WordPress-Lösung ist deutlich.

Früher

Azure VM
Linux
PHP
MySQL
WordPress
Plugins

Heute

Markdown
Hugo
Azure Storage
Azure Front Door

Vorteile im Alltag

Geringere Kosten

Keine virtuelle Maschine.

Keine Datenbank.

Keine laufenden Serverprozesse.

Weniger Wartungsaufwand

Keine Linux-Patches.

Keine WordPress-Updates.

Keine Plugin-Updates.

Bessere Sicherheit

Es gibt:

  • keine Login-Seite
  • kein PHP
  • keine Datenbank
  • keine Plugins

Viele klassische Angriffsflächen verschwinden dadurch vollständig.

Höhere Performance

Da alle Seiten bereits als HTML-Dateien vorliegen, muss nichts dynamisch erzeugt werden.

Die Inhalte werden direkt ausgeliefert.

Mein neuer Veröffentlichungsprozess

Einen neuen Beitrag anzulegen ist heute denkbar einfach.

Neuen Artikel erstellen:

hugo new posts/mein-neuer-artikel/index.md

Lokal testen:

hugo server

Website erzeugen:

hugo

Anschließend die Dateien aus:

public

nach Azure Storage hochladen.

Mehr ist nicht erforderlich.

Fazit

WordPress bleibt für viele Szenarien eine hervorragende Lösung.

Für meinen persönlichen Blog war die Plattform jedoch längst größer geworden als die eigentliche Aufgabe.

Mit Hugo, Azure Storage Static Website und Azure Front Door habe ich heute genau das, was ich ursprünglich gesucht habe:

  • minimale Betriebskosten
  • kaum Wartungsaufwand
  • hohe Sicherheit
  • sehr gute Performance
  • volle Kontrolle über die Inhalte

Vor allem aber muss ich mich wieder auf das konzentrieren, worum es ursprünglich ging:

Artikel schreiben statt Server administrieren.