Oorspronkelijk was mijn blog-setup gepland als een puur IPv6-project via WireGuard, omdat het geheel op een homeserver draait (gratis IPv6-adressen kun je overigens krijgen bij route64.org). Om de bereikbaarheid te vergroten, heb ik nu een externe IPv4-proxy toegevoegd (met dank aan @Larvitz).
Daarbij ontstonden echter direct SSL-problemen: Omdat oorspronkelijk zowel het A- als het AAAA-record via de proxy liepen, mislukte de Let's Encrypt-validatie op mijn server.
De oplossing: De βIPv6-hackβ
De oplossing was om het AAAA-record expliciet rechtstreeks naar het WireGuard-IP van mijn server te laten verwijzen, in plaats van dit ook via de proxy te leiden.
- Domein:
blog.burningboard.org
- A-record (Proxy):
194.28.98.217
- AAAA-record (Server):
2a11:6c7:f05:a8::2 (WireGuard)
Door dit directe AAAA-record naar mijn WireGuard-IP bereikt Letβs Encrypt mijn server nog steeds rechtstreeks via IPv6 (omdat het AAAA-record standaard prioriteit krijgt) en wordt het SSL-certificaat uitgegeven. Het IPv4-verkeer wordt door de proxy versleuteld naar mij doorgegeven.
De uiteindelijke configuratie
Om de communicatie soepel te laten verlopen, moesten we de Caddy-servers aanpassen:
1. Op mijn server (NixOS, blog.nix)
Om ervoor te zorgen dat de echte IP-adressen van bezoekers correct aankomen en niet worden overschreven door het IP van de proxy, moet deze als vertrouwd worden gemarkeerd:
services.caddy.globalConfig = ''
servers {
trusted_proxies static 2a06:9801:1c:1000::10
}
'';
2. Op de externe proxy (Caddy)
Om ervoor te zorgen dat de proxy mijn server correct via HTTPS benadert, moet deze de hostnaam (SNI) meesturen:
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
}
}
De blog is nu bereikbaar via IPv4 en IPv6, veilig versleuteld en mijn thuis-IP blijft toch privΓ©! π
Het belangrijkste eerst: de vertrouwde Markdown-bestanden blijven de basis β ik ben simpelweg een groot fan van deze ongecompliceerde oplossing. Maar onder de motorkap is er veel veranderd:
Ik heb flink aan de setup gesleuteld:
π MD-bestanden: De blogstructuur blijft simpel op Markdown-basis.
π Globaler dan ooit: Mijn blog ondersteunt nu vertalingen in 43 talen. Ja, inclusief Klingon! π (Qapla'!)

Het plan was een volautomatische real-time vertaling op basis van de taalherkenning van de browser. Spoiler: het werkte maar gedeeltelijk. Je merkt: AI is indrukwekkend, maar nog niet helemaal "daar" waar we het graag zouden willen hebben.
De oplossing: ik vertaal nu simpelweg elk bericht vooraf in alle vastgestelde talen, wat ook aanzienlijk beter is voor de zoekmachines (SEO) is. Mocht de automatische herkenning een keer niet werken, dan kun je via het wereldbol-icoontje handmatig je voorkeurstaal instellen, die vervolgens heel eenvoudig via een cookie wordt opgeslagen.
De vertalingen worden nu uitgevoerd met Gemini 3 Flash, wat verbazingwekkend goede resultaten oplevert. Je moet de AI echter wel goed in de gaten houden: in de eerste bulk-ronde werden per ongeluk ook de tags meevertaald, wat natuurlijk niet de bedoeling was.
De code is nog steeds beschikbaar (stuur me bij interesse gewoon een bericht) π Houd er wel rekening mee dat het systeem nu een eigen Gemini API Key π nodig heeft.
Ik heb onlangs mijn blog overgezet van WriteFreely naar een eigen ontwikkeling: MD-Blog (de MD staat natuurlijk voor Markdown). De aanleiding was een mislukte update van het oude systeem β uiteindelijk was dit echter de perfecte stimulans om alles radicaal te vereenvoudigen en de volledige controle over het design te krijgen.
De kern bestaat uit eenvoudige Markdown-bestanden in de data/-map, die tijdens runtime worden omgezet in modern HTML. Het resultaat is razendsnel, werkt zonder database en ziet er dankzij een eigen design-systeem (inclusief Dark Mode) nu precies zo uit als ik me had voorgesteld. Zelfs een moderne Mastodon-deelknop is nu direct inbegrepen.
Mocht je interesse hebben in de code of de slanke setup, neem dan gerust contact met me op via Mastodon!