Která distribuce je nejlepší na server a proč právě NixOS?

24. 4. 2024
Doba čtení: 10 minut

Sdílet

 Autor: Depositphotos
Každý by si měl pořídit svůj vlastní server. Pojďme si povídat o tom, proč a jak si vytvořit svůj vlastní virtuální ostrov svobody a proč k tomu použít právě linuxovou distribuci NixOS.

Svoboda v rozmanitosti

Žijeme v době cloudové a mnohým ke štěstí stačí propojit svou bankovní kartu s nabídkou služeb globálního poskytovatele. Nelíbí se mi to. Mám rád bazar, tržiště, pestrost a i nějaký ten chaos a nedokonalost. Typizované, šablonovité řetězce obchodů, výroben hamburgerů i cloudových služeb jsou pro mě symbolem nesvobody, centralizace moci, příčinou ekonomické nerovnováhy, která nakonec vede ke kolapsu a sociálním bouřím. To je jedna věc.

Znám spoustu lidí, kteří si stěžovali na zablokování účtu na dominantní sociální síti, nemožnost odvolání, nemožnost kontaktovat zodpovědného správce, zaměstnance. Nedokážu si vůbec představit, že by si něco takového dovolil menší místní provozovatel webhostingových služeb a pokud ano, nejspíš by od něj všichni utekli ke konkurenci. O tom, že by někdo zkusil kšeftovat s daty svých zákazníků, raději pomlčím. Dobrovolně jsme si nechali oligopolizovat trh sociálních sítí.

Vězte, že existují webové stránky, konference a služby, které bez větších zásahů spolehlivě fungují i více než 10 let. Staré dobré věci fungují občas překvapivě dobře. Pokud opravdu potřebujete něco modernějšího, můžete si na svůj VPS nainstalovat server Elementu, Mastodon, Nextcloud, pořád hojně rozšířený Wordpress, Matomo namísto zvědavého Google Analytics a CryptPad namísto stejně zvědavých Google Docs. Svobodný software toho nabízí opravdu mnoho. Je k tomu potřeba právě ten dobrý virtuální server. Spousta takových serverů vytváří svobodnou síť, svobodný internet a ne žádný metainternet.

Existuje mnoho rozumných důvodů, proč upřednostňovat lokální před globálním, vlastní před cizím, proč se setkávat se skutečnými lidmi a nežít jen ve virtuální bublině.

VPS jako vlastní server

VPS je virtuální server, takže běží na nějakém skutečném stroji v nějakém kontejneru. Nebudeme se vůbec zabývat tím, jak si takový kontejner vytvořit, to by bylo na samostatný článek. Použijeme už hotový virtuál s holým operačním systémem.

VPS je v nabídce mnoha společností. Oblíbil jsem si infrastrukturu od spolku vpsFree.cz. Za členský příspěvek 300 Kč získáte velice zajímavý poměr cena/výkon, ve vpsFree milujeme servery, lze se na lecčem dohodnout, podpora je komunitní a přímo úměrná tomu, jak jsou lidé dobří a ochotní si pomáhat. Vzhledem k tomu, že nejde o klasickou komerční nabídku je řešení od vpsFree vhodné pro jednotlivce, rodinné servery, spolky a různé organizace, ale i mnohé malé i střední firmy. Jak to chodí u neziskovky, o tom vyprávěl Petr Krčmář už před lety na LinuxDays v přednášce vpsFree.cz aneb linuxový server u neziskovky. Něco se od té doby změnilo, mnohé zůstalo.

Nejvýraznější změnou, která od té doby nastala, je technologie, na které to vše běží. vpsFree používá operační systém vpsAdminOS. Jedná se o upravený systém NixOS, který slouží ke správě VPS. Opět máme záznam z jedné starší předkoronové konference, na LinuxDays 2018 vyprávěl Richard Marko na téma vpsAdminOS: moderní náhrada za OpenVZ. O samotném systému NixOS byla na téže konferenci ještě jedna přednáška od Richarda Marka a Pavla Šnajdra – NixOS.

Můžete využít i služby jiných poskytovatelů, v zásadě by většina věcí, o kterých budu psát měla fungovat podobně. Jen je potřeba si uvědomit, že se v tomto článku budeme věnovat linuxové distribuci NixOS, která nemusí být u jiného poskytovatele VPS dostupná. Lze však používat balíčky nix v jakékoliv distribuci.

