← Späť na blog

Od roztrúsených skriptov po vlastný katalóg so sandboxom: ako vznikla appka Sindri

21. júla 2026 · 5 min čítania

self-hostedbezpečnosť

Nie appka postavená podľa plánu od nuly, ale nástroj, ktorý sa vynoril z reálneho problému a rástol podľa toho, čo sa pri používaní ukázalo ako chýbajúce.

Odkiaľ appka vznikla

Sindri nezačal ako projekt. Začal ako vedľajší produkt bežnej údržby po výpadku — pri upratovaní roztrúsených homelab skriptov naprieč viacerými strojmi vznikla otázka, ktorá znie takmer každému, kto spravuje viac než jeden server: kde je vlastne ten skript, čo som napísal pred mesiacom, čo presne robí, a na ktorom stroji som ho naposledy videl?

Namiesto ručného zoznamu v jednom .md súbore (ktorý presne toto zlyhávanie už raz spôsobil) vznikla appka: FastAPI + SQLite backend, React frontend, fulltext hľadanie aj v samotnom obsahu skriptov, a rovno pri zakladaní aj detekcia natvrdo zapísaných hesiel a tokenov v importovanom kóde — bezpečnostná kontrola prítomná od prvého dňa, nie doplnená neskôr.

Rýchly rast, poháňaný reálnym používaním

Väčšina appiek rastie podľa plánu funkcií napísaného vopred. Sindri rástol inak — každé kolo práce pridalo to, čo sa pri skutočnom používaní ukázalo ako chýbajúce, a takmer vždy sa pritom našiel aspoň jeden skutočný, naživo overený bug:

  • Bezpečné vzdialené spustenie skriptov cez SSH na zaregistrované stroje, so sudo heslom posielaným cez stdin (nikdy neukladaným), otestované naozaj proti reálnym strojom — vrátane objavenia, že jeden z nich má sudo fyzicky viazané na hardvérový kľúč (zámerná vlastnosť stroja, nie bug appky, ale appka to musela ustáť).
  • Sandbox spúšťanie — izolovaný Docker kontajner bez siete, s read-only súborovým systémom, časovým aj pamäťovým limitom. Otestované naživo proti reálnemu Docker daemonu: zápis mimo povoleného priestoru zlyhal správne, fork bomba bola zastavená do sekundy, umelo alokovaných 500 MB pamäte korektne spôsobilo OOM-kill.
  • AI review a generovanie skriptov cez lokálne CLI nástroje (s fallbackom na priame API), ktoré pri prvom reálnom teste správne odhalilo testovacie heslo natvrdo zapísané v kóde — presne to, čo malo odhaliť.
  • História obsahu s rollbackom, história spustení z audit logu, hromadné úpravy tagov, príkazová paleta (Ctrl+K), export celého katalógu, prihlasovací rate-limiting s per-IP zámkom.

Viacero z týchto bugov nebolo kozmetických. Dvojklik na tlačidlo "Pridať do katalógu" vytváral dva identické záznamy naraz (chýbajúci guard proti opakovanému odoslaniu). Kopírovacie tlačidlo ticho nefungovalo, lebo appka bežala cez čisté HTTP na LAN adrese a prehliadačové Clipboard API vyžaduje zabezpečený kontext — appka sa navonok tvárila v poriadku, len sa nič neskopírovalo. Vygenerovaný SSH príkaz na kopírovanie odkazoval na cestu k SSH kľúču vnútri kontajnera, ktorá na hostiteľskom stroji vôbec neexistovala — skopírovaný príkaz by v reálnom termináli zlyhal.

Spoločný menovateľ všetkých týchto nálezov: žiadny z nich sa nenašiel len čítaním kódu. Každý si vyžadoval skutočné vyskúšanie appky — cez headless prehliadač, cez curl proti bežiacemu API, alebo priamo na reálnych dátach (existujúci skript na disku, skutočný SSH kľúč, skutočný cieľový stroj).

Rozhodnutie ísť s repom verejne — a čo tomu predchádzalo

