Moj blog // Digitalni arhiv

Misli, projekti in tehnični zapiski

Prvotno je bila nastavitev mojega bloga načrtovana kot čisti projekt IPv6 prek WireGuarda, saj vse skupaj gostuje na domačem strežniku (brezplačne naslove IPv6 lahko mimogrede dobite na route64.org). Da bi izboljšal dostopnost, sem zdaj dodal zunanji IPv4-proxy (hvala @Larvitz).

Pri tem pa so se takoj pojavile težave s SSL: Ker sta prvotno tako zapis A kot AAAA potekala prek proxyja, potrjevanje Let's Encrypt na mojem strežniku ni uspelo.

Rešitev: „IPv6-hek“

Rešitev je bila, da sem zapis AAAA eksplicitno usmeril neposredno na naslov IP WireGuard mojega strežnika, namesto da bi ga prav tako speljal prek proxyja.

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

S tem neposrednim zapisom AAAA na moj naslov IP WireGuard Let’s Encrypt še naprej doseže moj strežnik neposredno prek IPv6 (ker ima zapis AAAA privzeto prednost) in izda certifikat SSL. Promet IPv4 pa proxy šifrirano posreduje meni.

Končna konfiguracija

Da bi komunikacija potekala nemoteno, smo morali prilagoditi strežnike Caddy:

1. Na mojem strežniku (NixOS, blog.nix)

Da bi pravi naslovi IP obiskovalcev prispeli pravilno in jih naslov IP proxyja ne bi prepisal, ga je treba označiti kot zaupanja vrednega:

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

2. Na zunanjem proxyju (Caddy)

Da bi proxy pravilno komuniciral z mojim strežnikom prek HTTPS, mora poslati ime gostitelja (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
    }
}

Blog je zdaj dosegljiv prek IPv4 in IPv6, varno šifriran, moj domači naslov IP pa kljub temu ostaja zaseben! 🚀

Najprej najpomembnejše: Običajne datoteke Markdown ostajajo osnova – preprosto sem velik oboževalec te nezahtevne rešitve. Toda pod pokrovom se je veliko spremenilo:

Nekaj stvari sem spremenil v nastavitvah:

📂 MD-datoteke: Struktura bloga ostaja preprosta na osnovi Markdowna.

🌍 Bolj globalno kot kdaj koli prej: Moj blog zdaj podpira prevode v 43 jezikov. Da, vključno s klingonščino! 🖖 (Qapla'!)

Načrtovan je bil popolnoma samodejen prevod v realnem času na podlagi prepoznavanja jezika v brskalniku. Spoiler: Delovalo je le delno. Opaziti je mogoče: umetna inteligenca je impresivna, vendar še ni povsem "tam", kjer bi si želeli.

Rešitev: Zdaj preprosto vnaprej prevedem vsak prispevek v vse določene jezike, kar je tudi bistveno bolje za iskalnike (SEO). Če samodejno prepoznavanje ne deluje, lahko prek ikone globusa ročno nastavite želeni jezik, ki se nato preprosto shrani prek piškotka.

Prevodi se zdaj izvajajo z Gemini 3 Flash, kar daje presenetljivo dobre rezultate. Vendar pa je treba umetni inteligenci pozorno gledati pod prste: v prvem množičnem zagonu so bile pomotoma prevedene tudi oznake (tags), kar seveda ni bilo načrtovano.

Koda je še vedno na voljo (če vas zanima, mi preprosto pošljite sporočilo) 👍 Vendar upoštevajte, da sistem zdaj potrebuje lasten ključ Gemini API 🔑.

Svoj blog sem na hitro preklopil z WriteFreely na lastno rešitev: MD-Blog (MD seveda pomeni Markdown). Povod je bila neuspešna posodobitev starega sistema – na koncu pa je bil to popoln impulz, da vse korenito poenostavim in pridobim popoln nadzor nad dizajnom.

Srce sistema so preproste datoteke Markdown v mapi data/, ki se ob izvajanju pretvorijo v sodoben HTML. Rezultat je bliskovito hiter, deluje brez podatkovne baze in je zahvaljujoč lastnemu oblikovalskemu sistemu (vključno s temnim načinom) zdaj videti natanko tako, kot sem si zamislil. Zdaj je neposredno vključen celo sodoben gumb za deljenje na Mastodonu.

Če vas zanima koda ali vitka nastavitev, me kontaktirajte prek Mastodona!

Pravzaprav je ideja za #Winboat odlična, vendar se zdi, da je izvedba trenutno še nekoliko nestabilna. Od namestitve v začetku leta je sistem sicer deloval, danes pa je programska oprema popolnoma odpovedala.

Slika je nenadoma javila pomanjkanje delovnega pomnilnika (RAM). Težavo sem poskušal odpraviti ročno, kar pa je sistem žal dokončno naredilo neuporabnega. Namesto da bi porabil več časa za iskanje napak, sem prešel neposredno na sliko Dockurr Windows – ta tako ali tako predstavlja tehnično osnovo Winboata.

Sporočilo o napaki

1. Priprava

Ker uporabljam Podman, sem najprej ustvaril potrebne imenike na svojem gostiteljskem sistemu. Tako se ohrani celovitost podatkov, če je treba vsebnik ponovno ustvariti:

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

2. Ukaz za zagon

Pomembno opozorilo: V spremenljivkah -e USERNAME in -e PASSWORD zamenjajte mesta za vnos s svojimi osebnimi dostopnimi podatki.

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

Takoj ko je vsebnik aktiven, lahko do instance Windows dostopate neposredno prek brskalnika:

http://127.0.0.1:8006

Delujoč vsebnik

3. Povzetek

Zgoraj navedeni ukaz sem moral izvesti le enkrat. Pri vsakodnevni uporabi lahko okolje Windows zdaj povsem udobno upravljate s temi kratkimi ukazi:

  • Zagon: podman start windows
  • Zaustavitev: podman stop windows (ali zaustavitev neposredno znotraj sistema Windows)
  • Preverjanje stanja: podman ps -a

Dodatne povezave:

Namestil sem si lasten blog — predvsem zato, da bi bolje spoznal #NixOS. Presenetljivo je bilo vse skupaj precej preprosto.

WriteFreely je za to odlična izbira: minimalističen, hitro nastavljiv in brez odvečne navlake. Popoln za hiter začetek in sprotno učenje. Konfiguracija je prijetno pregledna. Nastaviš nekaj možnosti, pripraviš imenik, postaviš obratni posredniški strežnik (reverse proxy) — in to je to.

Tako izgleda moja trenutna konfiguracija NixOS za ta namen:

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

  # Popravek za generiranje ključev ActivityPub: federacija zahteva openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # Samodejno ustvarjanje podatkovnega imenika z ustreznimi dovoljenji
  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}
    }
  '';
}

To je v bistvu vse. NixOS resnično olajša čisto konfiguracijo in zagotavljanje ponovljivosti takšnih storitev.