Původně bylo nastavení mého blogu plánováno jako čistě IPv6 projekt přes WireGuard, protože celý běží na domácím serveru (mimochodem, bezplatné IPv6 adresy získáte na route64.org). Abych zvýšil dostupnost, přidal jsem nyní externí IPv4 proxy (díky @Larvitz).
Okamžitě se však objevily problémy s SSL: Protože původně přes proxy procházely jak záznamy typu A, tak AAAA, selhalo ověření Let's Encrypt na mém serveru.
Řešení: „IPv6 hack“
Řešením bylo nasměrovat AAAA záznam explicitně přímo na WireGuard IP adresu mého serveru, namísto toho, aby byl také veden přes proxy.
- Doména:
blog.burningboard.org
- A záznam (Proxy):
194.28.98.217
- AAAA záznam (Server):
2a11:6c7:f05:a8::2 (WireGuard)
Díky tomuto přímému AAAA záznamu na mou WireGuard IP adresu se Let’s Encrypt i nadále dostane k mému serveru přímo přes IPv6 (protože záznam AAAA je standardně upřednostňován) a vystaví SSL certifikát. IPv4 provoz je pak šifrovaně předáván z proxy ke mně.
Finální konfigurace
Aby komunikace probíhala hladce, museli jsme upravit servery Caddy:
1. Na mém serveru (NixOS, blog.nix)
Aby skutečné IP adresy návštěvníků přicházely správně a nebyly přepsány IP adresou proxy serveru, musí být tento server označen jako důvěryhodný:
services.caddy.globalConfig = ''
servers {
trusted_proxies static 2a06:9801:1c:1000::10
}
'';
2. Na externí proxy (Caddy)
Aby proxy správně komunikovala s mým serverem přes HTTPS, musí odesílat název hostitele (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 nyní dostupný přes IPv4 i IPv6, bezpečně zašifrovaný a moje domácí IP adresa přesto zůstává soukromá! 🚀
To nejdůležitější na úvod: Základem zůstávají obvyklé Markdown soubory – jsem prostě velkým fanouškem tohoto jednoduchého řešení. Pod kapotou se toho ale hodně změnilo:
Trochu jsem si pohrál s nastavením:
📂 MD-Files: Struktura blogu zůstává jednoduchá na bázi Markdownu.
🌍 Globálnější než kdy dříve: Můj blog nyní podporuje překlady do 43 jazyků. Ano, včetně klingonštiny! 🖖 (Qapla'!)

V plánu byl plně automatický překlad v reálném čase založený na rozpoznání jazyka prohlížeče. Spoiler: Fungovalo to jen částečně. Je vidět, že AI je sice působivá, ale ještě není úplně „tam“, kde bychom ji chtěli mít.
Řešení: Teď prostě každý příspěvek předem přeložím do všech stanovených jazyků, což je také mnohem lepší pro vyhledávače (SEO). Pokud by automatické rozpoznání náhodou nezafungovalo, můžete si preferovaný jazyk nastavit ručně pomocí ikony zeměkoule, což se pak jednoduše uloží do cookie.
Překlady se nyní provádějí pomocí Gemini 3 Flash, což přináší překvapivě dobré výsledky. Člověk by ale měl AI bedlivě hlídat: V prvním hromadném průchodu byly omylem přeloženy i tagy, což samozřejmě nebylo v plánu.
Kód je i nadále k dispozici (v případě zájmu mi prostě napište zprávu) 👍 Mějte však na paměti, že systém nyní vyžaduje vlastní Gemini API klíč 🔑.
Bez dlouhého rozmýšlení jsem svůj blog převedl z WriteFreely na vlastní řešení: MD-Blog (MD samozřejmě znamená Markdown). Spouštěčem byla neúspěšná aktualizace starého systému – nakonec to ale byl dokonalý impuls k tomu, abych vše radikálně zjednodušil a získal plnou kontrolu nad designem.
Jádrem jsou jednoduché Markdown soubory ve složce data/, které se za běhu převádějí do moderního HTML. Výsledek je bleskově rychlý, obejde se bez databáze a díky vlastnímu designovému systému (včetně tmavého režimu) vypadá přesně tak, jak jsem si představoval. Dokonce i moderní tlačítko pro sdílení na Mastodonu je nyní přímo součástí.
Pokud máte zájem o kód nebo toto štíhlé nastavení, neváhejte se mi ozvat přes Mastodon!
Nápad za projektem #Winboat je sice vynikající, ale jeho realizace se momentálně zdá být poněkud nestabilní. Od instalace na začátku roku systém sice běžel, ale dnes software zcela vypověděl službu.
Image náhle nahlásil nedostatek operační paměti (RAM). Pokusil jsem se problém vyřešit ručně, což však bohužel systém definitivně znefunkčnilo. Místo abych investoval další čas do hledání chyb, přešel jsem rovnou na Dockurr Windows-Image – ten ostatně tvoří technický základ Winboatu.

1. Příprava
Protože používám Podman, vytvořil jsem nejprve potřebné adresáře na svém hostitelském systému. Tím zůstane zachována integrita dat, pokud by bylo nutné kontejner znovu vytvořit:
mkdir -p $HOME/Windows/System
mkdir -p $HOME/Windows/Shared
2. Spouštěcí příkaz
Důležité upozornění: V proměnných -e USERNAME a -e PASSWORD nahraďte zástupné symboly svými osobními přihlašovacími údaji.
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
Jakmile je kontejner aktivní, můžete k instanci Windows přistoupit přímo přes prohlížeč:
http://127.0.0.1:8006

3. Shrnutí
Výše uvedený příkaz jsem musel spustit pouze jednou. V každodenním provozu lze nyní prostředí Windows pohodlně ovládat pomocí těchto krátkých příkazů:
- Spuštění:
podman start windows
- Zastavení:
podman stop windows (nebo vypnout přímo v rámci Windows)
- Kontrola stavu:
podman ps -a
Užitečné odkazy:
Nainstaloval jsem si vlastní blog – hlavně proto, abych lépe poznal #NixOS. Překvapivě to všechno šlo docela snadno.
WriteFreely se k tomu skvěle hodí: je minimalistické, rychle se nastavuje a neobsahuje žádný zbytečný balast. Ideální pro rychlý začátek a učení se za pochodu. Konfigurace je příjemně přehledná. Stačí nastavit pár voleb, připravit adresář, přidat reverse proxy – a hotovo.
Takto vypadá moje aktuální konfigurace NixOS:
{ 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 pro generování klíčů ActivityPub: federace vyžaduje openssl
systemd.services.writefreely.path = [ pkgs.openssl ];
# Automatické vytvoření datového adresáře se správnými oprávněními
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 podstatě všechno. NixOS opravdu usnadňuje čistou konfiguraci a udržování takových služeb v reprodukovatelném stavu.