Keď appka dorástla do stavu, že dávalo zmysel zvážiť zverejnenie na GitHube, prišla fáza, ktorá sa dá zhrnúť jednou vetou: appka, ktorá funguje na tvojom stroji, nie je automaticky appka, ktorú je bezpečné dať niekomu inému.

Konkrétne kroky pred prvým verejným pushom:

  • Kompletný audit git histórie aj kódu na osobné údaje, heslá, IP adresy a e-maily — nič sa tam nenašlo, ale overenie prebehlo systematicky, nie len "malo by to byť v poriadku".
  • Test skutočnej prenositeľnosti: čerstvý export repozitára nasadený na úplne inom stroji (inú architektúru) ukázal vtedajších 29 generických šablón (knižnica medzitým narástla, pozri nižšie) a nulu osobných skriptov — appka teda naozaj nepredpokladala prítomnosť konkrétneho prostredia.
  • Sandbox bug objavený tesne pred auditom: chýbajúca skupinová oprávnenie pre neroot kontajner na prístup k Docker socketu spôsobovala, že sandbox v skutočnosti nefungoval presne podľa vlastnej dokumentácie — opravené a naživo overené predtým, než sa appka vôbec zvažovala ako niečo, čo by mal vidieť niekto iný.
  • Vlastné bezpečnostné nálezy nad rámec pôvodného review — obmedzenie ciest, z ktorých appka smie importovať skripty (proti prípadnému path traversal), a server-side validácia SSH ciest namiesto spoliehania sa len na klientskú stranu.
  • 28 automatizovaných testov reálne spustených (nie len napísaných), prvý GitHub Actions CI beh, README prepísané s vlastnou sekciou o bezpečnostnom modeli a známych obmedzeniach, samostatné SECURITY.md.

Repozitár zostal istý čas zámerne súkromný aj po tom, čo bol už pripravený — rozhodnutie zverejniť ho patrilo výhradne mne, appka len čakala pripravená.

Prečo appka existuje pre začiatočníkov, nie len pre mňa

Zaujímavý detail v pozadí celého projektu: dôvod, prečo appka obsahuje pomerne veľkú knižnicu vstavaných univerzálnych šablón (dnes výrazne cez sto), nie je len pohodlie. Linux som sa naučil sám, bez mentora — a presne to je dôvod, prečo šablóny cielia aj na začiatočníkov, nie len na skúseného správcu, ktorý si vie napísať čokoľvek sám.

Čo si z tohto buildu odniesť

  • Appka, ktorá vznikla z jedného otravného problému, má tendenciu byť užitočnejšia než appka navrhnutá vopred podľa zoznamu funkcií — každá pridaná vec reagovala na niečo, čo sa reálne stalo pri používaní.
  • Bezpečnostné kontroly patria od začiatku, nie ako posledný krok pred zverejnením. Detekcia natvrdo zapísaných hesiel bola súčasťou appky od prvého dňa; napriek tomu pred zverejnením ešte pribudli ďalšie vrstvy (containment ciest, server-side validácia).
  • "Otestované" by malo znamenať naozaj vyskúšané, nie len prečítané. Väčšina skutočných bugov v tomto projekte sa našla presne vtedy, keď niekto appku reálne používal — cez headless prehliadač, cez curl, na reálnych dátach — nie pri čítaní vlastného kódu.
  • Pripravenosť na zverejnenie a samotné zverejnenie sú dve oddelené rozhodnutia. Appka môže byť technicky pripravená (audit čistý, história vyčistená, testy prechádzajú) a napriek tomu zostať súkromná, kým si to sám nerozhodnem.

Sindri dnes žije ako self-hosted katalóg vlastných skriptov s AI asistovaným review, sandboxom aj vzdialeným spúšťaním — vznikol ako poznámka k inému problému a stal sa jedným z najdôkladnejšie preverených projektov v celom homelabe.

Podobný vzorec — postav, testuj naozaj, over pred zverejnením — sa opakuje aj pri Muninn (archivácia dokumentov) a MidgardOps (operačné centrum homelabu).