$ ssh jarvis

JArvis, le serveur de Jules-Arthus Klein

Le serveur de Jules-Arthus Klein, monté en 2022, en service depuis.

L'idée de départ tenait en une phrase : me refaire un Netflix à moi. Ça a commencé par des scripts Python écrits pendant les cours, au lycée, puis une fonctionnalité après l'autre. Il s'appelle JArvis, pour l'assistant d'Iron Man et pour mes initiales, JA. Devenu un serveur entier, c'est aussi ce qui m'a le plus appris à coder, seul d'abord, puis à l'EPITA.

2022
en service depuis
9
services publics
14
conteneurs dans la pile
3,7To
de médiathèque, sur deux disques
50€
le prix de la machine
$ 01 · Ce qui tourne

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.

    $ 02 · Comment c'est branché

    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.

    gluetun Tunnel WireGuard AirVPN · port redirigé
    qbittorrent 8080
    prowlarr 9696

    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.

    Hors tunnel Réseau Docker · ports liés à 127.0.0.1
    radarr 7878
    sonarr 8989
    qui 7476
    wizarr 5690
    authelia 9091
    lldap 17170
    grafana 3000
    prometheus 9090
    qbittorrent-exporter interne

    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.

    Hors Docker Services de la machine
    plex 32400
    nginx 443
    fail2ban ssh · nginx
    cron 5 h · 9 h

    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.

    $ 03 · Sous le capot

    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.

    Ce qu'il fait