Un serveur pour les gouverner tous
Je vous parlais dans mon article préface de la démarche que j’ai initié pour faire de mon logement un modeste laboratoire d’un habitat adapté aux besoins, sobre et intelligent. Commençons cet article par le cerveau du système : le home server.
Le home server répond à deux besoins que j’avais : être plus ou moins autonome et souverain de mes données face aux GAFAM et contrôler efficacement mon logement.
Avant de commencer, je ne suis pas sysadmin et je ne prétends pas maîtriser tous les usages et règles de cybersécurité et d’administration système. Je vous invite à vous-même remettre en question les choix que j’ai pu faire, et n’hésitez pas à me contacter si vous trouvez une erreur ou faute. Ce billet s’adresse à ceux n’ayant pas de notions, ce qui explique les raccourcis et simplifications.
Le besoin initial, la raison d’être du serveur, était d’héberger Home Assistant et un service de stockage cloud. Ainsi, je me suis initialement orienté vers une Raspberry Pi 5 de 4Go de RAM, mais afin de pouvoir héberger d’autres services, j’ai finalement opté pour la version 16Go de RAM.
Parlons hardware
Pour ceux qui n’y sont pas familier, les Raspberry Pi sont des nano-ordinateurs monocarte comportant un processeur, de la RAM soudée, une carte WiFi et Bluetooth, des interfaces divers (selon les versions : USB, PCIe, Ethernet…). Le stockage est quant à lui souvent confié à une carte SD.
Cependant, les cartes SD ne sont pas assez fiables pour servir de support de stockage car elles possèdent un nombre de cycle d’écriture restreint. Certains services qui écrivent beaucoup sur le disque (logs, données…) réduisent ainsi considérablement sa durée de vie. L’utilisation d’un SSD devient ainsi crucial pour un home server.
J’ai ainsi acheté un hat M.2 à connecter sur le port PCIe de la Raspberry Pi et ai pu recycler recycler un SSD 512Go de mon ancien PC portable. J’ai également acheté un boitier en métal avec un ventilateur pour le refroidissement adapté à la taille du hat.
Côté software
J’ai ensuite flash le SSD avec Raspberry Pi OS Lite, un système d’exploitation dérivé de Debian dans sa version sans interface graphique (seulement la console).
Je voulais héberger plusieurs services, isolés entre eux pour la sécurité, que l’on peut ajouter, démarrer, arrêter et supprimer facilement. J’ai donc choisis d’utiliser Docker pour la simplicité de Compose. Compose est un système désormais natif permettant de créer et gérer un ensemble de service à l’aide de fichiers .yml.
Architecture réseau
Je souhaitais masquer l’IP de mon domicile et permettre d’installer mon serveur n’importe où sans avoir à redéfinir les DNS de mon nom de domaine. J’ai testé le tunnel de Cloudflare, mais je l’ai écarté pour des raisons d’autonomie, de souveraineté et de respect de la vie privée. Mon choix s’est finalement porté vers un VPS à 1€/mois redirigeant le traffic.
Dans le détail, les DNS de mon nom de domaine pointent vers l’IP du VPS, la seule visible de l’extérieure. Ensuite, un reverse proxy (Caddy) gère la couche TLS (le S de HTTPS) et redirige les paquets vers la Rapsberry Pi via un VPN Wireguard. Enfin, un autre reverse proxy, Traefik, distribue le traffic vers les services Docker. Pour les protocoles non-HTTP (TCP/UDP), une simple redirection de port (port forwarding) est faite.
Services
Les trois premiers services hébergés ont été ceux à l’origine du besoin : contrôle et supervision de la maison, drive cloud et synchronisation des photos.
Domotique
Home Assistant est le principal gestionnaire de domotique open source. Il prend en charge la quasi totalité des protocoles et marques d’objets connectés. Il permet de contrôler les objets (lampes, radiateurs, ventilateurs…), superviser via des capteurs (lumière, présence, qualité de l’air…) et d’automatiser.
Le tableau de bord principal affiche ainsi la météo, l’état des transports en commun via un service que j’ai développé en Go, la consommation d’énergie, l’état et les contrôles de mes objets connectés et des informations sur l’état du Home Server.
Il est toutefois lourd et gourmand en ressources (500-600Mo de RAM pour ma part).
Stockage cloud (fichiers et photos)
Pour le stockage de fichiers, j’ai choisi Nextcloud, un service de stockage cloud open source. Il permet de synchroniser des fichiers entre différents appareils, de les partager et de les organiser. Il dispose également d’une application mobile pour la synchronisation automatique des photos. J’avais testé d’autres services de stockage cloud, notamment Seafile et ownCloud (dont Nextcloud est issu), mais j’ai trouvé que Nextcloud était plus complet et plus facile à utiliser. Je le trouve toutefois trop complet.
Pour la synchronisation des photos, j’avais initialement opté pour ente, séduit par le chiffrement de bout en bout, mais cela me rendait également dépendant du service. J’ai donc choisis Immich, très semblable à Google Photo, dont l’interface est très ergonomique et dispose de nombreuses fonctionnalités (reconnaissance des visages, carte des lieux de prise, recherche intelligente…). Les opération de machine learning demandant des resources importantes, je l’ai délocalisé sur mon PC (équipé d’une carte graphique Nvidia GTX 1650) en le connectant au VPN.
Authentification
J’ai ensuite ajouté Authelia pour centraliser l’authentification via OIDC avec le support des codes temporaires (TOTP) et clés de sécurité (WebAuthn). Ce protocole est utilisé par la plupart des services, à l’exception de certains services en freemium (non ou partiellement open-source avec une version payante qui l’autorise) et de Home Assistant dont le support est trop lacunaire et bancal, j’utilise ainsi une authentification interne pour ce service.
Tous les services
- AdventureLog : un service de journal de bord pour noter ses voyages et les partager
- AnySync : synchronisation des clients Anytype (alternative chiffrée et locale à Notion)
- Authelia : centralisation de l’authentification via OIDC
- Autorestic : sauvegardes incrémentales chiffrées
- Beszel : monitoring des ressources utilisées sur les serveurs par les services
- Gramps : arbre généalogique
- Grist : tableur et base de données
- Home Assistant : contrôle et supervision de la maison
- Immich : synchronisation des photos et vidéos
- Music Assistant : gestion de la musique
- n8n : automatisation, workflow et integration
- Nextcloud : stockage de fichiers en cloud
- Ntfy : notification push
- Paperless : gestion des documents
- Plausible : analytics et statistiques
- Portainer : interface de gestion de conteneurs
- Sablier : arrêt automatique des conteneurs
- Seaweedfs : stockage S3
- Sure : gestion des finances et du budget personnel
- Traefik : reverse proxy
- Uptime Kuma : monitoring de la disponibilité des services
- Watchtower : mise à jour automatique des conteneurs
Sauvegardes
Les sauvegardes sont essentielles, d’autant plus pour un serveur qui héberge des documents. J’ai configuré Autorestic pour faire une sauvegarde quotidienne. L’avantage de Restic (sur lequel est basé Autorestic) est qu’il ne fait que des sauvegardes incrémentales chiffrées, c’est à dire qu’il ne sauvegarde que les fichiers modifiés depuis la dernière sauvegarde, et que les données sont chiffrées avant d’être envoyées sur le stockage de destination.
La stratégie recommandée est celle du 3-2-1 : trois copies des données, sur deux supports différents, dont une hors site (pas dans le même bâtiment par exemple). J’ai ainsi des sauvegardes sur différents disques durs externes, stockés à différents endroits. A terme, je ferai des sauvegardes sur des services d’archivage en ligne notamment en Cold Storage (stockage à long terme, moins cher que les services de stockage classiques) pour une meilleure résilience.