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!
Idén bakom #Winboat är egentligen utmärkt, men genomförandet verkar för närvarande vara lite instabilt. Sedan installationen i början av året har systemet visserligen fungerat, men idag slutade programvaran helt att fungera.
Imagen rapporterade plötsligt otillräckligt arbetsminne (RAM). Jag försökte åtgärda problemet manuellt, vilket tyvärr gjorde systemet helt oanvändbart. Istället för att lägga mer tid på felsökning bytte jag direkt till Dockurrs Windows-image – som ändå utgör den tekniska basen för Winboat.

1. Förberedelser
Eftersom jag använder Podman skapade jag först de nödvändiga katalogerna på mitt värdsystem. På så sätt bevaras dataintegriteten om containern behöver skapas på nytt:
mkdir -p $HOME/Windows/System
mkdir -p $HOME/Windows/Shared
2. Startkommandot
Viktigt: Ersätt platshållarna i variablerna -e USERNAME och -e PASSWORD med dina personliga inloggningsuppgifter.
podman run -d \
--name windows \
-p 8006:8006 \
--device=/dev/kvm \
--cap-add NET_ADMIN \
-e RAM_SIZE="8G" \
-e USERNAME="Carsten" \
-e PASSWORD="1234" \
-e LANGUAGE="German" \
-v $HOME/Windows/System:/storage:Z \
-v $HOME/Windows/Shared:/shared:Z \
--stop-timeout 120 \
dockurr/windows
Så snart containern är aktiv kan du komma åt Windows-instansen direkt via din webbläsare:
http://127.0.0.1:8006

3. Sammanfattning
Jag behövde bara köra ovanstående kommando en gång. I den dagliga driften kan Windows-miljön nu enkelt styras via dessa snabbkommandon:
- Starta:
podman start windows
- Stoppa:
podman stop windows (eller stäng av direkt inifrån Windows)
- Kontrollera status:
podman ps -a
Användbara länkar:
Jag har installerat en egen blogg — främst för att lära känna #NixOS bättre. Överraskande nog gick det hela ganska smidigt.
WriteFreely passar riktigt bra för detta: minimalistiskt, snabbt att sätta upp och utan onödigt krångel. Perfekt för att bara komma igång och lära sig något på vägen. Konfigurationen är behagligt överskådlig. Några inställningar, förbereda mappen, en reverse proxy framför — klart.
Så här ser min nuvarande NixOS-konfiguration ut för detta:
{ config, pkgs, ... }:
{
services.writefreely = {
enable = true;
host = "blog.burningboard.org";
settings = {
server = {
port = 8080;
min_log_level = "debug";
};
app = {
host = "https://blog.burningboard.org";
single_user = true;
landing = "/read";
wf_modesty = true;
federation = true;
public_stats = true;
theme = "write";
};
};
stateDir = "/opt/writefreely";
};
# Fix för generering av ActivityPub-nycklar: Federation kräver openssl
systemd.services.writefreely.path = [ pkgs.openssl ];
# Skapa datamappen automatiskt med rätt behörigheter
systemd.tmpfiles.rules = [
"d /opt/writefreely 0700 writefreely writefreely -"
];
services.caddy.virtualHosts."blog.burningboard.org".extraConfig = ''
reverse_proxy 127.0.0.1:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
'';
}
Det var i stort sett allt. NixOS gör det verkligen enkelt att konfigurera sådana tjänster på ett snyggt sätt och hålla dem reproducerbara.