Die alte Vereinswebsite des TC Blau-Weiß Attendorn lief auf WordPress, und sie lief in dem Sinne, dass die Seite irgendwie noch erreichbar war. Sie lud langsam, wollte ständig Plugin-Updates, hatte einen unklaren Sicherheitsstatus, und niemand im Vorstand hatte Lust, sich um PHP-Versionen, Datenbank-Backups und das nächste „Update verfügbar"-Banner zu kümmern. Gleichzeitig sollten zwei Dinge gleichzeitig wahr sein: nicht-technische Vorstandsmitglieder mussten Inhalte selbst pflegen können — Aktuelles, Mannschaften, Termine — und das Hosting durfte nichts kosten und nichts kaputtgehen, wenn niemand ein halbes Jahr hinschaut. Die offensichtliche Antwort war ein Static-Site-Generator plus ein Headless-CMS, das im Browser läuft. Konkret: Hugo + DecapCMS auf Cloudflare Pages.

Anforderungen

Die Wunschliste aus Vereinssicht war pragmatisch und ziemlich klar:

  • Vorstand editiert Inhalte ohne Tech-Hilfe, ohne FTP, ohne SSH.
  • Bilder hochladen für Galerie und Aktuelles muss in zwei Klicks gehen.
  • Schnelle Ladezeiten auch auf dem Handy auf dem Tennisplatz.
  • Kein Server, keine PHP-Updates, keine Plugin-Maintenance.
  • Hosting-Budget: 0 Euro.
  • Vereinsfarben Blau und Weiß, klares Layout.
  • Responsive für Smartphone, Tablet, Desktop.

Inhaltlich gibt es sieben editierbare Bereiche, die regelmäßig angefasst werden: aktuelles (News-Posts), mannschaften (sieben aktive Teams), training (Trainer und Zeiten), termine (Medenspiele und Events), verein (Vorstand, Historie, Mitgliedschaft), galerie und die rechtlichen seiten (Impressum, Datenschutz). Genau diese Bereiche müssen ohne Markdown-Kenntnisse erreichbar sein.

Warum Hugo + DecapCMS + Cloudflare Pages

Hugo rendert die ganze Seite in unter einer Sekunde, hat eine sehr einfache Markdown-first-Logik und liefert mit hugo server eine lokale Live-Vorschau, die Änderungen sofort zeigt. Templates sind reines Go-HTML, keine Build-Pipeline, kein Webpack.

DecapCMS ist Git-basiert: Jede Änderung im Admin-UI wird ein Commit auf GitHub. Das heißt: vollständige Versionierung, kein eigenes Datenbank-Backup nötig, und technische Editoren können dieselben Inhalte direkt im Repo bearbeiten. Die Admin-UI ist eine statische Seite unter /admin/ mit GitHub-OAuth-Login. Die Collection-Definitionen leben in static/admin/config.yml:

collections:
  - name: "aktuelles"
    label: "Aktuelles"
    folder: "content/aktuelles"
    create: true
    fields:
      - { label: "Titel", name: "title", widget: "string" }
      - { label: "Datum", name: "date", widget: "datetime" }
      - { label: "Beschreibung", name: "description", widget: "text" }
      - { label: "Bild", name: "image", widget: "image", required: false }
      - { label: "Inhalt", name: "body", widget: "markdown" }

Damit bekommt der Vorstand für jede News ein Formular mit beschrifteten Feldern: „Titel", „Datum", „Bild" — keine YAML-Frontmatter-Diskussion mehr.

Cloudflare Pages liefert das Ganze: Free Tier, globales CDN, automatisches HTTPS und ein Build, der durch jeden git push auf main getriggert wird. Kein eigener Server, keine Skalierungs-Frage, keine TLS-Renewal-Erinnerung.

Die Hugo-Konfiguration selbst ist bewusst klein gehalten — Vereinsdaten als Site-Params, damit Templates sie zentral lesen können:

baseURL = "https://tc-bw-attendorn.de/"
languageCode = "de"
title = "Tennisclub Blau-Weiss Attendorn e.V."

[params]
  tagline = "Tennis an der Burg Schnellenberg"
  founded = "1931"
  courtbookingURL = "https://tc-bw-attendorn.courtbooking.de/login?standard=true"

Migration in Schritten

Der Ablauf war linear: zuerst eine Inhalts-Inventur (WordPress-Export gezogen, Bilder gesichert, alte Texte sortiert). Dann Hugo-Templates aufgesetzt, bewusst ohne Standard-Theme wie PaperMod, weil die Seite ein eigenes, vereinstypisches Layout in Blau/Weiß bekommen sollte; eigene layouts/ und ein einzelnes static/css/main.css reichen dafür. Anschließend Content-Collections in DecapCMS konfiguriert für Mannschaften, Aktuelles, Termine, Training, Galerie und die Startseite. DNS-Umzug auf Cloudflare lief parallel — die neue Seite wurde unter Subdomain getestet, dann auf den A/CNAME-Eintrag der Hauptdomain umgeschaltet.

Vergleichstabelle alt vs. neu

Aspekt Alte WordPress-Seite Neue Static-Lösung
Ladezeit mehrere Sekunden < 1 s (CDN-Edge)
Hosting-Kosten ~10–15 €/Monat 0 €/Monat (Cloudflare Free)
Sicherheits-Patches manuell, regelmäßig nötig nicht nötig (kein Server)
Editieren nur Admin-Login mit Passwort Markdown im Repo oder DecapCMS-UI im Browser
Backup Plugin-Backup, manuell Git-History (jeder Commit ist ein Backup)

Fazit

Die neue Seite läuft seit der Umstellung wartungsfrei: tc-bw-attendorn.de. Quellcode öffentlich auf github.com/ElGarno/tcbw-homepage. Siehe auch den kommenden Post zur iPad-Getränkebuchung im selben Verein — gleicher Stack-Gedanke, anderer Use Case.