Text76

Archiv promlouvá

Koncem září přišel dopis. Pavel si tímto enginem zálohoval starý blog a napsal, co se při tom dozvěděl: za devět let přes tisíc příspěvků a období, kdy psal každý den. Nevěděl to. Blog byl celou dobu jeho, příspěvky byly celou dobu v něm, a přesto mu to číslo řekl až archiv, když ho poprvé někdo přečetl celý.

Tohle vydání je o tom, co archiv řekne, když se ho zeptáš. Jak se do něj dostane, jak z něj odejde a jak se hlídá, o tom web napsal dost. Tenhle text je o tom, co archiv ví o tobě.

Co archiv spočítá

./blog.sh stats přečte každý příspěvek a odpoví jednou obrazovkou. Na archivu, kolem kterého tento engine vznikl, dnes vypadá takhle:

Archiv
  příspěvků: 6912 — z toho publikovaných 6907, rozepsaných 1, naplánovaných 4
  31. 10. 2003 – 22. 10. 2026, dnů: 8392
  nejvíc toho přibylo v roce 2024 (příspěvků: 642)

Slova
  slov celkem: 425 828, průměrně na příspěvek: 61,6, uprostřed: 22
  nejdelší: minimal-jedna-barva-tri-pisma (slov: 3267)
  přečíst celý archiv trvá 35,5 hodiny
Číst dál

./blog.sh 1.10

./blog.sh 1.10 je venku — vydání na GitHubu.

Vydání, které otevírá dveře programům. Každá obrazovka, kterou si přečteš, než něco uděláš, a každá akce, kterou ti nabídne, teď umí odpovědět i jako data. Program na jiném stroji se k nim dostane přes SSH, které server už má, a jen přes jeden skript, který mu dovolí spustit jeden příkaz enginu a nic jiného. Připojí se kódem, který ./blog.sh pair nakreslí v terminálu, takže nikdo nikam nepíše adresu ani klíč. Na tom stojí nativní appky pro iOS a Android, které se chystají.

Kolem toho archiv víc mluví o sobě. Karta „V tento den“ ukáže příspěvky z dnešního dne v dřívějších letech, /series/ je rejstřík všech sérií, stránka výpisu řekne, které dny pokrývá, a stránka 404 nabídne hledání rovnou vyplněné slovy z adresy, kterou nenašla. Na Macu ./setup.sh nabídne ikonu v Aplikacích, takže se blog dá otevřít bez psaní do terminálu. A druhý jazyk z 1.9 dospěl: série má jméno v každém jazyce a překlad si drží své staré adresy stejně jako příspěvek.

Jedna věc dopředu: stránka /write/ a zkratka SendPost ve verzi 1.11 skončí a nahradí je appky. V 1.10 fungují jako dřív.

Číst dál

Kde tenhle engine vyrostl

Každá vlastnost na tomhle webu má stránku, která říká, co dělá. Méně jich říká, proč tu je, a skoro žádná, jaký byl týden před tím, než vznikla. Tahle část se psala jinde: na sean.cz, v archivu, ze kterého byl engine vyňat a na kterém každá změna přistane první, 6 655 příspěvků od roku 2003. Do minulého týdne jen česky.

Od 7. října se sean.cz čte i anglicky: 126 příspěvků, každý tentýž příspěvek jako český originál, jen se slovy v druhém jazyce, tak jak to druhý jazyk umí tady. Je mezi nimi celá série, která sleduje tenhle engine ode dne, kdy se na něj web přestěhoval, Nový Sean.cz: zatím jednadvacet dílů, červenec až říjen.

Pár míst, kde začít, pokud chcete ochutnávku a ne celý běh:

Číst dál

Stránka, kterou cizí člověk otevře první

Sobota, LinuxDays v Praze, stánek přátel z OSCloudu – Mastodon, Pixelfed, PeerTube, Matrix, služby pro lidi, kteří chtějí mít svá data tam, kde na ně vidí. Celý den za jedním stolem a ani jedna přednáška. Tento engine tam byl poprvé naživo: na letáku a v hovoru pokaždé, když se řeč o Fediverse stočila k otázce „a kde bych psal?"

Čtyři pole na jednom A4

Leták je jeden list. Čtyři pole – psaní, stěhování, nasazení, web – a v každém výřez z terminálu a QR kód. Žádný z kódů nevede na stránku vyrobenou pro tu akci. Každý otevírá štítkovou stránku, kterou tento web už měl: /tag/authoring, /tag/migration, /tag/deploy, /tag/appearance. Vlastní archiv webu, seřazený podle toho, na co se u stánku lidé ptají, byl přistávací stránkou. Nic, co by den po akci zastaralo, se pro ni nestavělo.

Číst dál

Kam až to může narůst