Proč NixOS?

Nixos je jednou z 275 linuxových distribucí hodnocených na distrowatch.com, v žebříčku popularity se pohybuje někde kolem 20. místa. Od téměř všech ostatních distribucí se výrazně liší a má k tomu hodně dobrý důvod.

Pojďme si povídat o tom, jakou distribuci si vybrat pro svůj virtuální privátní server, a proč zrovna NixOS.

Distrowatch je pěkný katalog linuxových distribucí, ale umístění v žebříčku popularity berte s rezervou. Dvacáté místo není vůbec špatné a vůbec to neznamená, že máme k dispozici nějakých 20 objektivně lepších distribucí. Na přednějších místech v žebříčku se opakuje několik různých odvozenin Debianu a Ubuntu, nějaké variace na téma „uděláme Arch pro lidi“, pár pokusů vymanit se z byznysového objetí Red Hatu, neboli IBM. Každá distribuce má nějaký záměr, pro který vznikla. Některé se hodí spíše na desktop, vidím tam i nějaké specializované distribuce. Kterou vybrat pro server?

Statistiky používaných systémů na vpsFree ukazují, že obliba NixOS postupně roste. Debian je pořád daleko vepředu a Ubuntu mu zdatně pomáhá. V roce 2019 jsem byl v jednu chvíli jediný, kdo používal na vpsFree uživatelské VPS s NixOS, v roce 2020 to bylo 79 instalací (s meziročním nárustem +79, takže se startovalo z nuly). Vloni v lednu nás bylo už 130.

NixOS nectí Filesystem Hierarchy Standard. Tento standard si nikdo porušit nedovoluje a když vyvstane potřeba změn, je kolem toho docela složitá diskuse. NixOS na to nehledí a má vlastní pravidla. Každá normální distribuce má v /etc  plus mínus totéž, v /usr  a /var vlastně také a ani /home ničím nepřekvapí. NixOS vás překvapí velmi.

Struktura souborového systému v NixOS

Autor: Petr Živoslav Bolf

Snad by se dalo říci, že si NixOS v adresáři/nix/store vytváří svoje vlastní pravidla a prostřednictvím odkazů simuluje běžnou distribuci, respektive simuluje Filesystem Hierarchy Standard. Proč? Vysvětlení najdeme velkým písmem přímo na domovské stránce distribuce NixOS.

Reprodukovatelný
Nix staví balíčky izolovaně od sebe. To zajišťuje, že jsou reprodukovatelné a nemají nedeklarované závislosti, takže pokud balíček funguje na jednom počítači, bude fungovat i na jiném.
Deklarativní
Díky Nix je sdílení vývojových prostředí pro vaše projekty triviální, bez ohledu na to, jaké programovací jazyky a nástroje používáte.
Spolehlivý
Nix zajišťuje, že instalace nebo aktualizace jednoho balíčku nemůže poškodit jiné balíčky. Umožňuje vám vrátit se k předchozím verzím a zajišťuje, že žádný balíček není během upgradu v nekonzistentním stavu.

Aby byl NixOS reprodukovatelný a spolehlivý, používá určité linuxové mechanismy, zejména výše zmíněné symbolickém odkazy. Díky tomu je možné mít v jednom systému různé verze knihoven. To ocení nejen administrátoři, ale dokonce i vývojáři. O tom jak NixOS pomáhá vývojářům bojovat s nekompatibilními knihovnami přednášel nedávno na OpenAltu Michal Sojka v přednášce Jak zkrotit složitý softwarový stack pomocí Nixu.

Aby byl NixOS deklarativní, používá k tomu vlastní funkcionální jazyk Nix. Je to jazyk dosti neobvyklý. Upřímně, v jazyce Nix se mi píše těžko, nedokázal jsem se na něj naladit. Posuďte sami, až obhlédnete základy jazyka Nix. Nicméně vše kolem Nix zní tak krásně, že věřím i v jeho potenciál. Potřebuji si to vyzkoušet a tento experiment s vámi budu průběžně sdílet.

Moje očekávání je takové, že to bude celé fungovat jako lepší Ansible (starší seriál na Rootu – Konfigurační a orchestrační nástroj Ansible). Očekávám, že díky funkcionálnímu jazyku Nix bude správa serverů snadnější a že se s v Nixu bude lépe pracovat, než v kombinaci Yaml a Python. Budu vděčný za vaše komentáře, rady, upozornění na slepé uličky a těším se na společné hledání těch nejlepších řešení.

