Mon homelab en 2026 : tour d'horizon de ma stack logicielle

Mon homelab en 2026 : tour d'horizon de ma stack logicielle

Après plusieurs années d’expérimentation et d’itérations, mon homelab a trouvé une forme qui me convient. En 2026, il tourne autour d’un ensemble d’applications auto-hébergées, chacune remplissant un rôle précis. Cet article fait le point sur la stack actuelle.

Oui, moi aussi je fais un article sur mon homelab en 2026. C’était presque devenu un genre littéraire, il fallait bien que j’y passe.

Table des applications

CatégorieApplication
SupervisionBeszel / Uptime-Kuma
GitGitea
PhotosImmich
TodoDoneTick
NotesTrilium
HomepageGlance
Certificats TLSStep-CA

Supervision : Beszel / Uptime-Kuma

Beszel

Description : Beszel est un outil de monitoring léger et minimaliste pour parc domestique. Il fournit un tableau de bord simple affichant l’état des services, les métriques système (CPU, RAM, disque, réseau) et l’historique d’activité.

Usage : Je l’utilise pour avoir une vue d’ensemble rapide de l’état de mes serveurs et conteneurs. L’interface est épurée et va droit au but.

Avantages :

  • Très léger, consomme peu de ressources
  • Interface clean et minimaliste
  • Configuration simple
  • Parfait pour un petit parc de machines

Exemple docker-compose :

services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel
    restart: unless-stopped
    volumes:
      - /rpool/docker/beszel:/beszel_data
    ports:
      - "443:443"
      - "9000:9000"

Uptime-Kuma

Description : Uptime-Kuma est un moniteur de disponibilité (uptime monitor) moderne et visuellement attrayant. Il surveille la disponibilité de services via HTTP(s), TCP, ping, DNS et bien d’autres protocoles, et envoie des notifications en cas d’indisponibilité.

Usage : Je m’en sers pour surveiller la disponibilité de mes services exposés (et même externes). Les notifications Pushover/matrix me préviennent instantanément en cas de panne.

Avantages :

  • Interface moderne et intuitive
  • Multi-protocoles : HTTP, TCP, Ping, DNS, Steam, etc.
  • Notifications : Pushover, Discord, Slack, Telegram, email, webhooks, etc.
  • Statistiques détaillées et historique
  • Status page publique optionnelle

Exemple docker-compose :

  uptime-kuma:
    image: louislam/uptime-kuma:2
    container_name: uptime-kuma
    volumes:
      - /rpool/docker/uptime-kuma:/app/data
      - /usr/local/share/ca-certificates:/app/data/docker-tls:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - "3001:3001"
    environment:
      NODE_EXTRA_CA_CERTS: /app/data/docker-tls/Pads_Home_CA.crt
    restart: unless-stopped

Git : Gitea

Description : Gitea est un service d’hébergement Git léger, écrit en Go. C’est un fork de Forgejo lui-même issu de Gogs. Il offre un système de gestion de dépôts Git complet avec revue de code, gestion d’issues, pipelines CI intégrés et bien plus.

Usage : Gitea remplace mon GitLab privé pour la majorité des dépôts. Il héberge mes scripts, mes configurations, ce site web, et tous mes projets personnels. Les actions CI lancent les builds et déploiements automatiques.

Avantages :

  • Extrêmement léger comparé à GitLab (quelques Mo de RAM au repos)
  • Écrit en Go, binaire unique, facile à déployer
  • Interface familière type GitHub/GitLab
  • Webhooks, issues, pull requests, milestones
  • Intégration CI avec Gitea Actions
  • Mode administrateur et multi-utilisateurs

Exemple docker-compose :

services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=change_me
      - GITEA__actions__ENABLED=true
      - GITEA__packages__ENABLED=true
      - GITEA__packages__DOCKER_V2_ENABLED=true
      - GITEA__server__ROOT_URL=https://git.home.lan/
    restart: always
    networks:
      - gitea
      - traefik_gateway
    volumes:
      - /rpool/docker/gitea/data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "2222:22"
      - "3000:3000"
    depends_on:
      - db

  db:
    image: postgres:15
    container_name: gitea_db
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=change_me
      - POSTGRES_DB=gitea
    networks:
      - gitea
    volumes:
      - /rpool/docker/gitea/postgres:/var/lib/postgresql/data

Photos : Immich

Description : Immich est une solution de sauvegarde et de gestion de photos et vidéos auto-hébergée, conçue comme une alternative privée à Google Photos. Elle offre un import rapide, une galerie moderne, de la reconnaissance faciale, de la classification par IA, et une application mobile native.

Usage : Immich est la destination de sauvegarde automatique de mes photos depuis mon smartphone. L’application mobile upload les photos en arrière-plan, et le serveur les organise, les indexe et génère les métadonnées.

Avantages :

  • Import et upload très rapides
  • Application mobile native iOS/Android de qualité
  • Reconnaissance faciale et classification IA
  • Recherche par mots-clés, lieu, date, personne
  • Timeline chronologique fluide
  • Support du dédoublonnage
  • Prévisualisation vidéo intégrée
  • Partage d’albums