Je poctivá otázka, než nástroji svěříš dvacet let psaní: v jakém bodě ho přestane být příjemné používat? Měřeno tady v srpnu, na archivu 6 639 příspěvků, byla upřímná odpověď pokrčení rameny: přidání jednoho příspěvku stálo celý archiv – osmačtyřicet sekund od stisknutí klávesy Enter do chvíle, kdy web běžel – protože každá stránka, která se o příspěvku byť jen zmiňovala, se musela vyrobit znovu, ať se změnila, nebo ne.

To už upřímná odpověď není. Od 1.6 si sestavení vede záznam o tom, co do každé stránky vstoupilo, a znovu vyrábí jen ty, jejichž záznam už nesedí. Archiv pod tím je tentýž, na kterém se to v srpnu měřilo, o sedm příspěvků těžší: teď 6 646, a engine o tři vydání dál, na 1.9.

Na co čekáš dnes

Publikace příspěvku s dnešním datem na tomtéž archivu: šestnáct sekund sestavení, dvě nahrávání – kde bylo osmačtyřicet. Sestavení už nesahá na stránky, které to nepotřebovaly, takže velikost archivu přestala být tím, z čeho se čekání skládalo.

Kde se velikost stále ukazuje

Číst dál

./blog.sh na LinuxDays 2026

O tomto víkendu, v sobotu 3. a neděli 4. října, proběhnou v Praze na FIT ČVUT v Dejvicích již tradiční LinuxDays 2026. Vstup je volný.

V sobotu budu celý den na stánku mých přátel z OSCloudu. Jestli si chceš o ./blog.sh popovídat, zeptat se, jak to či ono funguje, zjistit, jestli by unesl tvůj blog, nebo mi říct, o co jsi zakopl, je to příležitost probrat to tváří v tvář, a ne v issues na GitHubu.

Nic zásadního si nechystej. Stačí otázka — nebo blog, který se chystáš přestěhovat. Vše ostatní si řekneme na LinuxDays 2026.

Program a jak se tam dostat: linuxdays.cz/2026

#blogsh #LinuxDays

Všechno ostatní v 1.9

Pět příspěvků pokrylo to, o čem 1.9 je: příspěvek ve dvou jazycích, web v jazyce stránky, co leží v cíli nasazení před prvním nasazením, hosting, který umí jen FTP a jednu zkratku v telefonu místo dvou. Tenhle je zbytek, v pořadí, v jakém ho provozovatel potká. Většina z něj přišla od dvou lidí, kteří 1.9 nainstalovali od nuly a upgradovali kopii webu o 6 600 příspěvcích, přesně podle dokumentace.

Číst dál

Jedna zkratka místo dvou

Poslat příspěvek z iPhonu chtělo až do 1.9 dvě zkratky: jednu, která převezme soubory z panelu sdílení, a druhou, která otevře spojení přes SSH. Napsáno ve vlaku prošlo obě. Teď je to jedna zkratka, importovaná místo stavěná, a běží i na Macu.

Číst dál

Hosting, který umí jen FTP

Sdílený hosting často přichází s adresářem, přihlášením přes FTP a ničím dalším – bez SSH, bez rsync, bez gitu. Pro blog.sh to stačilo odjakživa; dokumentace to jen do 1.9 neříkala. Cesta vede přes backend rclone, protože rclone umí FTP jako jeden ze svých mnoha vzdálených cílů.

Číst dál

Před prvním nasazením

Někdo stěhuje blog z WordPressu na blog.sh a nechává si stejný hosting, stejný adresář i stejnou adresu. Sestavení je hotové, první nasazení projde bez jediné chyby – a úvodní stránka je pořád ta stará. Při nahrávání se nic nepokazilo. Starý web jen nikdo neodstranil a hosting mu dává přednost.

Číst dál

Web mluví jazykem stránky

Někdo přeloží své příspěvky, otevře českou polovinu webu – a menu pořád říká Writing, patička Links a na každé pilulce stojí anglický štítek. Příspěvky byly vždycky jen polovina toho, co čtenář čte. Zbytek je to, co web říká sám o sobě, a v 1.9 to má jazyk taky.

Číst dál

Dva jazyky, jeden web

Někdo píše česky a část lidí, kteří by ho četli, česky neumí. Obvyklá odpověď je druhý blog – druhý archiv, druhá sada štítků, druhý feed – a do roka se ty dva rozejdou: příspěvek opravený v jednom a ve druhém ne, štítek přejmenovaný jen na jedné straně, čtenář, který přepne jazyk a ocitne se jinde, než čekal. blog.sh 1.9 odpovídá jinak: jeden web a druhý jazyk vedle něj.

Číst dál

./blog.sh 1.9

./blog.sh 1.9 je venku — vydání na GitHubu.

