Wat ik zelf host

Onlangs heb ik een paar jaar in India gewoond, waar streamingdiensten naar westerse maatstaven extreem goedkoop zijn. We hadden Netflix, Disney Plus (Hotstar in India) en Spotify. Na mijn vertrek uit India was ik niet bereid om westerse prijzen voor deze diensten te betalen. Daarnaast was ik genoeg van de 'engagement treadmill', vooral voor mijn zoon. We wilden zijn kijkkeuzes beperken tot bepaalde programma's, maar de constante "aanbevolen voor jou" en "volgende" suggesties zorgden voor conflicten. Hoewel er manieren zijn om inhoud te beperken tot specifieke titels of autoplay uit te schakelen, is het doen hiervan voor elke dienst — en het bijhouden van wanneer cliëntapplicaties veranderen en opnieuw geconfigureerd moeten worden — simpelweg te veel werk.

Daarom heb ik in een andere zin de "cord gesneden": ik heb streamingdiensten ingeruild voor een zelfgehoste Jellyfin. In de anderhalf jaar die volgden, opende Jellyfin de deur naar het self-hosten van veel andere diensten, waardoor mijn afhankelijkheid van cloudproviders afnam en er een welkome stabiliteit ontstond. Ik word niet langer constant geconfronteerd met onnodige website-redesigns, nieuwe functies van twijfelachtige waarde en een barrage aan e-mails over updates van servicevoorwaarden, bindende arbitrage, datalekken, enzovoort. Ik lees de release notes van nieuwe versies van de software die ik host en beslis zelf of en wanneer ik wil upgraden.

Grondregels

Ik hanteer een paar basisregels.

Ten eerste stel ik, met uitzondering van VPN-servers die op mijn router draaien, geen enkele dienst direct open naar het publieke internet. Het maakt me niet uit hoe handig dat zou zijn of hoe veilig een applicatie is. Vooral met AI-ondersteunde hacking vind ik dit simpelweg niet verstandig. Bovendien gebruikt mijn ISP CGNAT voor zijn IPv4-adressen, waardoor mijn thuisnetwerk via IPv4 niet direct bereikbaar is vanaf het publieke internet. Mijn VPN-servers zijn alleen publiek routeerbaar via IPv6; een beperking die nadelen heeft, maar werkbaar is voor mijn gebruiksscenario's en waarschijnlijk helpt bij het beperken van ongewenste verbindingspogingen. Het grootste nadeel is dat mijn VPN bijna nooit functioneert op een openbaar wifi-netwerk, aangezien deze zelden IPv6 aanbieden. Wanneer ik mijn telefoon gebruik, kan ik wifi uitschakelen en via mobiele data verbinden... mits er bereik is.

Ten tweede geef ik de voorkeur aan het native draaien van diensten wanneer dat mogelijk is, maar ik gebruik containers voor complexe diensten of diensten met veel afhankelijkheden. Ik ben dol op een dienst die een enkel Go-binair bestand is. Een dienst die alleen als Docker Compose-bestand wordt geleverd en MySQL, Redis en drie andere containers wil draaien? Dan zoek ik direct naar een alternatief. Als de afhankelijkheden niet overweldigend zijn, is native beter, sneller en efficiënter. Ik kan dezelfde beheertools en commando's gebruiken over meerdere diensten heen. Er is geen mentale overhead van het moeten inloggen in een container om een commando uit te voeren, om er vervolgens achter te komen dat deze container curl mist, dat een andere busybox gebruikt waardoor alle argumenten anders zijn, of het moeten dealen met een virtueel netwerk en host-port mapping.

In datzelfde kader gebruik ik geen Docker meer. Dit is niet zozeer een principiële positie, maar ik was het zat om een volledig apart systeem voor servicebeheer op mijn server te moeten beheren. Ik gebruik al systemd, en op dit moment is de integratie van Podman met systemd uitstekend.

Hardware