Exemple docker-compose :

#
# WARNING: To install Immich, follow our guide: https://immich.app/docs/install/docker-compose
#
# Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.

name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    devices:
      - /dev/dri:/dev/dri
    volumes:
      # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the stack.env file
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - stack.env
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

  immich-public-proxy:
    image: alangrainger/immich-public-proxy:latest
    container_name: immich-public-proxy
    restart: always
    environment:
      PUBLIC_BASE_URL: https://immich.domain.tld
      IMMICH_URL: http://immich_server:2283
    healthcheck:
      test: curl -s http://localhost:3000/share/healthcheck -o /dev/null || exit 1
      start_period: 10s
      timeout: 5s

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    env_file:
      - stack.env
    restart: always
    healthcheck:
      disable: false

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6
    networks:
      - immich
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
      DB_STORAGE_TYPE: 'HDD'
    volumes:
      # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the stack.env file
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    shm_size: 128mb
    restart: always

Variables commune stack.env

UPLOAD_LOCATION=
DB_DATA_LOCATION=
IMMICH_VERSION=release
DB_PASSWORD=
DB_USERNAME=immich
DB_DATABASE_NAME=immich

Todo : DoneTick

Description : DoneTick est une application de gestion de tâches collaborative, auto-hébergée, avec une interface moderne. Elle supporte les listes de tâches, les sous-tâches, les calendriers, les rappels, et le partage de listes entre utilisateurs.

Usage : DoneTick remplace les solutions cloud comme Todoist ou Microsoft To-Do. Je m’en sers pour ma liste de tâches personnelles, la liste de courses, et les projets familiaux partagés.

Avantages :

  • Interface intuitive et moderne
  • Tâches récurrentes avec règles flexibles
  • Calendrier intégré
  • Rappels et notifications
  • Partage de listes et collaboration
  • Catégories et priorités
  • Vue jour/semaine/mois
  • Données hébergées chez soi

Exemple docker-compose :



services:
  donetick:
    container_name: donetick
    image: donetick/donetick:latest
    restart: unless-stopped
    volumes:
      - /rpool/docker/donetick/data:/donetick-data
      - /rpool/docker/donetick/config:/config
    environment:
      - DT_ENV=selfhosted
      - DT_SQLITE_PATH=/donetick-data/donetick.db
    ports:
      - "2021:2021"

Notes : Trilium

Description : Trilium est un wiki personnel de type hiérarchique, conçu pour l’organisation de notes et de connaissances. Il offre un éditeur WYSIWYG et un éditeur Markdown, un système de notes hiérarchiques avec cloning et sharing, des attributs clés-valeurs, des synchronisations entre instances, et un moteur de recherche puissant.

Usage : Trilium est ma base de connaissances personnelle. J’y stocke mes notes techniques, mes recettes, mes idées de projets, des extraits de code, et tout ce qui mérite d’être archivé et recherché.

Avantages :

  • Structure hiérarchique flexible (arborescence de notes)
  • Cloning de notes (une note visible à plusieurs endroits sans duplication)
  • Éditeur riche + Markdown + code avec coloration syntaxique
  • Recherche full-text rapide
  • Tags et attributs pour organiser
  • Scripts et automatisations en JavaScript
  • Export en Markdown, HTML, PDF
  • Synchronisation entre instances Trilium
  • Thèmes et personnalisation

Exemple docker-compose :

services:
  trilium:
    # Optionally, replace `latest` with a version tag like `v0.90.3`
    # Using `latest` may cause unintended updates to the container
    container_name: trilium
    image: triliumnext/trilium:latest
    # Restart the container unless it was stopped by the user
    restart: unless-stopped
    environment:
      - TRILIUM_DATA_DIR=/home/node/trilium-data
      - NODE_TLS_REJECT_UNAUTHORIZED=0
    ports:
      # By default, Trilium will be available at http://localhost:8080
      # It will also be accessible at http://<host-ip>:8080
      # You might want to limit this with something like Docker Networks, reverse proxies, or firewall rules,
      # however be aware that using UFW is known to not work with default Docker installations, see:
      # https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw
      - '8080:8080'
    volumes:
      # Unless TRILIUM_DATA_DIR is set, the data will be stored in the "trilium-data" directory in the home directory.
      # This can also be changed with by replacing the line below with `- /path/of/your/choice:/home/node/trilium-data
      - ${TRILIUM_DATA_DIR:-~/trilium-data}:/home/node/trilium-data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    networks:
      - traefik_gateway

Certificats TLS : Step-CA

Step-CA

Description : Step-CA est une autorité de certification (CA) auto-hébergée, développée par Smallstep. Elle permet de gérer et émettre des certificats TLS de manière automatisée, supportant les standards ACME, OIDC, et les certificats à courte durée de vie (short-lived certificates). Elle implémente également le protocole mTLS pour l’authentification mutuelle.

