Štítekarchiv12

Stavba archivu

Steven D. Brewer bloguje od roku 2002: PHPWiki, pak Drupal, pak WordPress. Když Drupal 7 došel na konec životnosti, hledal pro čtyřiadvacet let příspěvků místo, které nebude vyžadovat údržbu, a dal je na blog.sh: archive.bierfaristo.com, kde už jsou příspěvky z Drupalu i feed z Twitteru a kousky starého blogu Esperanto-USA vytažené z Wayback Machine.

Stojí za přečtení, pokud hledáš archiv, který má přežít software, ve kterém vznikl.

#blogsh #archive #drupal

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

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

Všechno ostatní v 1.6

Pět příspěvků pokrylo to, o čem 1.6 je. Tenhle je zbytek, v pořadí, v jakém ho provozovatel potká.

Cesta ven z koše a z verzí

Obě úložiště měla cestu zpět – restore a výběr verze ve vlastnostech příspěvku – a žádnou cestu ven, takže obě léta rostla a nic neříkalo o kolik. empty trash a empty versions vypíšou, co se chystají odstranit, v položkách a v megabajtech, a než cokoli odejde, chtějí ten počet opsat. empty versions nechá každému příspěvku jeho nejnovější verzi, protože verze existují proto, aby odpověděly na „vrať mi, co jsem právě přepsal". doctor teď koš s příspěvky zaznamená, jako poznámku, ne jako závadu: na instalaci, kolem které tento engine vznikl, byl jediný způsob, jak ho vidět, du na serveru.

Fotografie uložená jednou

public.nosync/ dřív držel druhou kopii každého obrázku. Teď drží pevný odkaz, takže obrázky zabírají polovinu toho, co dřív – 1,8 GB na instalaci tohoto projektu. V záloze to neušetří nic, a to bylo změřeno, ne předpokládáno: 200 souborů pod dvěma jmény, 101 MB na disku, 201 MB v záloze. Nic k udělání; první sestavení po aktualizaci odkazy vytvoří.

Číst dál

Archiv, který nevidíš, není prázdný

Schválené komentáře tohoto webu a jeho počítadla příspěvků jsou dva malé soubory JSON, které cron každou půlhodinu obnoví a nahraje se zbytkem webu.

Až do 1.4 by běh, který proběhl, zatímco archiv nebyl na místě, oba soubory zúžil na nic a nahrál je. Chybějící nebo prázdný adresář obsahu odpoví prázdným seznamem a žádnou chybou, a prázdný seznam se čte přesně jako „každý oznámený příspěvek byl smazán". Živý web přišel o každý schválený komentář a každé počítadlo naráz. Exit 0, nic řečeno, nic posláno mailem.

Archiv bydlí na synchronizovaném svazku. Svazek, který se ještě nepřipojil, nebo pracovní kopie, jejíž soubory teprve přicházejí, není neobvyklé úterý.

Nemožnost to rozeznat je důvod všechno nechat

Ta věta je oprava a běží teď ve dvou stupních.

Pokud adresář obsahu není na místě – nebo pokud se archiv čte jako prázdný, zatímco předchozí soubory obsahovaly cokoli – nic se nezužuje a běh řekne proč.

Číst dál

Dvě stránky, které si web sestavil sám ze sebe

Až dosud ti tento engine uměl ukázat deset příspěvků najednou a nic jiného. /page/128/ je na velkém archivu skutečná adresa a neřekne ti nic o tom, jestli jsi přistál v roce 2009 nebo 2014 – stránkování je ukotvené od nejstaršího příspěvku, takže se ti číslo pod nohama pohne pokaždé, když se něco publikuje. Jediný úplný seznam čehokoli žil v terminálu.

1.5 přidává dvě stránky, které archiv čtou, místo aby jím procházely.

/archive/ – tvar celku

Řádek na rok a vedle něj pás dvanácti měsíců. Měsíc je vystínovaný v jednom ze čtyř stupňů, ne jen rozsvícený nebo tmavý, protože „má příspěvky / nemá" není otázka, na kterou stojí za to odpovídat: na referenčním archivu drží měsíc kdekoli mezi jedním příspěvkem a sedmaosmdesáti, a kreslit je stejně by skrylo to jediné, k čemu mapa je. /archive/<rok>/ je jeden řádek na příspěvek, po měsících.

Dvě úrovně a víc ne. Třetí by byla nějakých 280 stránek jednotlivých měsíců – hodně sestavování na otázku, kterou nikdo nepoložil.

Číst dál

Slug je adresa, ne jméno

Po většinu života tohoto projektu měl příspěvek bez titulku dvě jména. Jeho vlastní stránka mu říkala podle data. Všechno ostatní – záložka prohlížeče, karta odkazu, kterou někdo sdílí, každá položka ve feedu – mu říkalo burtiky-opekame-hipstamatic-oggl-jane.

To není okrajový případ. Na archivu, na kterém se tento engine měří, nenese titulek 2 754 příspěvků z 4 418. Dvaašedesát procent webu, které jdou do světa pod adresou.

Slug je vyrobený ze slov. Není to ta slova.

