Self-hostování sociálních sítí

Cyril Šebek • 22. 11. 2024 17:42:25

Koncem června 2024 jsem, díky konci školního roku a přibývajícímu volnému času, konečně dokončil většinu nastavování na svých serverech. Vše, co jsem chtěl i potřeboval, už stabilně běželo, všechny aplikace fungovaly, jak měly, a já tak konečně získal čas si trochu hrát.

Vzhledem k tomu, že jsem nikdy předtím žádné sociální sítě moc neměl a nepoužíval, a vzhledem k situaci ohledně Twitteru/X — která mě výrazně odrazuje od zapojení na jakoukoli sociální síť — vzpomněl jsem si na projekt, který jsem objevil před pár lety: Mastodon. Při následném průzkumu jsem narazil i na tehdy rychle rostoucí Bluesky.

Mastodon

Mastodon je decentralizovaná sociální síť, což znamená, že servery nepatří jedné velké společnosti, ale členům komunity. Každý si tedy může hostovat svůj server. To dává smysl, že? Mám server, tak si samozřejmě můžu hostovat, co se mi zlíbí. Ale jaký to asi bude mít dosah? Tady přichází kouzlo federace — nezáleží na tom, který server je váš domovský, všechny servery spolu komunikují v rámci jednoho systému, tzv. Fediverse. Tento vesmír Mastodonu funguje na protokolu ActivityPub, což je technologie, díky které Mastodon žije.

Proč si self-hostovat Mastodon

Důvodů může být několik. Jednou z možností je vytvoření Mastodon serveru pro zájmové skupiny, firmy nebo korporace. Pro mě je však hlavním důvodem absolutní svoboda. Mastodon nemá centrální pravidla — každý server si může určit vlastní politiku, co je a není v pořádku.

Self-hostování Mastodonu

Na internetu najdete mnoho zdrojů, jak si Mastodon nainstalovat, včetně oficiální dokumentace. Nebudu proto podrobně rozepisovat každý krok; zájemci si vše snadno vyhledají a přizpůsobí svým potřebám.

Já jsem Mastodon nainstaloval na nový kontejner Debian 12 (LXC CT) na svém Proxmox serveru. Upozornění: Mastodon je poměrně náročný na úložný prostor, což jsem zjistil až později. Moje instance zabírá přibližně 60 GB. Doména mého serveru je mastodon.cyrilsebek.cz; jiné domény nevlastním, takže si musím vystačit se subdoménami.

Automatické mazání

Když jsem poprvé nainstaloval Mastodon s asi 20GB úložiště tak všechno vypadalo v pořádku. Ovšem další den se něco stalo, protože moje instance neodpovídala. Po hledání problému jsem zjistil, že problém je s místem na disku. Rozšířil jsem tedy kapacitu a všechno bylo v pořádku. Další den byl ale problém zpátky. A znovu. Když už se moje instance začala dostávat ke 100GB došlo mi, že něco asi není úplně správně. Po nějakém hledání jsem zjistil, že Mastodon si sám žádným způsobem nečistí úložiště a stahuje toho dost, veškerá data která zobrazuje (což znamená jistou část celé sociální sítě!). S pomocí internetu jsem tedy vytvořil skript, který maže data starší 4 dnů:

#!/bin/bash

# Mastodon běží hodně v Ruby, musíme tedy inicializovat Ruby prostředí
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

# Pročištění "cizích" účtů, které nemají žádné interakce s lokálními uživateli
RAILS_ENV=production /home/mastodon/live/bin/tootctl accounts prune;

# Smazání statusů "cizích" účtů, starších 4 dnů, které nemají žádné interakce s lokálními uživateli
RAILS_ENV=production /home/mastodon/live/bin/tootctl statuses remove --days 4;

# Smazání medií staších 4 dnů
RAILS_ENV=production /home/mastodon/live/bin/tootctl media remove --days 4;

# Smazání metadata/hlaviček starších 4 dnů 
RAILS_ENV=production /home/mastodon/live/bin/tootctl media remove --remove-headers --include-follows --days 0;

# Smazání náhledů odkazů starší 4 dnů
RAILS_ENV=production /home/mastodon/live/bin/tootctl preview_cards remove --days 4;