Vorig jaar kocht ik een Beelink Mini PC, specifiek een S12 Pro met een Intel N100-processor, 16 GB RAM en een 512 GB interne SSD. Dit was vóór de "rampocalypse", dus ik betaalde 180 euro. Dezelfde vermelding op Amazon is momenteel 359 euro. Pijnlijk! Aan de server is een harde schijf van 6 TB gekoppeld voor mediageheugen.

Mijn reactie op Hacker News over wat ik self-host riep vragen op over hoe dit alles op 16 GB RAM zou kunnen draaien. Zoals ik hieronder beschrijf, heb ik een aantal keuzes gemaakt die de resource-vraag op mijn server verminderen, maar uiteindelijk blijkt dat je niet veel hardware nodig hebt om veel zaken te draaien. Natuurlijk voer ik geen lokale AI-inferentie uit op deze hardware, maar voor alles wat niet AI-gerelateerd is, werkte het direct uit de doos of met enkele eenvoudige configuratietweaks.

Services

In alfabetische volgorde.

Actual Budget

Budgetsoftware met desktopclients en een webapplicatie, aangepaste rapporten en categorisatie op basis van regels. Ik gebruik dit alleen voor budgettering en het bijhouden van betaal-, spaar- en creditrekeningen. Voor het bijhouden van beleggingsrekeningen gebruik ik een clouddienst. Op een dag zal ik proberen daar ook vanaf te komen.

Hoewel Actual Budget automatische transactie-import van diverse banken ondersteunt, gebruik ik deze functie niet. In plaats daarvan download ik aan het einde van elke maand de transacties van de voorgaande maand (bij voorkeur in OFX-formaat, CSV als er geen andere optie is) en importeer ik deze handmatig. Dit werkt voor mij omdat ik Actual Budget primair gebruik voor het bijhouden van uitgaven, en niet voor... daadwerkelijk... budgetteren.

  • Implementatie: Podman.

Audiobookshelf

Hiermee kun je audioboeken en podcasts toevoegen, downloaden en opslaan op je server, om ze vervolgens op je telefoon te beluisteren. Ik heb de audiobook-functie zelf niet veel gebruikt; ik heb het vooral opgezet voor mijn kinderen, maar het heeft een zeer goede hoofdstukbehandeling. Voorheen gebruikte ik PlayerFM en later Pocket Casts voor podcasts, maar nu gebruik ik Audiobookshelf, tenzij ik van huis ben zonder VPN-verbinding.

  • Implementatie: Native.

Automatic Ripping Machine (ARM)

ARM automatiseert het rippen en transcoderen van dvd's (en Blu-rays, maar die doe ik niet). Ja, het is 2026 en ik rip nog steeds dvd's. Vergeet niet dat we de streamingdiensten hebben opgezegd, dus dit is niet alleen een manier om nieuwe content te verkrijgen, maar ook een manier om tweetalige content (Engels en Frans) te bemachtigen.

  • Implementatie: Podman.

Backrest

