← Blog

Ein selbst gehostetes CV mit Astro, SQLite und einem lokalen LLM erstellen

DEENESRUUK

Diese Seite hat eine WordPress-Installation durch etwas schlankeres und vollständig unter meiner Kontrolle stehendes ersetzt: einen einzigen Astro (SSR) Container, SQLite als einzige Quelle der Wahrheit und keine Drittanbieterdienste im Request Path.

Die beweglichen Teile

  • Astro + Node adapter rendern jede öffentliche Seite auf dem Server, wobei der gesamte Lebenslauf von SQLite gespeist wird. Hell-/Dunkelthemen, drei Sprachen (EN/RU/UK) und ein Print-Stylesheet, das gleichzeitig als herunterladbares PDF dient.
  • Passkey-only Admin. Keine Passwörter – WebAuthn mit mehreren Anmeldeinformationen und einem Notfall-CLI, um einen neuen Schlüssel zu registrieren, falls alle verloren gehen.
  • Eine tägliche Pipeline. Ein Cronjob listet meine privaten GitHub-Repositories auf und lässt für diejenigen, die sich geändert haben, ein lokales Gemma-Modell (Ollama) einen kurzen, sachlichen Textentwurf erstellen. Neue Repos landen als unveröffentlichte Entwürfe – nichts Privates wird live geschaltet, bevor ich es manuell veröffentliche.
  • First-party Analytics. Besuche werden geolokalisiert und mit einer lokalen MaxMind-Datenbank (keine externen Aufrufe) nach ASN aufgelöst, zusammen mit einem GDPR-Einverständnisbanner, das GA und den Client Beacon blockiert.

Warum es wichtig ist

Das LLM und die GitHub-Synchronisierung laufen vollständig in einem offline Batch Path – wenn das Modell ausgefallen ist, merkt die Seite nichts davon; sie bedient einfach weiterhin aus SQLite und versucht die Anreicherung am nächsten Tag erneut. Diese Trennung ist der ganze Punkt: Die interessante Automatisierung sitzt niemals zwischen einem Besucher und einer Seite.

Weitere Beiträge über die Infrastruktur dahinter – BGP, Transport, Monitoring – folgen.

Transparenz: Die meisten Beiträge werden mit KI-Unterstützung verfasst, und die nicht-englischen Versionen werden von einem lokalen LLM maschinell übersetzt und anschließend geprüft. Fehler entdeckt? Bitte gib mir Bescheid.