Min blogg // Digitalt arkiv

Tanker, prosjekter og tekniske notater

Opprinnelig var bloggoppsettet mitt planlagt som et rent IPv6-prosjekt via WireGuard, ettersom det hele kjøres på en hjemmeserver (gratis IPv6-adresser kan man forresten få hos route64.org). For å øke tilgjengeligheten har jeg nå lagt til en ekstern IPv4-proxy (takk til @Larvitz).

I den forbindelse oppstod det umiddelbart SSL-problemer: Siden både A- og AAAA-oppføringene opprinnelig gikk via proxyen, feilet Let's Encrypt-valideringen på serveren min.

Løsningen: «IPv6-hacket»

Løsningen var å peke AAAA-oppføringen eksplisitt direkte til serverens WireGuard-IP, i stedet for å rute den via proxyen også.

  • Domene: blog.burningboard.org
  • A-Record (Proxy): 194.28.98.217
  • AAAA-Record (Server): 2a11:6c7:f05:a8::2 (WireGuard)

Gjennom denne direkte AAAA-oppføringen til min WireGuard-IP, når Let’s Encrypt fortsatt serveren min direkte via IPv6 (siden AAAA-oppføringer prioriteres som standard) og utsteder SSL-sertifikatet. IPv4-trafikken blir videresendt kryptert fra proxyen til meg.

Den endelige konfigurasjonen

For at kommunikasjonen skal fungere knirkefritt, måtte vi tilpasse Caddy-serverne:

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

For at de ekte besøks-IP-ene skal ankomme korrekt og ikke bli overskrevet av proxyens IP, må denne markeres som tiltrodd:

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

2. På den eksterne proxyen (Caddy)

For at proxyen skal kontakte serveren min korrekt via HTTPS, må den sende med vertsnavnet (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 er nå tilgjengelig via både IPv4 og IPv6, er sikkert kryptert, og hjemme-IP-en min forblir fortsatt privat! 🚀

Det viktigste først: De vante Markdown-filene forblir basisen – jeg er rett og slett en stor fan av denne ukompliserte løsningen. Men under panseret har det skjedd mye:

Jeg har skrudd litt på oppsettet:

📂 MD-filer: Bloggstrukturen forblir enkel på Markdown-basis.

🌍 Mer globalt enn noen gang: Bloggen min støtter nå oversettelser til 43 språk. Ja, inkludert klingonsk! 🖖 (Qapla'!)

Planen var en helautomatisk sanntidsoversettelse basert på nettleserens språkgjenkjenning. Spoiler: Det fungerte bare delvis. Man merker: KI er imponerende, men ennå ikke helt «der» vi gjerne vil ha den.

Løsningen: Nå oversetter jeg rett og slett hvert innlegg på forhånd til alle de fastsatte språkene, noe som også er betydelig bedre for søkemotorer (SEO). Hvis den automatiske gjenkjenningen ikke skulle fungere, kan dere manuelt velge foretrukket språk via globus-ikonet, som deretter lagres enkelt via en informasjonskapsel (cookie).

Oversettelsene utføres nå med Gemini 3 Flash, noe som gir overraskende gode resultater. Man bør imidlertid følge nøye med på hva KI-en gjør: I den første bulk-gjennomgangen ble også taggene feilaktig oversatt, noe som selvfølgelig ikke var planlagt.

Koden er fortsatt tilgjengelig (bare send meg en melding hvis du er interessert) 👍 Men vær oppmerksom på at systemet nå krever en egen Gemini API-nøkkel 🔑.

Jeg har på kort varsel flyttet bloggen min fra WriteFreely til en egenutviklet løsning: MD-Blog (MD står selvfølgelig for Markdown). Utløseren var en mislykket oppdatering av det gamle systemet – men til slutt ble det det perfekte dyttet for å forenkle alt radikalt og få full kontroll over designet.

Kjernen er enkle Markdown-filer i data/-mappen, som konverteres til moderne HTML i sanntid. Resultatet er lynraskt, krever ingen database og ser takket være et eget designsystem (inkludert mørk modus) akkurat slik ut som jeg hadde sett for meg. Til og med en moderne Mastodon-delingsknapp er nå på plass.

Hvis du er interessert i koden eller det enkle oppsettet, er det bare å ta kontakt med meg på Mastodon!

Egentlig er ideen bak #Winboat utmerket, men utførelsen virker foreløpig litt ustabil. Siden installasjonen i starten av året har systemet fungert, men i dag nektet programvaren fullstendig å samarbeide.

Imaget rapporterte plutselig om utilstrekkelig minne (RAM). Jeg prøvde å løse problemet manuelt, noe som dessverre gjorde systemet helt ubrukelig. I stedet for å bruke mer tid på feilsøking, byttet jeg direkte til Dockurrs Windows-image – dette utgjør uansett det tekniske grunnlaget for Winboat.

Fehlermeldung

1. Forberedelse

Siden jeg bruker Podman, opprettet jeg først de nødvendige mappene på vertssystemet mitt. På denne måten bevares dataintegriteten dersom containeren må opprettes på nytt:

mkdir -p $HOME/Windows/System
mkdir -p $HOME/Windows/Shared

2. Startkommandoen

Viktig merknad: Erstatt plassholderne i variablene -e USERNAME og -e PASSWORD med dine personlige påloggingsdetaljer.

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 containeren er aktiv, kan du få tilgang til Windows-instansen direkte via nettleseren din:

http://127.0.0.1:8006

Laufender Container

3. Oppsummering

Jeg trengte bare å kjøre kommandoen ovenfor én gang. I daglig drift kan Windows-miljøet nå enkelt styres via disse hurtigkommandoene:

  • Starte: podman start windows
  • Stoppe: podman stop windows (eller avslutt direkte inne i Windows)
  • Sjekke status: podman ps -a

Nyttige lenker:

Jeg har installert min egen blogg – hovedsakelig for å bli bedre kjent med #NixOS. Overraskende nok gikk det hele ganske ukomplisert.

WriteFreely passer veldig bra til dette: minimalistisk, raskt å sette opp og uten mye unødvendig fyll. Perfekt for å bare komme i gang og lære noe underveis. Konfigurasjonen er behagelig oversiktlig. Noen få alternativer satt, mappe forberedt, reverse proxy foran – ferdig.

Slik ser min nåværende NixOS-konfigurasjon ut:

{ 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";
  };

  # Fiks for generering av ActivityPub-nøkler: Føderasjon krever openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # Automatisk opprettelse av datamappen med riktige rettigheter
  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 det store og hele det hele. NixOS gjør det virkelig enkelt å konfigurere slike tjenester på en ryddig måte og holde dem reproduserbare.