Usage : Step-CA sert de CA interne pour mon homelab. Elle émet automatiquement des certificats valides pour tous mes services internes (Gitea, Immich, Trilium, etc.), éliminant le besoin de gérer manuellement des certificats Let’s Encrypt pour les noms de domaine internes. Les services peuvent obtenir et renouveler leurs certificats automatiquement via le protocole ACME.

Avantages :

  • Autorité de certification auto-hébergée et contrôlée
  • Émission automatique de certificats via ACME (compatible certbot)
  • Support des certificats à courte durée de vie pour une meilleure sécurité
  • Authentification mutuelle TLS (mTLS)
  • Support de l’authentification via OIDC (Google, GitHub, etc.)
  • Gestion centralisée des certificats pour tous les services internes
  • Interface web d’administration
  • Rotation automatique des clés

Exemple docker-compose :

services:
  step-ca:
    image: smallstep/step-ca:latest
    container_name: step-ca
    restart: unless-stopped
    ports:
      - "443:443"
      - "9000:9000"
    volumes:
      - ./step-ca_data:/step-ca
      - ./config.json:/etc/step-ca/config.json:ro
    environment:
      - STEP_CA_CONFIG=/etc/step-ca/config.json

Initialisation :

# Initialiser la CA (à exécuter une seule fois)
docker run -it --rm \
  -v $(pwd)/step-ca_data:/step-ca \
  smallstep/step-ca:latest step ca init \
    --name "Homelab CA" \
    --dns home.lan \
    --dns *.home.lan \
    --address ":443" \
    --provisioner admin \
    --provisioner-type JWK

Configuration ACME (config.json) :

{
  "certificates": [{
    "gencsr": false,
    "listen": ":443",
    "hosts": ["home.lan", "*.home.lan"]
  }],
  "authority": {
    "provisioners": {
      "passwordless": [{
        "type": "JWK",
        "name": "admin",
        "key": {
          "kty": "OKP",
          "crv": "Ed25519",
          "x": "...",
          "d": "..."
        }
      }, {
        "type": "ACME",
        "name": "acme",
        "authorizationFormat": ["cn"]
      }]
    }
  }
}

Utilisation avec certbot :

# Obtenir un certificat pour un service
certbot certonly \
  --server https://ca.home.lan/acme/directory \
  --cert-name gitea.home.lan \
  --dns \
  --email [email protected] \
  --agree-tos

# ou avec step client
step certificate create gitea.home.lan \
  gitea.crt gitea.key \
  --ca https://ca.home.lan \
  --provisioner admin \
  --san dns:gitea.home.lan \
  --san dns:gitea \
  --no-password \
  --insecure

Homepage : Glance

Description : Glance est un tableau de bord web minimaliste et rapide, conçu pour agréger en une seule page l’information essentielle : liens, flux RSS, météo, état des services, calendrier, cours boursiers, et bien plus encore.

Usage : Glance est la page d’accueil de mon navigateur. En un coup d’œil, j’ai accès à mes services, l’état de mes monitors, la météo, les flux que je suis, et les liens rapides vers mes applications.

Avantages :

  • Configuration simple via un unique fichier YAML
  • Très léger et rapide
  • Interface épurée et personnalisable
  • Widgets variés : liens, RSS, monitoring, météo, calendrier, GitHub, etc.
  • Pas de base de données, pas de dépendances lourdes
  • Thème sombre intégré

Exemple docker-compose :

services:
  glance:
    image: glanceapp/glance:latest
    container_name: glance
    restart: unless-stopped
    ports:
      - "3002:8080"
    volumes:
      - ./glance-config.yaml:/app/glance.yaml

Exemple de glance-config.yaml :

glance:
  pages:
    - name: Accueil
      columns:
        - size: small
          widgets:
            - type: calendar

            - type: rss
              limit: 10
              feeds:
                - url: https://blog.example.com/feed.xml

        - size: main
          widgets:
            - type: links
              items:
                - title: Gitea
                  url: https://git.home.lan
                - title: Immich
                  url: https://photos.home.lan
                - title: Trilium
                  url: https://notes.home.lan
                - title: DoneTick
                  url: https://todo.home.lan
                - title: Uptime-Kuma
                  url: https://status.home.lan

            - type: rss
              limit: 20
              feeds:
                - url: https://feeds.example.com/tech

        - size: small
          widgets:
            - type: weather
              location: Paris, France

            - type: monitoring
              refresh: 5m
              sites:
                - name: Gitea
                  url: https://git.home.lan
                - name: Immich
                  url: https://photos.home.lan

Conclusion

Cette stack me couvre l’essentiel des besoins quotidiens : versionning, photos, tâches, notes, monitoring et accès rapide. Le point fort de cet ensemble est sa légèreté : aucune de ces applications ne nécessite un serveur puissant, et l’ensemble tourne confortablement sur du matériel modeste. Le tout conteneurisé avec Docker, ce qui simplifie la maintenance et les mises à jour.

Sources

Catégories : Homelab 
Tags: Docker 

Suggestions de lecture :