Projekt Ideenschmiede: Der technische Deep Dive in mein HomeLab-Setup

Vom nackten Server zum fertigen Blog: Warum ich mich gegen Docker und für den „Hard Way“ entschieden habe, um mein HomeLab wirklich zu verstehen.

Projekt Ideenschmiede: Der technische Deep Dive in mein HomeLab-Setup
Hetzner Cloud Console als Fenster auf meinen neuen Cloud-Server

Warum einfach, wenn es auch lehrreich geht?

Vor ein paar Wochen stand ich vor der Wahl: Klicke ich mir für einige Euro im Monat einen fertigen Blog zusammen, oder springe ich ins kalte Wasser? Ich bin kein Profi-Admin, ich bin ein Entdecker. Die „Ideenschmiede“ sollte ihrem Namen gerecht werden – ein Ort, an dem ich Technik von Grund auf selbst forme.

Das „German Dream Team“: Warum Hetzner & ALL-INKL?

Bei der Wahl meiner Partner gab es keine Kompromisse. Ich wollte volle Kontrolle über meine Daten und einen Standort, der nicht in Übersee liegt.

  • Hetzner (Die Cloud-Power): Ein deutsches Familienunternehmen mit Rechenzentren in Deutschland (und Finnland). Die Performance ist top, der Preis fair und – am wichtigsten – wir bewegen uns hier im sicheren Hafen der DSGVO. Keine US-Behörden, die mal eben in meinen Server schauen dürfen (Stichwort: Cloud Act).
  • ALL-INKL (Die Mail-Bastion): Für meine E-Mails und die DNS-Verwaltung vertraue ich auf die Sachsen von ALL-INKL. Warum? Weil der Support dort noch echte Menschen sind, die Technik verstehen, und die Infrastruktur seit Jahrzehnten wie ein Uhrwerk läuft.

Das Ergebnis: Mein Blog atmet deutsche Wertarbeit. Die Daten meiner Leser bleiben hier, und ich unterstütze europäische Infrastruktur statt Silicon-Valley-Monopole.

Warum Ghost? (Die Wahl des Werkzeugs)

Bevor wir zu den Innereien des Servers kommen: Warum ausgerechnet Ghost? In der Blogger-Welt ist WordPress der Platzhirsch, aber für die Ideenschmiede wollte ich etwas anderes.

  • Fokus auf das Wesentliche: Ghost ist keine eierlegende Wollmilchsau. Es ist eine reine Publishing-Plattform. Kein unnötiger Ballast, kein Plugin-Wahnsinn – einfach nur ein exzellenter Editor und rasend schnelle Performance.
  • Moderne Technik (Node.js): Während WordPress auf PHP setzt, basiert Ghost auf Node.js. Das ist modern, effizient und passt perfekt in mein Lernprofil als Entwickler.
  • Developer-First: Die Unterstützung für Markdown, saubere Code-Snippets und die einfache Theme-Anpassung machen es zum Liebling der Tech-Szene. Es fühlt sich einfach "richtig" an, hier über Code zu schreiben.
Die Philosophie: Warum kein Docker?

Obwohl Docker vieles vereinfacht, habe ich mich bewusst dagegen entschieden. Ich wollte keine „Blackbox“. Ich wollte wissen:

  • Wo liegen die Nginx-Configs?
  • Wie legt MySQL Tabellen an?
  • Wie startet Node.js die App?

Nur wer die Zahnräder sieht, kann sie reparieren, wenn es mal hakt.

Phase 1: Die DNS-Architektur (Wer zeigt wohin?)

Bevor der Server glüht, muss die Domain wissen, wo sie zu Hause ist. Da mein Blog bei Hetzner liegt, meine E-Mails aber bei ALL-INKL bleiben sollen, war Präzision gefragt.

Im ALL-INKL KAS habe ich folgende Weichen gestellt:

  • A-Record: Zeigt auf die IP meines Hetzner-Servers (das „Navigationssystem“ für Besucher).
  • MX-Record: Bleibt auf kasserver.com (damit die Post weiterhin bei ALL-INKL ankommt).
  • SPF-Eintrag (TXT): v=spf1 include:_spf.kasserver.com ~all – quasi der digitale Ausweis, damit meine Mails nicht im Spam landen.
DNS-Einstellungen bearbeiten
Phase 2: Linux-Initialisation & Server-Härtung

Nach dem Klick in der Hetzner Cloud Console starrte mich ein schwarzes Fenster an. Ubuntu 24.04 LTS war installiert, aber noch völlig „nackt“.

1. SSH-Keys statt Passwörter

Passwort-Logins sind im Netz wie eine Einladung für Bots. Die Lösung: SSH-Keys. Ich habe lokal einen ed25519-Schlüssel generiert und den öffentlichen Teil auf den Server geschoben.

Explorer-Anekdote: In der Hetzner-Konsole war das US-Tastaturlayout aktiv. Wer schon mal die Tilde (~) gesucht hat, weiß: Das ist das erste Level im Admin-Training (Tipp: Shift + Ö!).

2. Updates & Sicherheit

Zuerst bringen wir das System auf Stand:

Bash

# Aktualisiert die Liste der verfügbaren Pakete
sudo apt update 

# Installiert die neuesten Versionen (-y bestätigt automatisch)
sudo apt upgrade -y 

Danach habe ich den Root-Login deaktiviert und arbeite nur noch über einen Benutzer, den ich angelegt habe.

