Staré Roští je vypnuté
Před pár minutami jsme vypnuli poslední servery starého Roští. Naučilo nás mnohé a minimálně pro mě tu bylo od mých Pythoních začátků. Poslední čtyři roky se nikam neposunulo a plně ho nahradilo nové Roští. Nakonec jsme došli do bodu, kdy jsme museli jeho provoz dotovat a tak bylo vypnutí nevyhnutelné. Tyto minuty jsou tak tlustou čárou za minulostí a časem k nějakému zhodnocení těch sedmi let. Byly to roky plné chyb a učení se, ale i dnes máme kam jít.
Tak nějak je u nás špatným zvykem, že děláme některé nepříjemné věci na poslední chvíli a proto ještě před dvěma týdny bylo na starém Roští závislé DNS a v posledních hodinách doháníme migraci SMTP serveru. U DNS serverů nám to ale pomohlo, protože jsme se mohli pořádně připravit a problémy s tím spojené jsme měli nakonec pouze tři. Dva se týkaly konkrétních domén a pak se nám podařilo vypnout doménu rostiapp.cz na celou hodinu – naštěstí mezi 23:00 a půlnocí. Navíc jsme ji chvíli propagovali jako 127.0.0.1 a i když máme TTL na 3600s, některé resolvery s agresivním cachováním se rozhodli, že si ten localhost nacachují na celý den.
Celá chyba měla dlouhou historii. Během jedné z migrací IP adres před dvěma lety jsme v databázi u rostiapp.cz a pár dalších domén, které už neexistují, nastavili 127.0.0.1 a ::1 u A a AAAA záznamů. Nikdy ale nedošlo ke commitu těchto změn do DNS serveru, takže když jsme teď vygenerovali zóny nové, překvapení to bylo veliké. Naštěstí monitoring rychle zareagoval a tak to mohlo být opraveno zavčasu.
Práce na starém Roští začaly někdy kolem roku 2011. Tenkrát jsem Roští ještě dělal sám a prvních 50 aplikací zvládl obsloužit tenkrát relativně čerstvý procesor Atom. CoolHousing měl akci na pronájem serveru za pár korun s Atomem, 320 GB diskem a 2 GB RAM. V té době to byla velká čísla a stovky obsazených MB paměti byla spíš doména Ruby a ne Pythonu. Pár aplikací se tam tedy vešlo.
Fun fact: Server běžel na Atomu a já jsem v té době měl Asus EEE 1000h také s Atomem. Většina kódu staré administrace byla napsána na tomto 10″ stroji.
Nicméně Roští začaly využívat i projekty, které na něj samozřejmě spoléhaly. Velký eshop s autodíly by neměl běžet na Atomu a jednom pomalém disku, i když optimalizaci jeho vývojáři zvládli na jedničku. Koupil jsem nový server a Roští přesunul. S přesunem se Roští trochu transformovalo. Aplikace se oddělily pod vlastní systémové uživatele a prostředí se standardizovalo. Řekl bych, že v tento moment Roští dospělo. Koupil se další server a stejně jako ten původní měl 6 jader, disky v RAIDu a 32 GB RAM. Od této chvíle měli naši klienti jistotu, že když se něco stane, zvládneme s tím něco dělat. O našem zázemí jsme ale moc nemluvili.
Během vývoje starého Roští jsem udělal jednu zásadní chybu, že jsem se snažil konkurovat běžným PHP hostingům a to jak cenou, tak tím, že jsem kopíroval jejich side služby jako jsou emaily nebo FTP přístup. Pro provoz moderní aplikace je obojí nesmysl, protože na emaily existují specializované služby a FTP přístup je neskutečný hack v jakékoli moderní infrastruktuře. Zkuste si provozovat třeba FTP server v Kubernetes, aniž byste exportovali 10 portů, byli jste kompatibilní s většinou klientů a zároveň zachovali nějaký výkon. Měli jsme se od začátku soustředit na nabídku hostingu pro stateful aplikace a nic na tom neměnit.
Zatímco jsem Roští dělal já a občas mi pomohl můj bratr, šel vývoj ve vlnách. Měsíc jsem na něčem pracoval a pak třeba měsíc nebo dva nic. V té době na podporu chodil dotaz jednou týdně, takže business to nebyl náročný.
Někdy v roce 2014 jsem poznal Martina Voldřicha, se kterým jsme se dali dohromady a navrhli to co znáte dnes jako nové Roští. Martin se zasloužil o design administrace, o spoustu kódu kolem emailů, plateb, DNS i aplikací samotných. Já měl na starosti backend. Tenkrát byl Docker v plenkách. Když jsme ho testovali, prakticky každý den nějaký kontejner crashnul. To byl květen a my chtěli 1. srpna novou administraci spustit.
Fun fact: Backend pro aplikace vznikl za víkend jako prototyp Django knihovny pro správu Docker kontejnerů v Django administraci. Byl ještě dvakrát přepsán, ale základní myšlenka a databázové modely zůstaly do dnes. V současné době tuto část vnímáme jako riziko a brzdu a plánujeme ji přesunout do mikro servicy napsané v Go.
Používali jsme Docker + Btrfs. Byly to těžké časy, technologie fungovaly na stole, ale v produkci jsme pak o data přišli dvakrát během dvou měsíců. V obou případech pomohla záloha, ale i tak to zamrzelo, protože jsme museli nasadit aufs, o kterém jsme netušili absolutně nic, ale nemohli jsme čekat než si ho vyzkoušíme. Naštěstí fungovalo bez problémů.
První měsíc po spuštění jsme řešili extrémní množství chyb a za celou tu dobu si jeden uživatel dobil kredit za přesně 100 Kč. Při jednom obědě jsme se tomu smáli a přemýšleli co s tím. Důvodem byly určitě chyby, ale těch jsme se rychle zbavili, takže jsme museli dát o novém Roští vědět více lidem.
Oba jsme měli ještě normální práci a tak jsme se setkávali o víkendech a bez spánku dávali dokupy nové vlastnosti. Během roku jsme pak nové Roští ještě víc vylepšili, odstranili další hromadu chyb, finalizovali kód kolem plateb, přepisovali kód, který úplně nefungoval a doplňovali věci, o kterých jsme si mysleli, že by mohli uživatele zajímat. Během těchto dvoudenních sprintů se Roští posunulo jako nikdy předtím.
Fun fact: V této době jsme si zařídili dočasnou víkendovou kancelář ve skladu Bazarobotu, kde jsem pomáhal s automatizací některých procesů. V té době v Hradci začínala Pizza Sprint. Když jsme měli session, vždy jsme si objednávali jídlo tam, i když se jim ho dělat moc nedařilo. Během několika měsíců se ale zlepšovali a byl to pro nás impulz, že my můžeme taky.
Rostli jsme. Měli jsme najednou 6 docela velkých serverů, objížděli konference, občas o něčem mluvili, podporovali PoSobotu, někdy se setkali na PyVo a na Roští pracovali z nové kanceláře v Hradci Králové. Později jsme našli programátora Marka, který v té době měl programování jako koníček, ale profesionálně to nikdy nedělal. Na Roští jsme ho naučili jak se dá programováním živit a prakticky všechen kód napsaný mezi prázdninami 2016 až do teď je hotov díky němu.
V této době se staly tři věci, které Roští poslali úplně mimo nastavený kurz. Martin se začal věnovat jiným projektům a později firmu úplně opustil. Než se tak stalo, kývli jsme na hosting pro přibližně 50 starých projektů napsaných v Pythonu, Ruby a PHP. Zpětně se jednalo o úplně nesmyslnou transakci, protože Roští na tento typ klientů nebylo vůbec připravené a původní firma měla službu nastavenou úplně mimo ekonomickou realitu, čemuž odpovídala i připravenost jejich klientů na plánované změny. Tenhle deal byla taková facka, že se Roští zastavilo prakticky na rok, finančně drhlo, přestalo růst a hlavně byla úplně zničena motivace, bez které se pokračovat nedalo.
Původní firma těmto klientům nabízela podporu, tedy změny na webech na přání, samotný hosting a emaily. To všechno za ceny od 20 do 250 Kč. Ze dvou serverů byly tři a i když součástí dohody bylo, že samotnou migraci provede další firma, tak ta nebyla schopna klienty přesvědčit, že zadarmo se weby nepřesunou a podporu za 100 Kč měsíčně také nedostanou. Jenže servery jsme měli pod správou my a náklady šly za námi bez ohledu na to, co se stane.
Během roku jsme se prakticky nevěnovali ničemu jinému, protože přesunout jeden projekt je několik dní práce. Řešily se tam závislosti, které už se nedají sehnat, smíchané virtualenvy, staré knihovny, co nefungují s Pythonem 2.7 (náš nejstarší podporovaný Python), staré nepodporované PHP, které jednoduše odmítáme provozovat, Ruby, o kterém skoro nic nevíme a nebo komunikace s klienty o tom, že budou muset začít platit jinak a dělat změny v DNS. I když se web podařilo přenést, objevil se na něm bug, který vyžadoval hodiny a hodiny práce. Kdybychom měli takto přenášet každý web, v ceně hostingu by se nám to nevrátilo ani za 10 let a žádný z klientů nebyl ochotný migraci zaplatit.
Řešení se táhlo a tři nové servery, kde jeden byl managovaný za úplně nesmyslně vysokou cenu a dva byly super drahé EC2 instance v AWS, Roští poslaly do mínusu. Chvíli jsme to drželi, ale řešení trvalo dlouho, protože vyžadovalo komunikaci s klienty, kteří většinou netušili nic o tom, co vlastně provoz takového webu obnáší. Kdybych měl vyčíslit cenu tohoto rozhodnutí, dostanu se někam k nižším stovkám tisíc a věřím že jsme ztratili i kredit u našich klientů. Nakonec u nás zůstalo asi 8 z těchto 50 aplikací a u některých víme, že během pár měsíců zmizí.
Nemůžu říct, že je tato kapitola za námi, ale už neohrožuje existenci samotného Roští. Všechny tři servery jsme zrušili nebo přenesli jejich náklady plně na uživatele, co tam chtějí mít za každou cenu svůj web. Zároveň jsme udělali i nějaké změny v přístupu. Nabídky na převzetí aplikací odmítáme s poděkováním. Uživatelům už nepomáháme řešit problémy v jejich kódu. Zrušili jsme podporu po telefonu a nabízíme ji jen velkým klientům, kteří si za ní zaplatí. Rozhodli jsme se zjednodušit infrastrukturu a vypnout staré Roští a emaily.
Zmínil jsem tři věci, ale psal jen o dvou. Zatímco jsme bojovali, jsme se rozhodli zbavit fyzických serverů. Objevili jsme službu ScaleWay provozovanou obrovským korporátem Online.net. Testovali jsme jejich služby rok a během té doby měli jen minimální problémy. Došlo tedy na migraci nového Roští pod ScaleWay a problémy se mohli rozjet naplno.
Už tak špatnou finanční situaci jsme zhoršili náklady na nové servery ve ScaleWay. Nově pořízené servery se chovaly úplně jinak než ty staré testovací. Několikrát jsme přišli o data, podpora reagovala jen mezi po-pá 8:00 až 16:00 bez ohledu na závažnost problému. O víkendu bylo možné se dovolat, ale nikdo, kdo by mohl problém řešit, na podpoře nebyl. V té době jsme začali ztrácet klienty, i ty co byli na Roští od jeho začátků. Navíc jsme nemohli zrušit fyzické servery, protože hrozilo, se s novým Roštím zase vrátíme zpět. Vydrželi jsme to asi čtyři měsíce a když už byla situace nejzoufalejší, DigitalOcean přišlo s 50% zlevněním, což se stalo kompatibilní s naším ceníkem a během třech týdnů jsme se přestěhovali tam.
I když je ceníkově DigitalOcean i po slevě mnohem dražší než ScaleWay, výkonem je úplně někde jinde a platíme jen o $100 více než jsme platili u ScaleWay. Ze dne na den tak přestaly naše problémy. Nedocházelo ke ztrátě dat, podpora reaguje hned bez ohledu na denní dobu, zlepšil se výkon hostovaných aplikací a my si mohli zase oddechnout a začít připravovat zbavení se fyzických serverů, protože u DigitalOcean nějaký čas zůstaneme.
Po všech problémech jsme zavedli změny, díky kterým nám klesly náklady na podporu, snížila se složitost systému, zvedla se spolehlivost (některé weby měly u nás za poslední tři měsíce dostupnost i 100%), vrátila se nám chuť zase pokračovat a posunovat Roští dál. Máme v plánu se vrátit ke konferencím, kde jsme získávali nejvíce nových uživatelů, chceme administraci rozdělit ještě více mezi mikro služby, našli jsme možná způsob, jak snížit cenu hostingu o desítky procent, plánujeme vylepšení našeho SMTP serveru, dokumentace a UX administrace a chceme o sobě dávat mnohem víc vědět než jsme dávali doposud.
Děkujeme vám, že jste to s námi vydrželi, přestože to někdy nebylo jednoduché. Čekali jsme na tento den dlouho a čím blíž byl, tím častěji se odkládal. Toto pondělí je tedy jiné než ostatní pondělí, protože až ráno vstaneme, budeme se moci nadechnout a těšit se zase na to, co nás čeká.