Diese Website
Ein schnelles, komplett statisches Portfolio, gebaut mit Svelte und ausgeliefert von einem winzigen Rust-Webserver in Docker.
Warum
Ich wollte ein Zuhause im Netz, das schnell lädt, leicht erweiterbar ist und das ich komplett selbst in der Hand habe — keine Baukästen, keine Tracker, keine Datenbank.
Und ich wollte kein PHP. Kein WordPress, keine Plugins, die jede Woche Sicherheitsupdates brauchen, kein Admin-Login, das darauf wartet, per Brute Force geknackt zu werden. Ein Großteil des Webs läuft noch auf diesem Stack, und für eine Seite, die sich ein paarmal im Monat ändert, sind das viel zu viele bewegliche Teile. Also habe ich sie so gebaut wie den Rest meiner Software: in Rust, mit so wenig wie möglich auf dem Server.
Wie sie funktioniert
- Inhalte liegen in einfachen Markdown-Dateien. Ein neues Projekt ist eine neue Datei, eines auszublenden eine einzige Zeile.
- SvelteKit rendert beim Build jede Seite zu statischem HTML, der Server erzeugt also nie etwas auf Anfrage.
- Ein kleiner Rust-Server (axum) — unter 300 Zeilen — liefert die Dateien vorkomprimiert mit Brotli/Gzip aus, mit langem Caching für Assets und Sicherheits-Headern bei jeder Antwort.
- Das Docker-Image enthält nichts außer diesem Server und den fertigen Dateien: keine Shell, keinen Paketmanager, keinen Interpreter, und es läuft als unprivilegierter Benutzer mit schreibgeschütztem Dateisystem.
- GitHub Actions prüft und baut bei jedem Push ein neues Image, der Server holt es mit einem einzigen Befehl. Startet die neue Version nicht, wird automatisch zurückgerollt.
- Davor sitzt Caddy für automatisches HTTPS, auf demselben Server wie mein Shop RustCraft.
Zwei Sprachen, keine Bibliothek
Die Seite gibt es auf Englisch und Deutsch, und die Übersetzung ist selbst gebaut statt mit einem i18n-Paket — für eine kleine, komplett statische Seite sind das ein paar Hilfsfunktionen, keine Abhängigkeit.
- Englisch liegt unter
/…, Deutsch unter/de/…. Beides wird vorab gerendert, jede Sprache ist also einfach mehr statisches HTML. - Eine deutsche Seite ist eine Markdown-Datei neben der englischen (
.de.md). Gibt es noch keine Übersetzung, wird die englische Version angezeigt. - Die Texte der Oberfläche — Buttons, Menüs, Footer — stehen in einem typisierten Objekt pro Sprache. Fehlt eine Übersetzung, gibt es einen Typfehler statt einer Lücke auf der Seite.
- Browser mit deutscher Spracheinstellung bekommen automatisch die deutschen Seiten. Der Umschalter im Header führt zur selben Seite in der anderen Sprache und merkt sich deine Wahl.
Datenschutz von Anfang an
Keine Cookies, keine Analyse, keine Werbung und keine Anfragen an Dritte — Schriften, Bilder und Skripte kommen alle von meinem eigenen Server. Deshalb gibt es auch keinen Cookie-Banner: Es gibt nichts, dem man zustimmen müsste.