# Smazání "osiřelých" souborů (nejsou spojené s žádným příspěvkem)
RAILS_ENV=production /home/mastodon/live/bin/tootctl media remove-orphans;

a protože běží na linuxu tak jsem následně přidal do crontabu pro uživatele Mastodon, aby tento skript pustil automaticky každé asi 3 hodiny

0 */3 * * * /bin/bash /home/mastodon/purge-media.sh

Bluesky

Bluesky je také sociální síť podobná twitteru/X. Je výrazně mladší než Mastodon - který vznikl v roce 2016 - Bluesky je implementace protokolu ATProto, původně z roku 2019 pod twitterem. V roce 2021 se osamostatnilo od twitteru úplně a nyní je samostatnou společností, ale ne jako Mastodon neziskovou. Aktuálně je asi nejrozšířenější alternativou k twitteru/X, mimo jiné i díky podpoře zakladatele twitteru Jacka Dorseyho. K dnešnímu datu - 22.11.2024 - má Bluesky asi 21.5 milionu uživatelů.

Self-hostování Bluesky PDS

ATproto protokol funguje trochu odlišně od ActivityPub protokolu. Jednotlivé “homeservery” jsou označovány jako PDS - personal data server. Proces instalace je ovšem výrazně snazší než pro Mastodon - v zásadě celý instalační proces je automatický pomocí jednoho skriptu, manuální nastavování je minimální. Postup instalace je popsán na oficiálním githubu.

Nginx vs. Caddy

Automatický instalační skript se pří spuštění zeptá na doménu, pod kterou by měl být veřejně dostupný. Následně si sám zajistí, zda-li k oné doméně opravdu má přístup, zařídí veškeré SSL/TLS certifikáty a nastaví Caddy jako reverse proxy. Pro méně technicky zdatné uživatele je to vskutku ideální řešení. Pro mě to ovšem byl problém navíc. Moje homelab prostředí je z venku přístupné pouze přes jednu veřejnou IP adresu a mám pouze jednu doménu, na které je dost věcí (pomocí subdomén). Od první iterace mé domácí laboratoře používám jako reverse proxy Nginx (nebo z něj derivované OpenResty). Přes ten mám řešené certifikáty i posílání dotazů ke správným aplikacím běžícím na různých fyzických i virtuálních strojích. Trochu mi dalo zabrat, než jsem tento problém vyřešil, ale nginx naštěstí podporuje stream modul. To je druh konfigurace, při kterém Nginx pouze zjistí “komu má dotaz jít” a dál se s ním nezabývá. Možná to není nejideálnější řešení, správně bych měl asi upravit instalační skript, Caddy úplně zrušit a nechat všechno řešit nginx. Já jsem ale líný. Takže následující nginx konfigurace je pro mě dostačující. Navíc má výhodu, že pokud bude něco dalšího, co by mělo jít bez úprav k jiným serverům, tak to bude snadné přidat.

stream {
    # Define a map to route based on SNI
    map $ssl_preread_server_name $backend {
        bsky.cyrilsebek.cz 10.69.13.212:443;
        default 127.0.0.1:8443; # Fallback backend or drop the connection
    }

    server {
        listen 443;
        listen [::]:443;

        # Enable SNI inspection
        ssl_preread on;

        # Route traffic to the correct backend
        proxy_pass $backend;
    }
}

Závěr

Self-hostování ani jedné ze sítí není nijak složité, ale Bluesky je nesporně uživatelsky jednodušší a zvládnou ho selfhostovat i technicky méně zdatní uživatelé. Není také potřeba řešit problémy s místem ani ničím jiným, všechno je vyřešené a prostě funguje. Samozřejmě, ani jednu ze sítí není nutné hostovat, dají se používat i s využitím serverů poskytovaných jak společnostmi zodpovědnými za vývoj platforem, tak množství komunitních serverů. A díky federalizaci obou protokolů je ve výsledku skoro jedno, který server je váš homeserver (nebo PDS). Co se komunit týče, nejsem žádný expert, twitter/X jsem nikdy neměl a na moc dalších sociálních sítích také úplně nejsem, ale Bluesky je výrazně aktivnější než Mastodon. Pro ty, co hledají náhradu za twitter/X je Bluesky asi lepší volba. Mastodon je ovšem také, byť možná na self-hostování technicky náročnější, možnost. Zůstávám na obou.