Vydání o publikování ve více jazycích. Vyjmenuješ je v site.locales a příspěvek si nechá jedno datum, jednu sadu štítků a jednu sérii, s textem pro každý jazyk, který napíšeš přes ./blog.sh translate. Vlastní jazyk webu zůstává v kořeni, každý další dostane svůj a jedno sestavení udělá všechny. Banner, menu, patička i štítky mluví každým jazykem taky; příspěvek, který nikdo nepřeložil, se ukáže i tak a odkáže na jedinou kopii, která existuje. Tenhle web tak běží anglicky a česky už od doby, kdy bylo vydání konceptem.

Kolem toho první hodina: dva lidé nainstalovali 1.9 od nuly a upgradovali kopii webu o 6 600 příspěvcích, přesně podle dokumentace, a všechno, o co zakopli, je opravené. Esc nikdy nic neudělá, instalační průvodce mluví tvým jazykem od první obrazovky a nevezme příklad ze šablony jako jméno tvého webu, vlastnosti konceptu ukážou, kde si ho přečíst — i s QR kódem pro telefon — a doctor --online se teď zeptá cíle nasazení, co mu v kořeni leží navíc.

Číst dál

Co žádné sestavení nevrátí

Notebook doslouží, nebo se server buduje znovu od nuly, a otázka, na které skutečně záleží, je užší, než zní. Ne „jak to zálohovat" – „které z těchto souborů po mně engine opravdu potřebuje chránit, protože nic jiného tady je znovu nevyrobí."

Většina instalace tuto podmínku nesplňuje. Engine sám je git klon; stáhni ho znovu a je to tentýž engine. Všechno, co sestavení zapisuje, se vrátí jedním sestavením, pokud zbylo to ostatní.

Instinkt velí zálohovat samotný web – složku, kterou prohlížeč skutečně vidí. To je přesně ta jediná věc, kterou tento seznam vynechává. public.nosync, vlastní výstup sestavení, je stejně postradatelný jako engine, který ho vytvořil: jedno sestavení ho zopakuje bajt po bajtu, takže držet jeho kopii by znamenalo ukládat tutéž informaci dvakrát pod dvěma jmény a omylem věřit té starší.

Co zbývá, když odložíme engine i web, který sestavuje, je krátký seznam.

Co je skutečně nenahraditelné

Nejdřív samotné příspěvky – jediná položka celého seznamu, kterou žádné sestavení, nový klon ani nové nasazení nevrátí za žádných okolností.

Číst dál

Zámek, který nečeká

Dvakrát za hodinu na dost velkém webu sáhnou dvě úlohy cronu do téže složky téměř ve stejnou chvíli: naplánované publikování, které sestaví a nasadí příspěvek, jehož čas právě nastal, a obnova postranního panelu, která přepisuje několik týchž výstupních souborů čerstvými čísly. Většina tiků se mine o minuty. Na archivu tak velkém, že sestavení s úplným nasazením trvá déle než interval mezi nimi, se některé neminou.

Nasazení, které prochází strom, zatímco ho jiný běh ještě přepisuje, může vydat stránku zapsanou napůl. Běh, který maže osiřelé soubory, může jako osiřelou smazat stránku, kterou druhý běh o sekundu dřív publikoval. Ani jedno selhání se neohlásí – web je prostě potichu špatně.

Zámek a co odmítá dělat

Mezi těmi dvěma běhy stojí jediný soubor, .blog-sh.lock v kořeni projektu – a rozhoduje se způsobem, který vypadá špatně, dokud neuvidíš alternativu. Běh, který najde zámek obsazený, na něj nečeká.

Číst dál

Co zbývá pokazit

Na tomto webu není /admin. Žádný přihlašovací formulář, na kterém by šlo zkoušet hesla, žádná relační cookie, kterou by šlo ukrást, žádný seznam pluginů, který by bylo nutné porovnávat s CVE z minulého měsíce – ne proto, že by je někdo podle kontrolního seznamu odstranil, ale proto, že nic z toho nikdy nevzniklo.

Architektonické poznámky enginu říkají zbytek bez obalu: model hrozeb je statický web bez vlastního serveru. Nic tu neposlouchá na žádném portu. Cílem nikdy nebylo zabezpečit složitý systém proti všemu, co se v něm může pokazit. Cílem bylo žádný takový systém nepotřebovat.

Seznam toho, co zbývá pokazit, je pak kratší než u běžného blogu – co nesou stránky, co leží v pracovním adresáři, a ta jediná věc, která vstupuje zvenčí.

Jediná věc, která vstupuje zvenčí

Psaní z telefonu znamená, že jedny dveře přece jen přijímají bajty z cizího zařízení: scripts/receive.sh, spuštěný jako vynucený příkaz SSH klíče. Neposlouchá nikde – žádný socket, žádný démon, jen klíč, který smí spustit přesně tento skript a nic jiného.

Číst dál