Môj blog // Digitálny archív

Myšlienky, projekty a technické poznámky

Pôvodne bol môj blog nastavený ako čisto IPv6 projekt cez WireGuard, keďže celý beží na domácom serveri (mimochodom, bezplatné IPv6 adresy môžete získať na route64.org). Aby som zvýšil dostupnosť, pridal som teraz externý IPv4 proxy (vďaka @Larvitz).

Okamžite sa však vyskytli problémy so SSL: Keďže pôvodne cez proxy prechádzal záznam A aj AAAA, overenie Let's Encrypt na mojom serveri zlyhalo.

Riešenie: „IPv6 hack“

Riešením bolo nasmerovať AAAA záznam explicitne priamo na WireGuard IP adresu môjho servera, namiesto toho, aby bol tiež vedený cez proxy.

  • Doména: blog.burningboard.org
  • A záznam (Proxy): 194.28.98.217
  • AAAA záznam (Server): 2a11:6c7:f05:a8::2 (WireGuard)

Vďaka tomuto priamemu AAAA záznamu na moju WireGuard IP adresu sa Let’s Encrypt naďalej dostane k môjmu serveru priamo cez IPv6 (keďže záznam AAAA je štandardne prioritizovaný) a vystaví SSL certifikát. IPv4 prevádzka je z proxy servera posielaná ku mne v šifrovanej podobe.

Finálna konfigurácia

Aby komunikácia prebiehala hladko, museli sme upraviť Caddy servery:

1. Na mojom serveri (NixOS, blog.nix)

Aby sa skutočné IP adresy návštevníkov prenášali správne a neboli prepísané IP adresou proxy servera, musí byť tento proxy označený ako dôveryhodný:

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

2. Na externom proxy (Caddy)

Aby proxy správne komunikoval s mojím serverom cez HTTPS, musí posielať aj názov hostiteľa (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 teraz dostupný cez IPv4 aj IPv6, je bezpečne zašifrovaný a moja domáca IP adresa napriek tomu zostáva súkromná! 🚀

To najdôležitejšie na úvod: Základom zostávajú známe Markdown súbory – som jednoducho veľkým fanúšikom tohto nekomplikovaného riešenia. Pod kapotou sa však udialo veľa zmien:

Trochu som sa pohral s nastavením:

📂 MD súbory: Štruktúra blogu zostáva jednoduchá, založená na Markdowne.

🌍 Globálnejší než kedykoľvek predtým: Môj blog teraz podporuje preklady do 43 jazykov. Áno, vrátane klingončiny! 🖖 (Qapla'!)

Plánom bol plne automatický preklad v reálnom čase na základe rozpoznania jazyka v prehliadači. Spoiler: Fungovalo to len čiastočne. Je vidieť, že AI je pôsobivá, ale ešte nie je úplne „tam“, kde by sme ju chceli mať.

Riešenie: Teraz jednoducho vopred prekladám každý príspevok do všetkých stanovených jazykov, čo je tiež oveľa lepšie pre vyhľadávače (SEO). Ak by automatické rozpoznávanie náhodou nezafungovalo, môžete si preferovaný jazyk nastaviť manuálne cez ikonu zemegule, čo sa následne jednoducho uloží prostredníctvom cookie.

Preklady sa teraz vykonávajú pomocou Gemini 3 Flash, čo prináša prekvapivo dobré výsledky. Treba však na AI dávať pozor: V prvom hromadnom kole boli omylom preložené aj tagy, čo samozrejme nebolo v pláne.

Kód je naďalej k dispozícii (v prípade záujmu mi stačí napísať správu) 👍 Upozorňujem však, že systém teraz vyžaduje vlastný Gemini API kľúč 🔑.

Svoj blog som bez dlhého váhania prepol z WriteFreely na vlastné riešenie: MD-Blog (skratka MD samozrejme znamená Markdown). Spúšťačom bola neúspešná aktualizácia starého systému – nakoniec to však bol ideálny impulz na radikálne zjednodušenie všetkého a získanie plnej kontroly nad dizajnom.

Základom sú jednoduché Markdown súbory v priečinku data/, ktoré sa počas behu konvertujú do moderného HTML. Výsledok je bleskurýchly, zaobíde sa bez databázy a vďaka vlastnému dizajn systému (vrátane tmavého režimu) teraz vyzerá presne tak, ako som si predstavoval. Dokonca je teraz priamo súčasťou aj moderné tlačidlo na zdieľanie cez Mastodon.

Ak máte záujem o kód alebo toto štíhle nastavenie, pokojne sa mi ozvite cez Mastodon!

Nápad za projektom #Winboat je v podstate vynikajúci, no realizácia sa momentálne zdá byť ešte trochu nestabilná. Od inštalácie na začiatku roka systém síce bežal, no dnes softvér kompletne vypovedal službu.

Image zrazu nahlásil nedostatok operačnej pamäte (RAM). Ešte som sa pokúsil problém vyriešiť manuálne, čo však systém nanešťastie definitívne znefunkčnilo. Namiesto investovania ďalšieho času do hľadania chýb som prešiel priamo na Dockurr Windows-Image – ten aj tak tvorí technický základ Winboatu.

Fehlermeldung

1. Príprava

Keďže používam Podman, najprv som na svojom hostiteľskom systéme vytvoril potrebné adresáre. Týmto spôsobom zostane zachovaná integrita dát, ak by bolo potrebné kontajner znova vytvoriť:

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

2. Príkaz na spustenie

Dôležité upozornenie: V premenných -e USERNAME a -e PASSWORD nahraďte zástupné symboly svojimi osobnými prihlasovacími údajmi.

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

Hneď ako je kontajner aktívny, môžete k inštancii Windows pristupovať priamo cez váš prehliadač:

http://127.0.0.1:8006

Laufender Container

3. Zhrnutie

Vyššie uvedený príkaz som musel vykonať iba raz. V každodennej prevádzke sa teraz prostredie Windows dá veľmi pohodlne ovládať pomocou týchto skrátených príkazov:

  • Spustenie: podman start windows
  • Zastavenie: podman stop windows (alebo vypnutie priamo v systéme Windows)
  • Kontrola stavu: podman ps -a

Užitočné odkazy:

Nainštaloval som si vlastný blog — hlavne preto, aby som lepšie spoznal #NixOS. Prekvapivo to celé išlo celkom jednoducho.

WriteFreely sa na to skvele hodí: je minimalistický, rýchlo sa nastavuje a je bez zbytočnej záťaže. Ideálne na to, aby ste mohli jednoducho začať a popritom sa niečo naučiť. Konfigurácia je príjemne prehľadná. Nastavených pár možností, pripravený adresár, reverzný proxy pred ním — a hotovo.

Takto vyzerá moja aktuálna konfigurácia NixOS pre tento účel:

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

  # Oprava pre generovanie kľúčov ActivityPub: Federácia vyžaduje openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # Automatické vytvorenie dátového adresára so správnymi oprávneniami
  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 podstate všetko. NixOS skutočne uľahčuje čistú konfiguráciu takýchto služieb a ich udržiavanie v reprodukovateľnom stave.