👍 On aime
- ✓Alternative open source complète à Google Photos avec sauvegarde auto mobile
- ✓Reconnaissance faciale et recherche intelligente intégrées
- ✓Déploiement simplifié via Docker Compose et Caddy pour le HTTPS automatique
- ✓Organisation automatique des médias par date et lieu
👎 On regrette
- ✕Architecture multi-conteneurs complexe (serveur, ML, PostgreSQL, Redis)
- ✕Module machine learning très gourmand en ressources RAM
- ✕Exige beaucoup d'espace disque pour les volumes de photos
- ✕Configuration initiale rigoureuse nécessaire pour les données irremplaçables
📑 Sommaire ▾
- 01 Prérequis
- 02 Étape 1 : Installer Docker et Docker Compose
- 03 Étape 2 : Configurer le DNS
- 04 Étape 3 : Créer le réseau Docker partagé
- 05 Étape 4 : Préparer le dossier et le fichier .env
- 06 Étape 5 : Le docker-compose.yml d’Immich
- 07 Étape 6 : Le Caddyfile pour le HTTPS automatique
- 08 Étape 7 : Lancer les services
- 09 Étape 8 : Créer le compte admin et configurer les applications
- 10 Étape 9 : Sauvegardes fiables
- 11 Étape 10 : Vérification finale
- 12 Sécurité et durcissement
- 13 Pièges courants et dépannage
- 14 FAQ
- · Immich peut-il vraiment remplacer Google Photos ?
- · De combien de RAM ai-je besoin ?
- · Quelle différence entre une bibliothèque « uploadée » et une bibliothèque « externe » ?
- · Le HTTPS est-il vraiment obligatoire ?
- · Puis-je héberger Immich sur un NAS ?
- · Immich ou PhotoPrism : lequel choisir ?
- 21 Sur le même sujet
Vous voulez quitter Google Photos sans renoncer à la sauvegarde automatique de votre téléphone, à la reconnaissance faciale et à une galerie fluide ? Immich est aujourd’hui l’alternative self-hosted la plus aboutie : une application open source qui sauvegarde automatiquement vos photos et vidéos depuis vos applications mobiles iOS/Android, les organise par date et par lieu, détecte les visages et propose une recherche intelligente — sur votre propre serveur, sans abonnement.
Le revers : Immich est un service multi-conteneurs (serveur, machine learning, PostgreSQL, Redis) qui héberge des données irremplaçables. Il doit donc être déployé proprement, en HTTPS, avec des sauvegardes fiables. Dans ce tutoriel, on déploie Immich via Docker Compose, derrière un reverse proxy Caddy qui gère le HTTPS et les certificats Let’s Encrypt automatiquement.
Prérequis
- Un serveur ou VPS sous Ubuntu 24.04 (ou Debian 12) avec au moins 4 Go de RAM : le module de machine learning d’Immich est gourmand. Pour de gros volumes, visez 8 Go. Un VPS d’entrée de gamme chez Hetzner ou Scaleway fait parfaitement l’affaire, mais beaucoup hébergent Immich sur un NAS ou un mini-PC à la maison pour le stockage massif.
- Beaucoup d’espace disque. Vos photos prennent vite plusieurs centaines de Go. Prévoyez large.
- Docker et Docker Compose installés (commande à l’étape 1).
- Un nom de domaine dont vous contrôlez le DNS. On utilisera
photos.exemple.fr. - Les ports 80 et 443 ouverts sur votre pare-feu pour la validation Let’s Encrypt et le trafic HTTPS.
Étape 1 : Installer Docker et Docker Compose
Si Docker n’est pas présent, installez-le depuis le dépôt officiel (les versions des dépôts Ubuntu sont souvent en retard) :
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Ajoutez votre utilisateur au groupe docker (déconnectez-vous/reconnectez-vous ensuite) :
sudo usermod -aG docker $USER
Vérifiez :
docker --version && docker compose version
Étape 2 : Configurer le DNS
Caddy a besoin que votre domaine pointe vers l’IP du serveur pour émettre le certificat. Chez votre fournisseur DNS, créez un enregistrement A (et AAAA si IPv6) :
| Type | Nom | Valeur |
|---|---|---|
| A | photos.exemple.fr | 203.0.113.10 |
Vérifiez la propagation depuis votre machine :
dig +short photos.exemple.fr
La commande doit renvoyer l’IP de votre serveur. Tant que ce n’est pas le cas, Let’s Encrypt échouera à émettre le certificat.
Étape 3 : Créer le réseau Docker partagé
Pour que Caddy joigne le conteneur Immich par son nom, les deux partagent un réseau Docker dédié. Créez-le une seule fois :
docker network create web
Si vous suivez déjà notre tutoriel reverse proxy Caddy, ce réseau existe peut-être déjà : la commande renverra une erreur sans gravité, ignorez-la.
Étape 4 : Préparer le dossier et le fichier .env
Créez votre dossier de travail et le fichier d’environnement. Immich utilise un .env pour centraliser les versions, les mots de passe et les chemins :
mkdir -p ~/immich && cd ~/immich
nano .env
# Version d'Immich (épinglez une version stable plutôt que latest en production)
IMMICH_VERSION=release
# Emplacement de la bibliothèque (photos/vidéos uploadées). Mettez un chemin avec beaucoup d'espace.
UPLOAD_LOCATION=./library
# Emplacement des données PostgreSQL (NE PAS mettre dans un dossier monté en réseau)
DB_DATA_LOCATION=./postgres
# Identifiants de la base de données — utilisez un mot de passe long et unique
DB_PASSWORD=remplacez_par_un_mot_de_passe_long_et_aleatoire
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
# Fuseau horaire (corrige les dates EXIF affichées)
TZ=Europe/Paris
Générez un mot de passe solide pour la base :
openssl rand -base64 32
Collez le résultat dans DB_PASSWORD.
Étape 5 : Le docker-compose.yml d’Immich
C’est le cœur du déploiement. Immich orchestre quatre conteneurs : le serveur, le module de machine learning, PostgreSQL (avec l’extension vectorielle pour la recherche par similarité) et Redis.
nano docker-compose.yml
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
depends_on:
- redis
- database
restart: unless-stopped
healthcheck:
disable: false
networks:
- web
- immich-internal
immich-machine-learning:
container_name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
volumes:
- model-cache:/cache
env_file:
- .env
restart: unless-stopped
healthcheck:
disable: false
networks:
- immich-internal
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8-bookworm
healthcheck:
test: redis-cli ping || exit 1
restart: unless-stopped
networks:
- immich-internal
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
shm_size: 128mb
restart: unless-stopped
networks:
- immich-internal
volumes:
model-cache:
networks:
web:
external: true
immich-internal:
Le serveur Immich est sur deux réseaux : immich-internal pour parler à sa base et à Redis, web pour être joignable par Caddy. PostgreSQL, Redis et le ML ne sont que sur le réseau interne, jamais accessibles depuis l’extérieur. Notez l’absence de section ports: : Immich n’est pas exposé directement, tout passe par le reverse proxy.
Étape 6 : Le Caddyfile pour le HTTPS automatique
Si vous avez déjà un Caddy en place, ajoutez simplement le bloc de site. Sinon, créez un dossier Caddy :
mkdir -p ~/caddy && cd ~/caddy
nano Caddyfile
{
email admin@exemple.fr
}
photos.exemple.fr {
encode gzip zstd
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
# Immich envoie de gros fichiers : on relève les limites de taille de corps
request_body {
max_size 50000MB
}
reverse_proxy immich_server:2283
}
La directive request_body max_size est cruciale : sans elle, l’upload de gros fichiers vidéo échouerait. Le port interne d’Immich est 2283.
Puis le docker-compose.yml de Caddy :
nano docker-compose.yml
services:
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
networks:
- web
volumes:
caddy_data:
caddy_config:
networks:
web:
external: true
Le volume caddy_data conserve vos certificats : sans lui, vous redemanderiez un certificat à chaque redémarrage et atteindriez vite les limites de Let’s Encrypt.
Étape 7 : Lancer les services
Démarrez d’abord Immich (le premier lancement télécharge plusieurs images, soyez patient), puis Caddy :
cd ~/immich && docker compose up -d
cd ~/caddy && docker compose up -d
Suivez les logs d’Immich pour voir le serveur démarrer :
cd ~/immich && docker compose logs -f immich-server
Quand vous voyez Immich Server is listening on ..., visitez https://photos.exemple.fr. La page de création du compte administrateur s’affiche.
Étape 8 : Créer le compte admin et configurer les applications
Le premier compte créé devient automatiquement administrateur. Choisissez un email et un mot de passe solides. Ensuite, dans le panneau d’administration :
- Désactivez l’inscription publique si elle ne vous sert pas, et créez manuellement les comptes de votre famille (Administration → Utilisateurs).
- Installez l’application Immich sur iOS ou Android, saisissez l’URL
https://photos.exemple.fr, connectez-vous. - Dans l’application mobile, activez la sauvegarde automatique : sélectionnez les albums à téléverser. Vos photos remontent désormais automatiquement, comme avec Google Photos.
La reconnaissance faciale et la recherche intelligente tournent en arrière-plan via le conteneur de machine learning. Sur un premier import volumineux, laissez-le travailler plusieurs heures ; vous suivrez l’avancement dans Administration → Tâches.
Étape 9 : Sauvegardes fiables
Immich héberge des souvenirs irremplaçables. Deux choses sont à sauvegarder : la base PostgreSQL (métadonnées, albums, visages) et la bibliothèque de fichiers (UPLOAD_LOCATION). Un simple cp de la base à chaud la corromprait : utilisez un dump cohérent.
nano ~/immich/backup.sh
#!/bin/bash
set -euo pipefail
cd "$HOME/immich"
BACKUP_DIR="$HOME/immich/backups"
STAMP=$(date +%Y%m%d-%H%M%S)
mkdir -p "$BACKUP_DIR"
# Dump cohérent de la base (la méthode officielle recommandée par Immich)
docker compose exec -T database \
pg_dumpall --clean --if-exists --username=postgres \
| gzip > "$BACKUP_DIR/immich-db-$STAMP.sql.gz"
# Conserve les 14 derniers dumps de base
find "$BACKUP_DIR" -name 'immich-db-*.sql.gz' -mtime +14 -delete
chmod +x ~/immich/backup.sh
(crontab -l 2>/dev/null; echo "0 3 * * * $HOME/immich/backup.sh") | crontab -
La bibliothèque de fichiers (souvent des centaines de Go) doit être sauvegardée à part, idéalement en incrémental et hors-site. Notre guide sauvegarde automatique avec Restic et Backblaze montre comment répliquer ce dossier vers un stockage distant chiffré. Une sauvegarde sur le même serveur ne protège ni d’un incendie ni d’un ransomware.
Étape 10 : Vérification finale
Contrôlez que tout est en place :
# Les conteneurs tournent
docker compose -f ~/immich/docker-compose.yml ps
# Le HTTP redirige bien vers HTTPS (code 308)
curl -sI http://photos.exemple.fr | head -1
# Le HTTPS répond et le certificat est valide
curl -sI https://photos.exemple.fr | head -1
Vérifiez l’état de santé interne depuis le panneau Administration → État : tous les services (base, ML, Redis) doivent être au vert.
Sécurité et durcissement
- Pare-feu UFW strict. N’ouvrez que 80, 443 et SSH. Les ports internes (PostgreSQL 5432, Redis, ML) ne sont jamais exposés — la configuration réseau s’en charge déjà.
- Mots de passe forts pour le compte admin et la base, inscription publique désactivée, et 2FA activée depuis les paramètres utilisateur.
- Mises à jour maîtrisées. Immich évolue vite et certaines versions imposent des migrations de base. Sauvegardez avant chaque mise à jour, lisez les notes de version, puis
docker compose pull && docker compose up -d. Épinglez une version précise dans.envplutôt quereleaseen production.
Pour aller plus loin sur la protection d’un serveur exposé, consultez installer et sécuriser un VPS Ubuntu.
Pièges courants et dépannage
- Uploads bloqués / erreur 413. Limite de taille du reverse proxy : vérifiez
request_body max_sizedans le Caddyfile (étape 6). Avec Nginx Proxy Manager, augmentezclient_max_body_size. - Le ML ne démarre pas ou manque de RAM. Le conteneur de machine learning peut être tué (OOM) sur un serveur à 2 Go. Ajoutez de la RAM ou du swap.
- La base ne démarre plus après une mise à jour. Presque toujours une migration ratée sur une version sautée. Restaurez le dernier dump et reprenez version par version.
DB_DATA_LOCATIONsur un partage réseau. PostgreSQL exige un système de fichiers POSIX local : un montage NFS/SMB corrompt la base. Gardez-la sur un disque local.
FAQ
Immich peut-il vraiment remplacer Google Photos ?
Pour l’usage quotidien, oui : sauvegarde automatique du téléphone, galerie chronologique, albums partagés, carte des lieux, reconnaissance faciale et recherche par mots-clés (« plage », « chien »). L’expérience mobile est très proche. La différence majeure : vous êtes responsable du stockage et des sauvegardes, mais vous gardez le contrôle total de vos données.
De combien de RAM ai-je besoin ?
Comptez 4 Go minimum, surtout à cause du module de machine learning qui indexe visages et objets. Pour de très grosses bibliothèques ou plusieurs utilisateurs actifs, 8 Go sont préférables.
Quelle différence entre une bibliothèque « uploadée » et une bibliothèque « externe » ?
La bibliothèque uploadée correspond aux fichiers envoyés depuis vos applications (Immich les gère et les organise). Une bibliothèque externe pointe vers un dossier existant monté en lecture seule : Immich l’indexe sans le déplacer. Pratique pour scanner une collection déjà rangée sur un NAS.
Le HTTPS est-il vraiment obligatoire ?
Oui. Les applications mobiles envoient vos identifiants et vos photos sur le réseau ; en HTTP, tout circule en clair, et certaines fonctions mobiles refusent les connexions non sécurisées. Le reverse proxy Caddy de ce tutoriel règle le problème automatiquement.
Puis-je héberger Immich sur un NAS ?
Oui, c’est un usage très répandu pour profiter du gros stockage. Synology (Container Manager), QNAP et surtout TrueNAS gèrent Docker, avec la même logique : conteneurs derrière un reverse proxy HTTPS. Voir notre comparatif Synology vs TrueNAS vs QNAP.
Immich ou PhotoPrism : lequel choisir ?
Immich excelle sur la sauvegarde mobile automatique et l’expérience type Google Photos ; PhotoPrism est réputé pour son organisation et son indexation. Notre comparatif Immich vs PhotoPrism détaille les forces de chacun.
Sur le même sujet
- Immich vs PhotoPrism : quelle galerie photo self-hosted
- Immich vs PhotoPrism vs Nextcloud Photos
- Reverse proxy HTTPS automatique avec Caddy et Docker
- Sauvegarde automatique avec Restic et Backblaze
Vous avez désormais votre propre Google Photos, en HTTPS, avec sauvegarde mobile automatique, reconnaissance faciale et données 100 % souveraines. C’est l’un des services qui change le plus la vie d’un homelab. Pour suivre les nouvelles versions d’Immich, les migrations de base à risque et les meilleures pratiques d’auto-hébergement, abonnez-vous à notre bot de veille Telegram.