Ursprünglich war mein Blog-Setup als reines IPv6-Projekt über WireGuard geplant, da das Ganze auf einem Homeserver betrieben wird (kostenlose IPv6-Adressen bekommt man übrigens bei route64.org). Um die Erreichbarkeit zu erhöhen, habe ich nun einen externen IPv4-Proxy dazugeholt (Danke @Larvitz).
Dabei gab es jedoch sofort SSL-Probleme: Da ursprünglich sowohl der A wie auch der AAAA Record über den Proxy liefen, schlug die Let's Encrypt-Validierung auf meinem Server fehl.
Die Lösung: Der „IPv6-Hack“
Die Lösung war, den AAAA-Eintrag explizit direkt auf die WireGuard-IP meines Servers zu richten, anstatt ihn ebenfalls über den Proxy zu leiten.
- Domain:
blog.burningboard.org
- A-Record (Proxy):
194.28.98.217
- AAAA-Record (Server):
2a11:6c7:f05:a8::2 (WireGuard)
Durch diesen direkten AAAA-Eintrag auf meine WireGuard-IP erreicht Let’s Encrypt meinen Server weiterhin direkt via IPv6 (da der AAAA-Record standardmäßig priorisiert wird) und stellt das SSL-Zertifikat aus. Der IPv4-Traffic wird vom Proxy verschlüsselt an mich weitergereicht.
Die finale Konfiguration
Damit die Kommunikation reibungslos klappt, mussten wir die Caddy-Server anpassen:
1. Auf meinem Server (NixOS, blog.nix)
Damit die echten Besucher-IPs korrekt ankommen und nicht durch die IP des Proxys überschrieben werden, muss dieser als vertrauenswürdig markiert werden:
services.caddy.globalConfig = ''
servers {
trusted_proxies static 2a06:9801:1c:1000::10
}
'';
2. Auf dem externen Proxy (Caddy)
Damit der Proxy meinen Server korrekt per HTTPS anspricht, muss er den Hostnamen (SNI) mitschicken:
reverse_proxy [https://[2a11:6c7:f05:a8::2]:443](https://[2a11:6c7:f05:a8::2]:443) {
header_up Host {host}
transport http {
tls_server_name blog.burningboard.org
}
}
Der Blog ist jetzt über IPv4 und IPv6 erreichbar, sicher verschlüsselt und meine Heim-IP bleibt trotzdem privat! 🚀
Das Wichtigste vorab: Die gewohnten Markdown-Dateien bleiben die Basis – ich bin einfach ein großer Fan dieser unkomplizierten Lösung. Aber unter der Haube hat sich viel getan:
Ich habe einiges am Setup geschraubt:
📂 MD-Files: Die Blog-Struktur bleibt simpel auf Markdown-Basis.
🌍 Globaler als je zuvor: Mein Blog unterstützt jetzt Übersetzungen in 43 Sprachen. Ja, inklusive Klingonisch! 🖖 (Qapla'!)

Geplant war eine vollautomatische Echtzeit-Übersetzung basierend auf der Browser-Spracherkennung. Spoiler: Es hat nur teilweise funktioniert. Man merkt: Die KI ist beeindruckend, aber noch nicht ganz "da", wo wir sie gerne hätten.
Die Lösung: Ich übersetze jetzt einfach jeden Beitrag vorab in alle festgelegten Sprachen, was auch deutlich besser für die Suchmaschinen (SEO) ist. Falls die automatische Erkennung mal nicht greift, könnt ihr über das Weltkugel-Icon eure bevorzugte Sprache manuell festlegen, die dann ganz unkompliziert via Cookie gespeichert wird.
Die Übersetzungen werden nun mit Gemini 3 Flash durchgeführt, was erstaunlich gute Ergebnisse liefert. Allerdings sollte man der KI genau auf die Finger schauen: Im ersten Bulk-Durchgang wurden fälschlicherweise auch die Tags mitübersetzt, was so natürlich nicht geplant war.
Der Code ist weiterhin verfügbar (schreibt mir bei Interesse einfach eine Nachricht) 👍 Beachtet aber, dass das System jetzt einen eigenen Gemini API Key 🔑 benötigt.
Ich habe kurzerhand meinen Blog von WriteFreely auf eine Eigenentwicklung umgestellt: MD-Blog (das MD steht natürlich für Markdown). Der Auslöser war ein fehlgeschlagenes Update des alten Systems – am Ende war es aber der perfekte Anstoß, um alles radikal zu vereinfachen und die volle Kontrolle über das Design zu gewinnen.
Das Herzstück sind einfache Markdown-Dateien im data/-Ordner, die zur Laufzeit in modernes HTML umgewandelt werden. Das Ergebnis ist blitzschnell, kommt ohne Datenbank aus und sieht dank eigenem Design-System (inklusive Dark Mode) jetzt genau so aus, wie ich es mir vorgestellt habe. Sogar ein moderner Mastodon-Share-Button ist jetzt direkt mit an Bord.
Falls ihr Interesse am Code oder dem schlanken Setup habt, meldet euch gerne über Mastodon bei mir!