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égorie | Application |
|---|---|
| Supervision | Beszel / Uptime-Kuma |
| Git | Gitea |
| Photos | Immich |
| Todo | DoneTick |
| Notes | Trilium |
| Homepage | Glance |
| Certificats TLS | Step-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
- Beszel — https://github.com/henrygd/beszel
- Uptime-Kuma — https://github.com/louislam/uptime-kuma
- Gitea — https://github.com/go-gitea/gitea
- Immich — https://github.com/immich-app/immich
- DoneTick — https://github.com/Fallomate/DoneTick
- Trilium — https://github.com/zadam/trilium
- Glance — https://github.com/glanceapp/glance
- Step-CA — https://github.com/smallstep/certificates