🛠️ Tutos · ⏱ 10 min de lecture

Déployer Immich avec Docker en 2026 : tutoriel complet (HTTPS, reverse proxy, sauvegardes)

Tutoriel 2026 pas à pas pour auto-héberger Immich, l'alternative à Google Photos, avec Docker Compose : galerie photos et vidéos, reconnaissance faciale, HTTPS automatique via Caddy et Let's Encrypt, sauvegardes et durcissement. Configs prêtes à l'emploi.

S Par Équipe Selfhostr · tests indépendants
Déployer Immich avec Docker en 2026 : tutoriel complet (HTTPS, reverse proxy, sauvegardes)
ⓘ Cet article peut contenir des liens affiliés (sans surcoût pour toi, ça soutient nos tests). Voir la disclosure.
💾
4 Go minimum
RAM requise
🐳
Docker Compose
Stack technique
🔒
Caddy + Let's Encrypt
Sécurité HTTPS
📦
Multi-conteneurs
Type de service

👍 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
▶ Tutoriel vidéo : déployer Immich
📑 Sommaire

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) :

TypeNomValeur
Aphotos.exemple.fr203.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 :

  1. Désactivez l’inscription publique si elle ne vous sert pas, et créez manuellement les comptes de votre famille (Administration → Utilisateurs).
  2. Installez l’application Immich sur iOS ou Android, saisissez l’URL https://photos.exemple.fr, connectez-vous.
  3. 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 .env plutôt que release en 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_size dans le Caddyfile (étape 6). Avec Nginx Proxy Manager, augmentez client_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_LOCATION sur 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

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.

Tags : immichdockerhttpscaddygoogle-photosself-hosting

Sur le même sujet

🛠️ Tutos

Héberger Vaultwarden avec Docker et HTTPS en 2026 (tutoriel complet, reverse proxy Caddy)

Tutoriel 2026 pas à pas pour auto-héberger Vaultwarden avec Docker : déploiement sécurisé, HTTPS automatique via Caddy et Let's Encrypt, panneau admin protégé, double authentification, sauvegardes chiffrées et durcissement. Configs docker-compose et Caddyfile prêtes à l'emploi.

Lire
🛠️ Tutos

Reverse proxy HTTPS automatique avec Caddy et Docker en 2026 (certificats Let's Encrypt sans effort)

Tutoriel 2026 pour déployer un reverse proxy Caddy avec Docker : HTTPS et certificats Let's Encrypt automatiques, redirection de plusieurs services, en-têtes de sécurité et renouvellement transparent. Configs Caddyfile et docker-compose prêtes à l'emploi.

Lire
🛠️ Tutos

Tutoriel Gitea avec Docker en 2026 : déployer sa forge git self-hosted en HTTPS

Tutoriel 2026 pour déployer Gitea, la forge git légère self-hosted, avec Docker : base PostgreSQL, reverse proxy HTTPS, SSH sur port dédié, Actions CI/CD, durcissement et sauvegarde. Configs docker-compose et Caddy prêtes à l'emploi.

Lire