Konfigurace systému NixOS

Často se setkávám s doporučením používat flakes. Jedná se o modernější způsob správy systému NixOS, který je zatím v experimentální fázi. Zkoušel jsem to chviličku a nakonec se rozhodl, že k použití flakes musím postupně dospět až si na vlastní kůži vyzkouším nějaké ty otravné důvody, kvůli kterým flakes vznikly. Zde je NixOS & Flakes Book: An unofficial book for beginners a my si zatím zkusíme NixOS konfigurovat postaru. I odkazovaná kniha v úvodu ukazuje konfiguraci postaru a teprve později se věnuje použití pomocí flakes.

Deklarativní konfigurace celého systému je uložena v souboru /etc/nixos/configuration.nix. Dokumentace říká, že tento soubor lze změnit za jiný nastavením proměnné prostředí NIX_PATH. Nabízí se tak možnost změnou této proměnné sestavit úplně jiný systém. Dokumentace také říká, že adresář /etc/nixos si můžeme verzovat například systémem Git. Někdo si v jiných distribucích takto verzuje konfigurace v /etc/**. Tam to má ale jistá úskalí spočívající v tom, že v adresáři /etc se soubory mění během instalace a aktualizace balíčků, zatímco NixOS sám v /etc/nixos  nic přepisovat nebude. Ten si řádí po svém v adresáři  /nix.

Pokud máte jako já vytvořený VPS na vpsFree a jako hostitelský systém jste zvolili některou z verzí NixOS, pak more /etc/nixos/configuration.nix nám ukáže něco takovéhoto:

# /etc/nixos/configuration.nix

{ config, pkgs, ... }:
{
  imports = [
    ./vpsadminos.nix
    ./barbaros/
  ];

  environment.systemPackages = with pkgs; [
    vim
  ];

  services.openssh.enable = true;
  services.openssh.settings.PermitRootLogin = "yes";
  #users.extraUsers.root.openssh.authorizedKeys.keys =
  #  [ "..." ];

  systemd.extraConfig = ''
    DefaultTimeoutStartSec=900s
  '';

  time.timeZone = "Europe/Prague";

  system.stateVersion = "24.05";
}

Tohle už není originální soubor, provedl jsem v něm nějaké drobné úpravy. Všimněte si této části:

...

imports = [
    ./vpsadminos.nix
    ./barbaros/
  ];

...

Soubor ./vpsadminos.nix přidali chlapci z vpsFree a je v něm uložena základní konfigurace systému. Můžete se do souboru podívat a uvidíte, že jsou tam síťová nastavení a nějaké další věci pro fungování holého systému, včetně nezbytného SSH.

Cestu ./barbaros/ jsem do importu přidal já. Je to název adresáře, ve kterém budu mít konfiguraci svého serveru. Proč se adresář jmenuje zrovna barbaros by bylo na delší povídání. Je to název mého projektu. Můžete si zvolit jiné jméno, jaké jen budete chtít. Důležité je to, že budeme mít adresář, kde budeme mít vlastní konfiguraci a který si budeme verzovat v Gitu.

Protože ./barbaros/ je adresář, při importu se ve skutečnosti odkazuje na soubor ./barbaros/default.nix. Do tohoto souboru začneme psát svou konfiguraci. Já jsem začal takto:

nix

{ config, pkgs, ... }:
{

     imports = [
        ./packages
        ./services
        ./users
        ./sites
    ];

}

Rozdělil jsem konfiguraci do dalších souborů, které naimportuji.

$ tree nixos
nixos
├── barbaros
│   ├── default.nix
│   ├── packages
│   │   ├── default.nix
│   │   ├── fish.nix
│   │   ├── mariadb.nix
│   │   ├── nginx.nix
│   │   ├── php.nix
│   │   └── postgresql.nix
│   ├── services
│   │   ├── default.nix
│   │   ├── firewall.nix
│   │   └── nfs.nix
│   ├── sites
│   │   ├── default.nix
│   │   ├── www.example.com
│   │   ├── blog.example.com
│   └── users
│       ├── default.nix
│       └── admin.nix
├── configuration.nix
└── vpsadminos.nix

Rozhodl jsem se pro jednoduchou adresářovou strukturu a rozdělil konfigurační soubory pro instalaci balíčků, nastavení služeb, nastavení http serverů a nastavení uživatelských účtů. Zda se takové rozdělení v praxi osvědčí, nebo nikoliv, to ještě netuším. Už teď se trochu překrývá nastavení v /packages, kde instaluji i databáze MariaDB a PostgreSQL a zároveň tam nastavuji i služby, pod kterými na serveru běží.

Ukázka nastavení a trable s dokumentací

Pojďme se podívat jak se instaluje například databáze MariaDB. Chci MariaDB a ne MySQL. V NixOS ale nastavuji službu services.mysql, ve které teprve řeknu, že žádám balíček pkgs.mariadb namísto očekávaného mysql. To je trochu matoucí, ale jinak je celé nastavení databáze jednoduché.

{ config, pkgs, ... }:
{

    services.mysql = {
        enable = true;
        package = pkgs.mariadb;
    };

}

První dojem skvělý. Databáze běží a je s tím mnohem méně práce, než v klasické linuxové distribuci.

Podobně snadno jsem zprovoznil Nginx, respektive jeho klon Angie, PostgreSQL, PHP a dokonce i WordPress. Dokumentaci zde opisovat nebudu, příklady si můžete najít sami na wiki dokumentace NixOS MySQL.

Když chcete víc

Pak to přišlo. Na té wiki jsou některé návody podrobnější, jiné docela stručné. Trápil jsem se s WordPressem, který z nějakého důvodu nechtěl používat databázi, kterou jsem se mu snažil nastavit. Vzápětí jsem narazil i na potíže s MariaDB.

Měl jsem potřebu nastavit si logování SQL dotazů, neboli předat službě mysld parametr --general-log-file. Nastalo úporné hledání v celém internetu, jak to zapsat do souboru  .nix. V dokumentaci není nic víc, než výše uvedený příklad. Už jsem začínal propadat beznaději a pak jsem objevil vyhledávač nastavení search.nixos.org/options. Je to poněkud zvláštní způsob práce s dokumentací, ale dá se v ní celkem intuitivně vyhledávat, co lze kde nastavit.

Nix je pro mě taková tajemná černá skříňka, do které hodím konfiguraci a vypadne funkční server. Pokud mám někde chybu, pak mi builder vynadá a já můžu chybu v nastavení opravit, starý systém se nenaruší a nepřepíše. Tohle je skvělé a v tomto způsobu správy NixOS nad ostatními linuxovými distribucemi vyniká.

Jazyk Nix, ve kterém se konfigurace systému píše, je mocný, zdá se mi, že se poměrně těžko učí a člověku trvá, než mu přijde na chuť. Nemile mě překvapilo docela složité hledání, co a jak kde nastavit. Nastavení jsou podobná jako v obvyklých konfiguračních souborech používaných jinými distribucemi, ale není to tak přímočaré.

Když si prohlédneme zdrojový soubor samotného balíčku, opět zůstanu u toho MySQL, vidíme, jak se vytvářejí a deklarují všechny ty parametry. Většinou se používá funkce mkOption. Ke každé konfigurační volbě, na kterou jsme zvyklí v ostatních distribucích, by měl autor balíčku vytvořit deklaraci proměnné pro Nix tímto způsobem. Hlubší vhled do toho, jak to v útrobách funguje, popisuje článek How do Nix builds work? 

bitcoin_skoleni

Teď už není NixOS tajemná černá skříňka, ale zhruba chápeme, jak to vše funguje. Do příště se budu snažit na svém VPS rozchodit webový server s několika běžnými webovými aplikacemi – WordPress pro webové stránky, ale i statické stránky, které mnohdy postačí, Matomo jako alternativu k analytickému nástroji od Google, Nextcloud, možná i Peertube a něco pěkného o tom napíšu.

Budu rád za zpětnou vazbu, zkušenosti zkušenějších nixových mazáků uvítám.

Autor článku

Přesvědčený příznivec open source, od roku 1998 používá Linux, postupem času vyzkoušel několik různých distribucí. Programuje v několika jazycích, jako PHP, Python, C a poslední roky se mu nejvíce líbí jazyk Nim. Od roku 2015 je také členem spolku vpsFree.cz.