Explorer-Update: Windows-Troubleshooting Wenn Windows trotz Key ständig nach dem Passwort fragt, braucht es den OpenSSH Authentication Agent. Sucht in den Windows-Diensten danach, stellt ihn auf „Automatisch“ und startet ihn. Mit ssh-add in der CMD registriert ihr euren Key. Erst dann zeigt Windows dem Server automatisch den „richtigen Ausweis“.

3. Die Firewall (UFW)

Zusätzlich zur Software-Firewall nutze ich die Hardware-Firewall von Hetzner. Erlaubt sind nur die Ports 22 (SSH), 80 (HTTP) und 443 (HTTPS).

Hetzner Firewalleinstellungen
Phase 3: Die manuelle Ghost-Installation

Hier wird es ernst. Ghost braucht ein exakt abgestimmtes Ökosystem.

  1. MySQL 8: Die Datenbank für alle Texte.
  2. Node.js 22: Der Motor. Ghost v6 verlangt zwingend Version 22.
  3. Ghost-CLI: Das Werkzeug, das alles zusammenfügt.

Bash

# Ghost-CLI installieren
sudo npm install -g ghost-cli@latest

# Verzeichnis erstellen und Rechte an den User 'meinuser' geben
sudo mkdir -p /var/www/meinblog.de
sudo chown meinuser:meinuser /var/www/meinblog.de
cd /var/www/meinblog.de

# Die eigentliche Installation starten
ghost install
Phase 4: Die Privacy-Festung

Datenschutz ist kein Feature, sondern Pflicht. In der /etc/nginx/nginx.conf habe ich eine Maskierung eingebaut, damit keine vollständigen IPs in meinen Logs landen:

Nginx

# IP-Maskierung in der http-Sektion
map $remote_addr $remote_addr_anon {
    # Nimmt die ersten drei Blöcke einer IPv4 und setzt eine .0 dahinter
    ~(?P<ip>\d+\.\d+\.\d+)\.    $ip.0;
    # Kürzt IPv6-Adressen radikal
    ~(?P<ip>[^:]+:[^:]+:[^:]+): $ip::;
    default                     0.0.0.0;
}

Zusätzlich ist das Ghost-Portal deaktiviert, um unnötige Tracking-Scripte zu vermeiden.

Ghost-Portal
Phase 5: Das SMTP-Setup (Post aus der Schmiede)

Damit der Blog E-Mails (z.B. für Admins) versenden kann, nutze ich den Relay von ALL-INKL via Port 587. Das wird in der config.production.json hinterlegt.

Phase 6: Rechtssicherheit & AV-Verträge

In Deutschland müssen wir die Zusammenarbeit mit Hostern vertraglich regeln (Art. 28 DSGVO). Sowohl bei Hetzner als auch bei ALL-INKL lässt sich der Auftragsverarbeitungsvertrag (AVV) bequem digital im Kundenmenü abschließen. Dank Autorenglück bleibt zudem meine Privatadresse im Impressum geschützt.

Auftragsverarbeitungsvertrag bei Hetzner
Phase 7: Die wöchentliche Wartung

Ein Server ist wie ein Auto: Er braucht Pflege.

  1. Das Sicherheitsnetz (Snapshot): Bevor ich Updates mache, erstelle ich in der Hetzner Console einen Snapshot. Zerschießt ein Update das System, bin ich in Sekunden wieder auf dem alten Stand.+2
  2. System-Updates: Standard-Protokoll via SSH (apt update && apt upgrade).
Snapshots auf dem Hetzner-Server

Ghost-Updates:

Bash

# Erst das Tool aktualisieren
sudo npm install -g ghost-cli@latest
# Dann den Blog selbst
ghost update
Mentor-Tipp: Keine Angst vor Updates! Ghost prüft vorab, ob alles kompatibel ist, und bricht im Zweifel ab, bevor etwas kaputtgeht.
Phase 8: Lokale Schriften (Bye Google!)

Standard-Themes laden Schriften oft direkt von Google-Servern – ein Datenschutz-Loch. Die Lösung ist Self-Hosting:

  1. Fonts via .woff2 herunterladen.
  2. Per SFTP in das assets/fonts-Verzeichnis deines Themes schieben.
  3. Per CSS einbinden.

Dadurch bleibt der Traffic „im Haus“ und keine Daten fließen ungefragt in die USA.

Phase 9: SSL & der „Explorer-Fail“

Ohne HTTPS (das kleine Schloss) geht heute nichts mehr. Ghost nutzt dafür „Let’s Encrypt“.

Mein Fehler: Die Installation brach beim SSL-Teil immer ab. Die Ursache: Let’s Encrypt schickt eine Test-Anfrage über Port 80 (HTTP). Da meine Hetzner-Firewall diesen Port blockiert hatte, blieb die Tür zu. Die Lösung: Port 80 in der Firewall kurz öffnen, ghost setup ssl ausführen, fertig.

Wichtig: Schließe Port 80 niemals dauerhaft! Ghost braucht ihn alle 60 Tage, um das Zertifikat automatisch zu erneuern.

Fazit: Die Werkbank steht!

Der Verzicht auf Docker war anstrengend, aber goldrichtig. Ich weiß jetzt, wie Berechtigungen funktionieren, wie wichtig Wartung ist und wie mächtig ein Hetzner VPS sein kann.

Die Infrastruktur steht. Jetzt wird es Zeit, die ersten Zeilen Python zu schmieden!

Rechtliche Hinweise | Datenschutz

Built with by Eike in the HomeLab.
Visuals supported by Google Gemini