Les services.
Ce que le serveur fait tourner en continu, et ce qui le fait tourner, lui. Cliquez sur un service pour sa fiche.
Public
Un sous-domaine, un certificat, et Authelia à l'entrée : refus par défaut, un groupe LLDAP par service. Seules exceptions : Plex, qui a ses propres comptes, les invitations Wizarr et Au Coin.
Privé
Ni sous-domaine ni port ouvert : réseau local, réseau Docker ou tunnel SSH.
L'architecture.
Un compose.yml décrit la pile entière, et n'en écrit
presque rien lui-même : il inclut un fichier par service, rangés
dans docker/. Quatorze conteneurs, leurs réseaux, leurs
disques. Le serveur n'installe rien, il applique ces fichiers.
Ces deux conteneurs n'ont pas de réseau à eux :
network_mode: service:gluetun les fait vivre dans
celui de gluetun. Aucun port ne leur appartient, ils
sont publiés par le tunnel, sur 127.0.0.1. Si
gluetun tombe, ils deviennent sourds : le
coupe-circuit n'est pas une option cochée, c'est la topologie.
Chaque port publié n'écoute que 127.0.0.1 : seul le
nginx de la machine, qui porte le TLS, peut leur parler, et il
demande d'abord son avis à authelia.
lldap ne publie pas son port LDAP, et
qbittorrent-exporter aucun : on ne les joint que par
le réseau Docker. Grafana et Qui rejoignent
auth.jularthus.fr par host-gateway, sans
dépendre de la box.
plex tourne en service systemd, à côté de
la pile. nginx reçoit tout le trafic HTTPS et le
répartit par sous-domaine, avec un certificat Let's Encrypt.
cron lance la mise à jour de la pile et le rapport
Discord de Qui.
Une pile, des fichiers
Chaque service est déclaré plutôt qu'installé : image,
version, volumes, variables, dans son propre fichier.
Le même dépôt remonte l'ensemble à l'identique sur une machine
neuve.
Le réseau se déclare
Router des services dans un VPN tiendrait en un jeu de règles
iptables à maintenir à la main. Ici, c'est une ligne
par conteneur, et elle est impossible à oublier.
Refusé par défaut
Authelia ne laisse rien passer sans règle explicite. Les comptes vivent dans LLDAP, un groupe par service, et la connexion se fait par passkey. Grafana et Qui lui délèguent leur login en OIDC.
Entretien automatique
Chaque nuit à 5 h, update.sh tire les nouvelles
images, recrée ce qui a changé, rebranche qBittorrent et Prowlarr
si le tunnel a été mis à jour, puis fait le ménage. Un hook
pre-commit refuse tout commit qui contiendrait un
secret.
qbittorrent, radarr, sonarr et
qui montent le même /mnt/Plex, téléchargements
et médiathèque compris. Un téléchargement terminé change de dossier
sans jamais être recopié. /mnt/Plex est lui-même un
assemblage : deux disques USB de 2 To fusionnés par
mergerfs, qui place chaque nouveau fichier sur le moins
rempli.
La machine.
Un Razer Blade 15 de 2020 payé 50 € : à ce prix, l'écran, le clavier, le trackpad et le châssis étaient tous cassés. Le reste marche très bien. Rabattu, branché au secteur, il tourne 24 h / 24 dans un coin, avec deux disques USB de 2 To pour tout ranger.