Meine Website neu gebaut
Von Cloudflare zu Self-Hosted mit KI
- ai
- astro
- cloudflare
- hetzner
- rust
Nach über einem Jahr auf Cloudflare’s Edge-Infrastruktur habe ich meine persönliche Website komplett neu geschrieben und auf einen eigenen Server umgezogen.
Warum der Umbau?
Datenhoheit (DSGVO): Mit Cloudflare Workers und D1 lagen meine Daten global verteilt. Auf einem deutschen Hetzner VPS habe ich volle Kontrolle über den Speicherort.
Komplexität: Die alte Architektur bestand aus SvelteKit für das Frontend, Cloudflare Pages fürs Hosting, zwei separaten Workers (Signaturen und Analytics) und D1 als Datenbank. Viele bewegliche Teile für eine persönliche Website.
Kosten: Cloudflare’s Free-Tier ist großzügig, aber ich näherte mich den D1-Limits. Ein Hetzner VPS für 4 EUR/Monat bietet mehr Ressourcen bei planbaren Kosten.
Lernen: Ich wollte meine Rust-Backend-Kenntnisse vertiefen und Astro’s Content-Ansatz ausprobieren.
Alte Architektur
SvelteKit Frontend
└── Cloudflare Pages
└── PostHog Analytics (Third-Party)
Cloudflare Worker: signatures-rs (Rust)
└── D1 Database (Signaturen, Nutzer)
Cloudflare Worker: analytics-rs (Rust)
└── D1 Database (Events, Sessions)
Funktionierte, aber Debugging über mehrere Workers war mühsam, und die Cold-Start-Zeiten bei Rust Workers spürbar.
Neue Architektur
Astro Frontend (mit Svelte Islands)
└── Docker Container
└── Eigener Analytics-Client
Rust API (Axum)
└── Docker Container
└── SQLite (WAL-Modus)
└── In-Memory Signatur-Cache
Caddy
└── Automatisches HTTPS
└── Reverse Proxy
Hetzner VPS (4 EUR/Monat)
└── Docker Compose
└── CrowdSec für Sicherheit
Alles läuft auf einem einzigen VPS. Das Astro-Frontend macht serverseitige API-Calls an das Rust-Backend, clientseitiges JavaScript übernimmt Tracking und interaktive Features.
KI-gestützte Entwicklung
Der Umbau lief fast vollständig mit Claude Code. Was gut funktioniert hat:
Schema-Migrationen: Claude hat D1-Schemas nach SQLite übersetzt, den Datenexport/-import übernommen und Spaltentypen angepasst.
Inkrementeller Fortschritt: Wir haben in fokussierten Sessions gearbeitet — erst die Backend-API, dann der Frontend-Port, dann die Analytics-Migration. Dass die KI den Kontext über eine komplexe Codebasis halten konnte, war extrem wertvoll.
Debugging: Als das Signatur-Karussell nicht korrekt lud, hat Claude den SSR-Datenfluss durchgearbeitet und gefunden, wo Props nicht weitergereicht wurden.
Was weniger gut lief:
Over-Engineering: Die KI schlug manchmal mehr Abstraktion vor als nötig. Ich musste explizit einfachere Lösungen einfordern.
Kontextlimits: Sehr lange Sessions verloren manchmal wichtigen Kontext. Neue Sessions mit klarer Zusammenfassung halfen.
Technische Entscheidungen
Warum Astro? Content Collections und MDX-Support sind perfekt für einen Blog. Die Island-Architektur erlaubt Svelte für interaktive Komponenten (Signatur-Editor, Karussell) bei ansonsten statischen Seiten.
Warum Rust? Typsicherheit, Performance und das Axum-Framework. SQLx bietet Compile-Time-geprüfte Queries. Das resultierende Binary ist winzig und startet sofort.
Warum SQLite? Für eine persönliche Website mit wenig Traffic bewältigt SQLite im WAL-Modus gleichzeitige Lese-/Schreibzugriffe problemlos. Single-File-Backups, kein Datenbankserver, schnelle Queries.
Herausforderungen
PostHog-Migration: 15.000 Events aus PostHog exportieren und für SQLite umformatieren erforderte sorgfältiges Timestamp-Handling und Session-Rekonstruktion.
Signatur-Caching: Der In-Memory-Cache brauchte durchdachte Invalidierungslogik. Wird eine Signatur freigegeben, abgelehnt oder bearbeitet, muss der Cache korrekt aktualisiert werden — ohne vollständigen Reload.
Session-Management: Anonymes Session-Tracking ohne Cookies erfordert stabile Client-seitige Session-IDs und die Behandlung von Sessions, die aus mehreren Quellen entstehen (Page View vs. Signatur-Speichern).
Ergebnis
Die Migration hat etwa zwei Wochen Abendarbeit gedauert:
- Einfacher: Eine Codebasis, eine Datenbank, ein Server
- Schneller: Keine Cold Starts, API-Antworten unter 50ms
- Günstiger: 4 EUR/Monat statt Paid-Tier-Annäherung
- Privat: Alle Daten auf deutschen Servern
- Wartbar: Standard-Docker-Deployment, einfache Backups
Fazit
- Edge ist nicht immer besser: Für eine persönliche Website schlägt ein einfacher VPS verteilte Infrastruktur.
- KI-Unterstützung ist transformativ: Claude Code hat ~80% der Routinearbeit übernommen.
- Einfach anfangen: Ein Rust-API mit SQLite reicht für die meisten Anwendungsfälle.
- Daten selbst hosten: Self-Hosting bedeutet volle Kontrolle. Kein Third-Party-Analytics, kein Vendor Lock-in.