Een web-UI voor de Restic-backupsoftware. Back-ups zijn belangrijk! Vooral voor Immich (foto's). Restic doet het goed met het dedupliceren en comprimeren van geback-upte data, en Backrest maakt het eenvoudig om bewaartermijnen te beheren. Meldingen bij fouten gaan naar Gotify.

  • Implementatie: Native.

Beszel

Beszel is een eenvoudig monitoring-dashboard dat basisstatistieken verzamelt van agents (in de ouderwetse zin van een kleine achtergronddienst) om CPU-belasting, geheugen- en schijfgebruik, temperatuur, batterij, enz. weer te geven. Het helpt me om verschillende andere hosts in huis in de gaten te houden (verschillende Raspberry Pi's en een Proxmox-cluster dat mogelijk onderwerp wordt van een toekomstig bericht).

  • Implementatie: Native.

Caddy

Caddy is een webserver en reverse proxy. In het begin begreep ik de waarde van een reverse proxy niet en dacht ik dat het prima zou zijn om mijn diensten te benaderen via een lokale DNS-naam, of zelfs een IP-adres en poortnummer. Maar toen ik steeds meer diensten toevoegde, vereisten sommige HTTPS. Dus heb ik een domeinnaam geregistreerd (niet deze) en Caddy ingesteld om automatisch LetsEncrypt SSL-certificaten te verkrijgen. Nu zijn bijna al mijn diensten op mijn LAN (of via VPN) toegankelijk met HTTPS en vriendelijke subdomeinnamen. Het toevoegen van een nieuwe dienst is een snelle bewerking in het Caddyfile.

  • Implementatie: Native.

Cockpit

Cockpit is een web-gebaseerde admin-console voor de server. Het maakt gebruik van normale systeemauthenticatiemethoden. Voor mij is het vooral nuttig om vast te stellen welke diensten zijn uitgevallen wanneer er geen meldingen voor zijn ingesteld.

  • Implementatie: Native.

Forgejo

Forgejo is een fork van Gitea en wordt geïnstalleerd als een enkel binair bestand. De uptime van GitHub is tegenwoordig het onderwerp van veel grappen, maar ik waardeer ook de snelheid van mijn eigen git remote. Uiteindelijk zal ik CI/CD en runners instellen, al is het maar om deze blog te deployen.

  • Implementatie: Native.

FreshRSS

Een web-gebaseerde RSS-reader. Tegenwoordig bezoek ik echter in feite maar twee websites, dus ik gebruik het niet veel. Ik abonneer me wel op de GitHub-releases van sommige diensten die ik self-host, zodat ik de functies en bugfixes in nieuwe versies kan controleren.

  • Implementatie: Native.

Frigate

Network Video Recorder (NVR). Ik begon eerst met Zoneminder, omdat ik van een bepaalde leeftijd ben. Maar het werd duidelijk dat Zoneminder over zijn hoogtepunt heen is. Frigate is fantastisch geweest. Ik draai het met 8 IP-camera's. Het geeft meldingen wanneer mensen en auto's de oprit oprijden en integreert met Home Assistant om diverse automatiseringen aan te sturen (bijv. als er een persoon in de achtertuin wordt gedetecteerd, gaat de floodlight van de camera aan). Ik schrijf wellicht in de toekomst een bericht over mijn avonturen met IP-camera's.

Ik draai al mijn camera's op lagere resoluties dan ze ondersteunen, primair om netwerkcongestie op wifi te voorkomen. De meeste camera's ondersteunen ook een nog lagere RTSP-substream, die Frigate gebruikt voor bewegings- en objectdetectie. Door de cameraresoluties laag te houden, voorkom ik excessief CPU- en geheugengebruik door videoverwerking en excessief schijfgebruik door opnames. Ze zijn goed genoeg om gezichten te identificeren, en privacywetten in mijn land verbieden het filmen van openbare wegen, dus mijn camera's zijn niet op verre punten gericht.

  • Implementatie: Podman.

Gonic

Een Subsonic-compatibele server geschreven in Go. Lang geleden heb ik een permanente Subsonic-licentie gekocht, maar het oorspronkelijke project is antiek en moderne alternatieven zijn beter. Ik draai twee afzonderlijke instanties van Gonic: één voor kindermuziek en één voor muziek voor volwassenen.

  • Implementatie: Native.

Gotify

Een eenvoudige notificatiedienst geschreven in Go. Veel self-hosted diensten ondersteunen direct Gotify-meldingen of kunnen deze verzenden via een aangepaste HTTP POST. In combinatie met Uptime Kuma gebruik ik Gotify om meldingen te krijgen over diensten of apparaten die offline zijn, wat mijn kinderen kijken op Jellyfin, wanneer er een nieuwe podcast-aflevering beschikbaar is in Audiobookshelf, enz.

  • Implementatie: Native.

Home Assistant

Home Assistant verdient waarschijnlijk een eigen bericht. Het is fantastisch, en ik kan me niet voorstellen hoe ik dezelfde dingen zou kunnen bereiken binnen een propriëtair ecosysteem zoals Google Home, Amazon Alexa of Apple Home. De situatie is verbeterd nu fabrikanten standaardiseren op protocollen zoals Matter, maar de controle en flexibiliteit die je krijgt met Home Assistant is moeilijk te verslaan. Er is echter een steile leercurve, en ik moet nadenken over realistische manieren om met een potentieel serveruitval om te gaan zonder de functionaliteit van mijn huis in gevaar te brengen.

  • Implementatie: Podman.

Homepage

Op een gegeven moment realiseerde ik me dat ik zoveel diensten draaide dat ik een extra dienst nodig had om ze allemaal bij te houden. Homepage was een goede oplossing. Het heeft widgets voor bijna alle diensten die ik draai, zodat ik snel een overzicht kan krijgen van wat er gebeurt, of gewoon een snelle link naar het subdomein van een dienst heb.

  • Implementatie: Podman.

Immich

Een alternatief voor Google Photos. Ik was het zat dat Google constant betaalde opslagplannen promootte in hun apps. Ik kon mijn opslagruimte beheren, maar mijn vrouw zat altijd bijna aan haar limiet. We zijn vorig jaar overgestapt naar Immich, vlak nadat versie 2 werd uitgebracht. Het laden van pagina's vol foto's gaat veel sneller wanneer alle netwerkactiviteit binnen je eigen huis plaatsvindt. Ik heb ook een oplossing gevonden voor het delen van albums met familie. Er moet nog veel gebeuren met Immich — ik heb veel duplicaten, en nu opslag geen zorg meer is, ben ik minder gedisciplineerd geweest met het selecteren van foto's en video's.

  • Implementatie: Podman.

Jellyfin

Zoals ik in de inleiding al noemde, host ik al lange tijd mijn eigen media, teruggrijpend op MythTV van ruim twintig jaar geleden. Jellyfin is stellig over de organisatie van media, maar over het algemeen werkt het goed. Ik gebruik het alleen voor films, tv en thuisvideo's, dus ik kan niets zeggen over andere functies (e-books, muziek, foto's, etc.). Hoewel mijn zoon zich Netflix nog herinnert, is hij tevreden met Jellyfin. Ik waardeer het gebrek aan autoplay, dat ik geen aanbevelingen zie en dat ik niet door een hoop rommel hoef te scrollen om te vinden wat ik wil kijken.

Een van mijn manieren om de resource-vraag te beheren, is door over het algemeen de voorkeur te geven aan 720p-media boven 1080p of hoger. En bij het rippen van dvd's is het uiteraard 576p of 480p. Ik heb een 4k-tv, maar deze is niet extreem groot, en hoewel ik het verschil in resolutie tussen SD en HD kan zien, lijkt 720p voor bijna alles voldoende voor mij.

  • Implementatie: Podman.

Music Player Daemon (MPD)

Soms zijn er oplossingen die gewoon werken en niet echt veranderd hoeven te worden. Ik denk dat MPD er een is. Het bestaat al 23 jaar. Hoewel Gonic geweldig is voor het luisteren naar muziek op mijn telefoon (zelfs via VPN wanneer ik weg ben), is MPD de manier waarop ik muziek via Snapcast naar het audiosysteem van het hele huis stuur. Ik draai twee instanties van MPD: één voor muziek en één voor podcasts.

  • Implementatie: Native.

PocketBase

Voorheen hield ik transacties en bonnetjes voor speciale rekeningen (HSA, 529, etc.) bij in een SQLite-bestand dat ik direct benaderde met SQL Workbench/J. Maar de zaken werden ingewikkelder toen ik tussen landen, valuta's en verschillende verzekeringssystemen verhuisde, en ik wilde mijn vrouw ook de mogelijkheid geven om transacties in te voeren. Ik ben overgestapt naar PocketBase, wat uiteindelijk nog steeds gewoon een SQLite-bestand is, maar met een mooie web-gebaseerde management-frontend die ik misbruik als een generieke CRUD-frontend. Het is eenvoudig genoeg voor mijn vrouw om te gebruiken, en ik kan nog steeds willekeurige queries uitvoeren op het onderliggende databasebestand.

  • Implementatie: Native.

Readeck

Readeck stelt me in staat om kopieën van dingen die ik lees te taggen en te archiveren. Tijdens mijn masterstudie was ik een intensieve gebruiker van Zotero, maar ik hoef al jaren geen bibliografie meer te schrijven. Toch lees ik dingen waarvan ik zeker wil weten dat ik ze later nog kan raadplegen. Ik probeerde eerst Wallabag, maar dat had problemen met het archiveren van zaken achter een betaalmuur, zelfs wanneer ik op mijn telefoon was ingelogd. In tegenstelling daartoe archiveert Readeck wat mijn telefoon ziet en slaat dit op mijn server op.

  • Implementatie: Native.

Samba

Samba biedt gedeelde netwerkopslag, waardoor het eenvoudig is om bestanden naar en van de server te kopiëren, of belangrijke documenten met mijn vrouw te delen. Het is grappig hoe een bestandsdeling-protocol dat in de jaren 80 is ontwikkeld en het meest wordt geassocieerd met Windows, de beste optie blijft voor cross-platform bestandsdeling op een LAN.

  • Implementatie: Native.

slskd

IYKYK.

  • Implementatie: Native.

Snapcast

Snapcast zorgt voor gesynchroniseerde audio door het hele huis. Denk aan Sonos, maar zonder de dure vendor lock-in en geplande veroudering. Dit verdient ook een eigen bericht. Het is ingewikkeld om in te stellen, maar het werkt echt goed. Ik ben uiteindelijk van plan om wat extra apparaten aan te schaffen, primair voor gebruik als Snapcast-ontvangers.

  • Implementatie: Native.

Syncthing

Syncthing is onderdeel van een back-upstrategie voor mijn foto's in Immich. Ik heb een eenrichtingssynchronisatie (alleen ontvangen) ingesteld op mijn Macbook, zodat een kopie van alle foto's in Immich uiteindelijk terechtkomt op de externe schijf van mijn Macbook.

  • Implementatie: Native.

Transmission Daemon

Deze is zelfverklarend.

  • Implementatie: Native.

Uptime Kuma

Nadat mijn vrouw een paar keer zei "X werkt niet" en ik een dienst handmatig moest herstarten, realiseerde ik me dat ik een manier nodig had om bij te houden welke diensten draaiden, of juist niet. Uptime Kuma is eenvoudig maar heeft een nuttige set functies. Ik kan apparaten pingen om te controleren of ze online zijn, de status van Podman-containers controleren, zoeken naar HTTP 2XX-responscodes van diverse diensten, of zelfs een JSON-payload parsen en bepaalde details extraheren voor de health check. Als er iets uitvalt, kan ik een Gotify-melding sturen (na een paar pogingen natuurlijk).

  • Implementatie: Podman.

Vaultwarden

De zelfgehoste versie van Bitwarden. Jarenlang gebruikte ik KeePass, maar ik had nooit een goede synchronisatie-oplossing, dus vermeed ik het gewoon om op mijn telefoon in te loggen. Ondertussen gebruikte mijn vrouw LastPass, dat diverse lekken en incidenten had, en waarbij autofill simpelweg niet goed werkte. Haar overzetten naar KeePass was niet praktisch, dus heb ik gekozen voor Vaultwarden, een open-source API-compatibele reimplementatie van Bitwarden die werkt met de officiële Bitwarden-clients. Ik ben geen groot fan van de Bitwarden-browserextensie, maar voor het grootste deel is het prima. De Android-applicatie is goed genoeg en synchroniseert naadloos en automatisch wanneer ik verbonden ben met mijn LAN; anders kan ik via VPN verbinden en handmatig een synchronisatie triggeren indien nodig.

Ik maak me een beetje zorgen dat Bitwarden uiteindelijk vijandig tegenover Vaultwarden kan worden en de client-compatibiliteit verbreekt. Op dit moment is de enige andere grote Bitwarden-compatibele client die ik ken Keyguard, maar die heeft geen open-source licentie en gebruikt een freemium-model.

  • Implementatie: Podman.

Vikunja

Ik ben ongeveer een decennium een Trello-gebruiker geweest. Maar na de rampzalige outage van meerdere dagen bij Trello eerder dit jaar, besloot ik een self-hosted alternatief te zoeken. Ik sloot alles uit waarbij het opstarten van een PostgreSQL- of MySQL-database vereist was voor een dienst die slechts twee gebruikers bedient. Vikunja gebruikt standaard SQLite, hoewel het geconfigureerd kan worden voor andere database-backends. Het is niet perfect en de Android-applicatie mist enkele functies, maar het is goed genoeg voor mij. Deployment als enkel binair bestand? Ja, graag.

  • Implementatie: Podman.

Yubal

Een eenvoudige webapplicatie om YouTube Music-playlists te downloaden. Normaal gebruik ik yt-dlp voor het downloaden van YouTube-video's, of NewPipe voor het kijken op mijn telefoon, maar Yubal benoemt, organiseert en tagt muziek gedownload van YouTube Music correct.

  • Implementatie: Podman.

Wat ik niet zelf host

Hier zijn een paar dingen die ik niet self-host, heb geprobeerd maar heb laten vallen, of waarschijnlijk niet zal proberen.

De *arr Stack Sonarr, Lidarr, Radarr, etc. Elke keer als ik lees over de installatie, klinkt het als een resource-intensieve puinhoop die fundamenteel gevoelig is voor frequente storingen. Dat is precies het tegenovergestelde van waar ik naar zoek bij het kiezen van self-hosted diensten.

Collabora Online Hoewel het leuk zou zijn om volledig met Google te breken, is het moeilijk om Google Docs te verslaan als een zeer handige en gemakkelijk toegankelijke manier om informatie op te slaan en te delen. Toch kies ik voor LibreOffice Writer en Calc, tenzij ik een specifieke reden heb waarom het document in de cloud moet staan. Aangezien ik al een gedeelde netwerkschijf heb, lijkt het zinloos om een dienst als Collabora Online (een web-gebaseerde officesuite) te draaien in plaats van gewoon lokaal LibreOffice te gebruiken.

Firefly III Ik probeerde Firefly III voordat ik Actual Budget gebruikte, in de veronderstelling dat ik ingebouwde ondersteuning voor meerdere valuta nodig had. Het was een complexe installatie, waarbij meerdere containers betrokken waren, inclusief een container alleen voor het importeren van data. Actual Budget was veel eenvoudiger op te zetten en te gebruiken. Voor mijn vreemde valutarekeningen heb ik mijn eigen eenvoudige script om wisselkoersconversies te regelen, zodat alles in Actual Budget in USD blijft.

Owntracks Ik hou van Google Maps Timeline, maar nadat Google de locatiegegevens heeft beperkt tot het individuele apparaat, hoopte ik een self-hosted versie te vinden. Maar ik kreeg de OwnTracks Android-applicatie nooit consistent mijn positie te laten rapporteren, ongeacht welke batterij- of locatie-instellingen ik probeerde. Dawarich is een andere optie in deze ruimte, maar die wil "minimaal" vier containers draaien (PostgreSQL, Redis, Sidekiq, web applicatie). Voor mij is dat geen aantrekkelijke ruil tussen de benodigde resources en de waarde die ik er waarschijnlijk van heb.

Music Assistant Music Assistant zou beter kunnen werken voor jou als je nog geen muzieksetup hebt waar je tevreden over bent. In mijn geval had ik Gonic, Snapcast en MPD al goed werkend. Music Assistant voelde alsof het alles wilde "beheren"; zo leek het voortdurend mijn Snapcast-apparaatgroepen te herorganiseren.

E-mail Het self-hosten van e-mail lijkt veel werk voor zeer weinig voordeel. Ik kan het risico niet nemen dat ik geen e-mails kan verzenden of ontvangen. Uiteindelijk wil ik overstappen van Gmail naar een betaalde provider.

Conclusie

Dat zijn 17 native diensten en 11 Podman-diensten, allemaal beheerd door systemd. htop laat momenteel ongeveer 7,5 GB aan gebruikt geheugen zien, en CPU's die schommelen tussen 30% en 40%. Het blijkt dat deze Mini PC veel kan draaien! Gezien hoe duur computerhardware is geworden door de AI-crunch, hoop ik dat we meer self-hostbare projecten zullen blijven zien die prioriteit geven aan eenvoud en efficiëntie.