Was ist das?
Dieses Portfolio selbst. Eine statisch generierte Website mit Astro, die meine Projekte und Blogposts präsentiert. Kein CMS, kein Framework-Overhead — nur MDX-Dateien, die zum Build-Zeitpunkt zu HTML kompiliert werden.
Die Seite läuft auf einem Hetzner-VPS hinter Nginx und WireGuard-VPN , mit automatischem Deployment per GitHub Actions . Während der Entwicklung ist sie nur über VPN erreichbar.
Architektur
- Static Site Generation mit Astro 5 — alle Seiten werden zum Build-Zeitpunkt erzeugt. Kein Node.js-Prozess auf dem Server, kein Datenbankzugriff, minimale Angriffsfläche.
- Content Collections für Blog und Projekte — typsicheres Frontmatter mit Zod-Validierung, MDX für interaktive Komponenten wie Glossar-Referenzen.
- Glossar-System — zentrale Definitionen in TypeScript, die per
<Term>-Komponente in jedem Artikel referenziert werden. Desktop: Sidebar, Mobile: Dialog. - Floating Toolbar — Theme-Toggle (Dark/Light), Akzentfarb-Picker (HSL-Ring), Glossar-Button. Expandiert per Klick, schließt bei Klick außerhalb.
- QR-Code Generator — interaktives Tool unter
/qr-generator, das komplett clientseitig läuft.
Infrastruktur
Zwei Hetzner-Server, verbunden über ein privates Netzwerk (10.0.0.0/16):
- Portfolio-Server — Nginx als Reverse Proxy , Let’s Encrypt für TLS, liefert statische Dateien aus
/var/www/mathis-adler.dev/dist/ - WireGuard-Server — VPN-Endpunkt für Split-Tunnel-Zugang, dnsmasq für DNS-Overrides im VPN
Die Trennung in zwei Server isoliert den VPN-Dienst vom Webserver. Clients im VPN erreichen die Services über interne IPs, während der öffentliche Zugang per Nginx gesteuert wird.
Deployment
Push auf main löst einen GitHub Actions Workflow aus:
npm ci && npm run build— Astro kompiliert alle MDX-Dateien zu statischem HTMLrsync --delete dist/— nur geänderte Dateien werden übertragen- Nginx liefert sofort die neuen Dateien aus — kein Neustart nötig
Was ich gelernt habe
- Astro’s Content Collections mit Zod-Validierung fangen Frontmatter-Fehler zur Build-Zeit ab — kein “undefined” in Produktion.
- MDX erlaubt Astro-Komponenten in Markdown. Das Glossar-System wäre ohne
<Term>als MDX-Komponente deutlich umständlicher. - Ein statisches Portfolio hat fast keine Angriffsfläche. Die Sicherheitsarbeit steckt in der Infrastruktur (Nginx-Hardening, VPN, SSH), nicht im Anwendungscode.