Slug je strojová odpověď na „kde tohle bydlí": malá písmena, bez diakritiky, spojeno pomlčkami, uříznuto na prvních osm slov. Každá vlastnost, která z něj dělá dobrou adresu, z něj dělá špatné jméno. Nemá velká písmena, nemá interpunkci a netuší, kam věta, ze které byl uříznut, mířila.

1.5 bere jméno z téhož místa, odkud přišel slug – z vlastního začátku příspěvku – a zastaví se na lepším místě.

Kde se zastaví

Číst dál

Co smí stát pád

Fronta teď umí prohodit dva naplánované příspěvky, které sdílejí slug napříč dvěma roky – i s jejich médii a historií úprav, protože ty jsou klíčované rokem a slugem přesně jako soubor příspěvku. Ta věta je krátká; udělat ji pravdivou zabralo většinu vývojového cyklu. Zajímavá část není prohození. Je to, co se stane, když uprostřed vypadne proud.

Rozpočet je nula

Přesun je několik přejmenování a pád může dopadnout mezi kterákoli dvě. Pravidlo, kterého se 1.4 drží: ať je to kdykoli, pád tě smí stát přesun – nikdy příspěvek. Soubory ustoupí stranou pod parkovací jména dřív, než cokoli zapisuje; neúspěšný zápis vrátí všechno zpět, bajt po bajtu; tvrdé zabití, které nechá zaparkovaný soubor stát, ho nechá tam, kde ho check najde a pravdivě řekne, co je.

Rada je součást systému

Číst dál

Druhá polovina check

./blog.sh check přečte celý archiv a řekne, co je špatně: média, o která si příspěvek říká a nemá je, odkazy na adresy, na kterých nic neodpovídá, dva příspěvky, které by se servírovaly na jedné adrese. Až do 1.3 tam to končilo – seznam nálezů a návratový kód, s opravou ponechanou tobě a textovému editoru.

--repair to projde s tebou

check --repair je druhá polovina kontroly: ke každému nálezu nabídne tu jednu opravu, kterou nález dovoluje – starou adresu zapsanou do redirect_from cílového příspěvku, relativní odkaz přepsaný na adresu, kterou míní, osiřelý soubor přesunutý do koše. Nic se nepoužije bez stisku klávesy, nic se nemaže rovnou a nález bez zjevné odpovědi – dva příspěvky v kolizi, obrázek, který posoudí jen člověk – se ukáže a přeskočí, místo aby se hádal.

Osvědčil se dřív, než vyšel: na skutečném archivu snížil 238 nálezů na 42 a 21 oprav, které navrhl, se jedna k jedné shodovalo s tím, co už člověk rozhodl ručně.

--json říká všechno

Číst dál

Co potichu hnije

./blog.sh doctor se ptá, jestli je instalace v pořádku, a trvá to vteřinu. Nemá co říci k archivu čtyř tisíc příspěvků, ve kterém se jeden obrázek nikdy nestáhl, tři trvalé odkazy nikam nevedou a dva příspěvky si nárokují tutéž starou adresu.

./blog.sh check to všechno projde a řekne.

Co hledá

Každý nález pojmenuje příspěvek a slug – něco, kam jít a co opravit – a nese řádek, co s tím udělat.

Číst dál

Cesta ven se dodává s ním

Engine, který ti nedokáže vrátit tvoje psaní, je hostingová služba s kroky navíc. Importéry vždy mířily jedním směrem – dvaadvacet zdrojů, všechno domů. ./blog.sh export je druhý směr a měl tu být jako první.

Co vyjde ven

Celý archiv jako strom markdownových souborů s hlavičkou YAML, v rozvržení, které čte Jekyll: _posts/2026-05-01-slug.md, _drafts/, stránky v kořeni, média pod assets/<rok>/<slug>/. Staré adresy cestují jako redirect_from, v tvaru, kterému plugin jekyll-redirect-from už rozumí, se sloučením obou druhů – kde příspěvek bydlel na platformě, ze které přišel, a kde bydlel tady před přejmenováním. Namiř na tu složku statický generátor a sestaví se.

./blog.sh export ~/my-blog-export        # všechno, včetně konceptů
./blog.sh export ~/public-copy --no-drafts
./blog.sh export ~/somewhere --dry-run   # spočítá, nezapíše nic

Tento web, spočítaný, ne zapsaný:

Číst dál

Blogovací engine, ze kterého se stal archiv

První příspěvek na tomto webu je o fotce, kterou jsem v roce 2012 dal na Instagram. Odkaz pořád funguje. Fotka ne.

Ten příspěvek byl o jednom archivu – mém – a o jednom pravidle: média se vracejí domů. Tenhle je o tom, co se stalo, když se to pravidlo použilo na každou platformu, ke které jsem našel export.

Seznam je uzavřený

Importuje se teď dvaadvacet zdrojů, ve třech skupinách.

Sociální sítě: Bluesky, Facebook, Instagram, Mastodon, Pixelfed, Threads, Twitter/X.

Blogy a publikační platformy: beehiiv, Blogger, Ghost, Jekyll/Hugo a jakákoli složka s markdownem, LiveJournal, Medium, Movable Type a TypePad, podcasty (jakýkoli feed se zvukem), Squarespace, Substack, Tumblr, Wix, WordPress a jakýkoli feed RSS nebo Atom.

A mrtvé weby: Wayback Machine, pro blogy, jejichž platforma už vůbec neexistuje.

Číst dál