Min blogg // Digitalt arkiv

Tankar, projekt och tekniska anteckningar

Visa inlägg med tagg: #md-blog Visa alla ×

Ursprungligen var min blogguppsättning planerad som ett rent IPv6-projekt via WireGuard, eftersom det hela körs på en hemserver (gratis IPv6-adresser kan man förresten få hos route64.org). För att öka tillgängligheten har jag nu lagt till en extern IPv4-proxy (tack @Larvitz).

I samband med detta uppstod dock omedelbart SSL-problem: Eftersom både A- och AAAA-posterna ursprungligen gick via proxyn, misslyckades Let's Encrypt-valideringen på min server.

Lösningen: ”IPv6-hacket”

Lösningen var att rikta AAAA-posten explicit direkt mot min servers WireGuard-IP, istället för att även leda den via proxyn.

  • Domän: blog.burningboard.org
  • A-post (Proxy): 194.28.98.217
  • AAAA-post (Server): 2a11:6c7:f05:a8::2 (WireGuard)

Genom denna direkta AAAA-post till min WireGuard-IP når Let’s Encrypt fortfarande min server direkt via IPv6 (eftersom AAAA-posten prioriteras som standard) och utfärdar SSL-certifikatet. IPv4-trafiken skickas vidare krypterad från proxyn till mig.

Den slutgiltiga konfigurationen

För att kommunikationen ska fungera smidigt var vi tvungna att anpassa Caddy-servrarna:

1. På min server (NixOS, blog.nix)

För att de riktiga besökar-IP-adresserna ska komma fram korrekt och inte skrivas över av proxyns IP, måste denna markeras som betrodd:

services.caddy.globalConfig = ''
  servers {
      trusted_proxies static 2a06:9801:1c:1000::10
  }
'';

2. På den externa proxyn (Caddy)

För att proxyn ska anropa min server korrekt via HTTPS måste den skicka med värdnamnet (SNI):

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
    }
}

Bloggen är nu tillgänglig via både IPv4 och IPv6, säkert krypterad, och min hem-IP förblir ändå privat! 🚀

Det viktigaste först: De vanliga Markdown-filerna förblir basen – jag är helt enkelt ett stort fan av denna okomplicerade lösning. Men under huven har det hänt en hel del:

Jag har skruvat en del på setupen:

📂 MD-filer: Bloggstrukturen förblir enkel på Markdown-basis.

🌍 Mer globalt än någonsin: Min blogg stöder nu översättningar till 43 språk. Ja, inklusive klingonska! 🖖 (Qapla'!)

Planen var en helautomatisk realtidsöversättning baserad på webbläsarens språkigenkänning. Spoiler: Det fungerade bara delvis. Man märker att AI är imponerande, men ännu inte riktigt "där" vi skulle vilja ha den.

Lösningen: Nu översätter jag helt enkelt varje inlägg i förväg till alla fastställda språk, vilket också är betydligt bättre för sökmotorer (SEO). Om den automatiska igenkänningen inte skulle fungera kan ni manuellt välja ert föredragna språk via jordglobsikonen, vilket sedan sparas smidigt via en cookie.

Översättningarna görs nu med Gemini 3 Flash, vilket ger förvånansvärt bra resultat. Man bör dock hålla ett öga på AI:n: I den första bulk-körningen översattes även taggarna av misstag, vilket naturligtvis inte var planerat.

Koden är fortfarande tillgänglig (skriv bara ett meddelande till mig om du är intresserad) 👍 Observera dock att systemet nu kräver en egen Gemini API-nyckel 🔑.

Jag har lite snabbt bytt ut min blogg från WriteFreely till en egenutvecklad lösning: MD-Blog (MD står naturligtvis för Markdown). Utlösaren var en misslyckad uppdatering av det gamla systemet – men i slutändan var det den perfekta anledningen till att förenkla allt radikalt och få full kontroll över designen.

Kärnan består av enkla Markdown-filer i mappen data/, som omvandlas till modern HTML vid körning. Resultatet är blixtsnabbt, kräver ingen databas och ser tack vare ett eget designsystem (inklusive mörkt läge) nu ut precis som jag föreställt mig. Till och med en modern Mastodon-delningsknapp finns nu direkt på plats.

Om ni är intresserade av koden eller den smidiga konfigurationen, hör gärna av er till mig via Mastodon!