Auto-héberger Immich sur un VPS avec Docker Compose
Déployez Immich sur un VPS comme alternative auto-hébergée à Google Photos. Docker Compose, sauvegarde mobile, dimensionnement du stockage avec des chiffres réels, machine learning sur CPU, sauvegarde et restauration de la base de données, et mise à jour en toute sécurité.
Immich est une plateforme open-source et auto-hébergée de gestion de photos et vidéos. Elle gère la sauvegarde automatique depuis le mobile, la reconnaissance faciale, la recherche intelligente et le partage d'albums. Si vous voulez arrêter d'envoyer vos photos à Google, Immich est l'équivalent auto-hébergé le plus abouti.
Faire tourner Immich sur un VPS européen signifie que vos photos restent sur une infrastructure que vous contrôlez. Pas de scan par un tiers, pas de jeux de données d'entraînement, pas de changement de politique surprise. Côté RGPD, vous êtes à la fois responsable de traitement et sous-traitant, ce qui simplifie la conformité quand les données ne quittent jamais votre serveur.
Ce guide déploie Immich sur un VPS distant avec Docker Compose. Il suppose que Docker Engine avec le plugin Compose est déjà installé, ainsi qu'un reverse proxy. Si vous avez besoin de les installer d'abord, consultez Docker en production sur un VPS : ce qui casse et comment corriger et Traefik vs Caddy vs Nginx : reverse proxy Docker comparé.
De quoi avez-vous besoin pour faire tourner Immich sur un VPS ?
Immich nécessite au minimum 6 Go de RAM et 2 cœurs CPU pour un déploiement complet avec le machine learning activé. Sans ML, 4 Go suffisent. Le stockage dépend de votre photothèque : prévoyez la taille brute de votre bibliothèque plus 10 à 20 % de surcharge pour les miniatures et les vidéos transcodées, plus 1 à 3 Go pour la base PostgreSQL. Docker Engine avec le plugin Compose est requis. Immich tourne uniquement sous Linux.
| Composant | Minimum | Recommandé |
|---|---|---|
| RAM | 4 Go (ML désactivé) | 8 Go |
| CPU | 2 cœurs | 4 cœurs |
| Stockage | 50 Go (petite bibliothèque) | 250 Go+ |
| Logiciels | Docker Engine + plugin Compose | Idem |
| OS | Tout Linux avec Docker | Ubuntu 22.04/24.04, Debian 12 |
PostgreSQL a besoin de stockage SSD local. Ne placez jamais la base de données sur un partage réseau. Sur un VPS Virtua, le NVMe est le standard, donc c'est déjà couvert.
Comment déployer Immich avec Docker Compose ?
Téléchargez le fichier Docker Compose officiel et le fichier d'environnement exemple depuis la page de release Immich, configurez vos chemins de stockage et le mot de passe de la base, puis démarrez la stack.
Créer le répertoire du projet
mkdir -p /opt/immich && cd /opt/immich
Télécharger les fichiers officiels
Récupérez toujours ces fichiers depuis la dernière release. Ne copiez-collez pas depuis des articles de blog (celui-ci inclus) parce qu'Immich met régulièrement à jour son fichier Compose pour suivre les changements d'images de base de données.
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
Configurer l'environnement
Ouvrez le fichier .env :
nano .env
Renseignez ces valeurs :
UPLOAD_LOCATION=/opt/immich/data
DB_DATA_LOCATION=/opt/immich/postgres
IMMICH_VERSION=v2.6.1
DB_PASSWORD=<votre-mot-de-passe-fort>
TZ=Europe/Berlin
Générez un mot de passe de base de données fort avec uniquement des caractères alphanumériques (A-Za-z0-9). Les caractères spéciaux posent des problèmes de parsing Docker Compose dans les fichiers .env :
openssl rand -base64 32 | tr -dc 'A-Za-z0-9' | head -c 32; echo
Copiez la sortie et collez-la comme valeur de DB_PASSWORD.
Fixez IMMICH_VERSION sur un tag de release précis comme v2.6.1 plutôt que d'utiliser le métatag v2. Cela évite les mises à jour surprises quand vous lancez docker compose pull pour d'autres services. Vous contrôlez quand Immich se met à jour.
Créer les répertoires de données
mkdir -p /opt/immich/data /opt/immich/postgres
Supprimer le port exposé
Le fichier Compose par défaut expose le port 2283 directement. Puisque vous utilisez un reverse proxy, supprimez ou commentez la section ports dans docker-compose.yml pour qu'Immich ne soit accessible que via le proxy :
sed -i "s/- '2283:2283'/# - '2283:2283'/" docker-compose.yml
Connectez ensuite Immich au réseau Docker de votre reverse proxy. Si votre réseau proxy s'appelle proxy :
cat >> docker-compose.yml << 'EOF'
networks:
default:
proxy:
external: true
EOF
Puis ajoutez le réseau proxy au service immich-server. Éditez docker-compose.yml et ajoutez sous le service immich-server :
networks:
- default
- proxy
Cela garde la base de données et Redis sur le réseau interne tout en exposant uniquement le serveur au reverse proxy.
Démarrer la stack
docker compose up -d
Surveillez les logs pour confirmer que tous les services démarrent proprement :
docker compose logs -f --tail=50
Les logs du serveur affichent Immich Server is listening on http://[::1]:2283 une fois qu'il est prêt. Le service de machine learning charge ensuite ses modèles. Appuyez sur Ctrl+C pour quitter le flux de logs.
Vérifiez que les quatre conteneurs tournent :
docker compose ps
NAME STATUS
immich_server Up (healthy)
immich_machine_learning Up (healthy)
immich_redis Up (healthy)
immich_postgres Up (healthy)
Les quatre doivent afficher Up (healthy) en quelques minutes. Le conteneur ML est le plus long car il télécharge les modèles au premier démarrage.
Restreindre les permissions des fichiers
Le fichier .env contient le mot de passe de votre base de données. Verrouillez-le :
chmod 600 .env
ls -la .env
-rw------- 1 root root 245 Mar 20 10:00 .env
Comment configurer un reverse proxy pour Immich ?
Immich a besoin d'un reverse proxy pour le HTTPS et pour gérer les gros uploads de fichiers depuis les appareils mobiles. Vous devez fixer la limite de taille du corps de requête assez haut pour les uploads vidéo. Sans cela, les uploads dépassant la limite par défaut (typiquement 1 Mo sous Nginx) échouent silencieusement.
Pour une configuration complète du reverse proxy, consultez Traefik vs Caddy vs Nginx : reverse proxy Docker comparé. Voici les extraits spécifiques à Immich.
Caddy
Dans votre Caddyfile :
photos.example.com {
reverse_proxy immich_server:2283
}
Caddy gère le TLS automatiquement et n'a pas de limite de taille de corps par défaut, donc les uploads vidéo fonctionnent directement.
Traefik
Ajoutez des labels au service immich-server dans docker-compose.yml :
labels:
- "traefik.enable=true"
- "traefik.http.routers.immich.rule=Host(`photos.example.com`)"
- "traefik.http.routers.immich.entrypoints=websecure"
- "traefik.http.routers.immich.tls.certresolver=letsencrypt"
- "traefik.http.services.immich.loadbalancer.server.port=2283"
Pour les gros uploads avec Traefik, ajoutez un middleware pour augmenter la limite de buffering ou configurez maxRequestBodyBytes dans votre configuration statique Traefik.
Nginx
Si vous utilisez Nginx comme reverse proxy, le réglage clé est client_max_body_size. Sans lui, les uploads vidéo échouent :
server {
server_name photos.example.com;
client_max_body_size 50000M;
location / {
proxy_pass http://immich_server:2283;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket support for real-time updates
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Pointez votre enregistrement DNS A (et AAAA si vous avez de l'IPv6) vers l'adresse IP de votre VPS. Après propagation DNS, accédez à Immich sur https://photos.example.com.
Comment sécuriser Immich après la première connexion ?
Ouvrez https://photos.example.com dans votre navigateur. Immich affiche une page d'inscription. Créez votre compte administrateur avec un mot de passe fort.
Après avoir créé votre compte admin, désactivez l'inscription publique immédiatement. Allez dans Administration > Settings > Server et désactivez Allow New Users. Toute personne qui découvre votre URL pourrait autrement créer un compte et uploader des fichiers sur votre stockage.
Paramètres du panneau d'administration à vérifier
- Administration > Settings > Storage Template : activez-le pour organiser les fichiers par date (
{{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}}) au lieu d'UUID aléatoires. Cela rend la navigation manuelle et les restaurations sélectives possibles. - Administration > Settings > Backup : les sauvegardes automatiques de la base sont actives par défaut, programmées quotidiennement à 2h00 avec une rétention de 14 jours. Confirmez que c'est bien actif.
- Administration > Settings > Server : définissez l'URL externe sur votre domaine (
https://photos.example.com). L'application mobile et les liens partagés l'utilisent.
Renforcement au niveau des conteneurs
Ajoutez des options de sécurité au service immich-server dans docker-compose.yml :
security_opt:
- no-new-privileges:true
Cela empêche l'escalade de privilèges à l'intérieur du conteneur. Le flag no-new-privileges bloque les binaires setuid qui tenteraient d'obtenir des permissions élevées.
Pour les limites de ressources, ajoutez des contraintes mémoire pour empêcher un conteneur de consommer toute la RAM du VPS et de déclencher le OOM killer. Consultez Limites de ressources, healthchecks et politiques de redémarrage Docker Compose pour la syntaxe complète. Un point de départ pratique pour un VPS 8 Go :
deploy:
resources:
limits:
memory: 2G
Appliquez ceci sur immich-server et immich-machine-learning. PostgreSQL et Redis ont rarement besoin de limites explicites sur un VPS 8 Go, mais en bénéficient sur une instance 4 Go.
Masquer les informations de version
Immich expose sa version dans les réponses API par défaut. Ce n'est pas une vulnérabilité directe, mais la divulgation de version aide les attaquants à cibler des failles connues. Il n'y a pas d'option intégrée pour la masquer, mais votre reverse proxy peut supprimer les en-têtes de réponse. Sous Nginx :
proxy_hide_header X-Powered-By;
Comment connecter l'application mobile Immich pour la sauvegarde automatique ?
Installez l'application Immich depuis l'App Store (iOS) ou Google Play (Android). Au premier lancement, entrez l'URL de votre serveur (https://photos.example.com) et connectez-vous avec vos identifiants admin. L'application vous propose d'activer la sauvegarde automatique.
Configurer la sauvegarde automatique
- Ouvrez l'application, appuyez sur votre avatar en haut à droite, puis Backup Settings.
- Activez Background Backup. Sur iOS, activez aussi Background App Refresh dans les réglages système. Sur Android, désactivez l'optimisation de batterie pour Immich afin que le système ne le tue pas.
- Choisissez les albums à sauvegarder. Par défaut, Immich sauvegarde votre pellicule. Vous pouvez ajouter d'autres albums (captures d'écran, images WhatsApp) depuis l'écran de sélection des albums.
- Activez Cellular Backup uniquement si votre forfait mobile le permet. Les gros uploads vidéo peuvent consommer plusieurs Go.
Premier test de sauvegarde
Prenez une photo, ouvrez l'application Immich et tirez vers le bas pour rafraîchir. La photo devrait apparaître dans la timeline en quelques secondes en Wi-Fi. L'indicateur de statut de sauvegarde dans l'application affiche une coche verte quand toutes les photos sont synchronisées.
Depuis votre VPS, vous pouvez confirmer que les uploads arrivent :
ls /opt/immich/data/upload/
Vous verrez un répertoire nommé avec votre identifiant utilisateur contenant les fichiers uploadés.
Combien de stockage faut-il par photo avec Immich ?
Le dimensionnement du stockage sur un VPS compte plus que sur un NAS parce que vous ne pouvez pas simplement ajouter un disque. Voici des chiffres réels basés sur des photothèques typiques de smartphones.
Stockage par type de photo
| Format | Taille moyenne | Notes |
|---|---|---|
| Smartphone JPEG | 3-5 Mo | Format le plus courant |
| HEIC (iPhone) | 2-3 Mo | Format par défaut Apple depuis l'iPhone 7 |
| RAW (reflex) | 25-50 Mo | Appareils professionnels |
| Vidéo smartphone (1080p) | ~150 Mo/min | Varie selon le codec |
| Vidéo smartphone (4K) | ~400 Mo/min | Le H.265 économise ~40 % |
Stockage total par taille de bibliothèque
Ce tableau utilise des JPEG smartphone à 4 Mo en moyenne, plus la surcharge Immich (miniatures, transcodages, base de données).
| Taille bibliothèque | Photos brutes | Miniatures (~15 %) | BDD | Total |
|---|---|---|---|---|
| 10 000 photos | 40 Go | 6 Go | 1 Go | ~47 Go |
| 25 000 photos | 100 Go | 15 Go | 1,5 Go | ~117 Go |
| 50 000 photos | 200 Go | 30 Go | 2 Go | ~232 Go |
| 100 000 photos | 400 Go | 60 Go | 3 Go | ~463 Go |
| 200 000 photos | 800 Go | 120 Go | 4 Go | ~924 Go |
Si votre bibliothèque inclut de la vidéo, multipliez les besoins de stockage en conséquence. Une bibliothèque avec 10 % de contenu vidéo (en nombre de fichiers) peut doubler les besoins de stockage car les vidéos sont 30 à 100 fois plus volumineuses par fichier que les photos.
Quand ajouter du stockage supplémentaire
Sur un VPS Virtua, vous pouvez attacher des volumes de stockage bloc supplémentaires quand votre disque principal se remplit. Montez le volume et pointez UPLOAD_LOCATION dessus. Pour les bibliothèques au-dessus de 500 Go, envisagez un stockage externe compatible S3. Immich le supporte via sa configuration de stockage, déchargeant les médias vers le stockage objet tout en gardant la base de données et les miniatures en local.
Surveillez l'utilisation disque avec une simple vérification cron :
df -h /opt/immich/data
Configurez une alerte quand l'utilisation dépasse 80 %. Un disque plein corrompt la base PostgreSQL et peut rendre votre instance Immich irrécupérable sans sauvegarde.
La fonctionnalité « Free Up Space » de la v2.5
Immich v2.5+ inclut un bouton « Free Up Space » dans l'application mobile. Après que les photos sont sauvegardées sur votre serveur, l'application peut supprimer les copies locales de votre téléphone pour récupérer de l'espace. Seuls les fichiers confirmés comme uploadés et absents de la corbeille Immich sont concernés. Elle fonctionne sur iOS et Android.
Comment fonctionne le machine learning d'Immich sans GPU ?
Les fonctionnalités ML d'Immich (reconnaissance faciale, recherche intelligente via CLIP et détection d'objets) tournent sur CPU par défaut. Aucun GPU n'est requis. Le conteneur immich-machine-learning charge les modèles en RAM et traite les photos en arrière-plan sans bloquer les uploads ni la navigation.
Sur un VPS 4 cœurs avec 8 Go de RAM, voici les temps de traitement approximatifs pour le scan initial :
| Taille bibliothèque | Détection faciale | Indexation CLIP | Total (séquentiel) |
|---|---|---|---|
| 1 000 photos | ~15 min | ~20 min | ~35 min |
| 10 000 photos | ~2,5 heures | ~3,5 heures | ~6 heures |
| 50 000 photos | ~12 heures | ~17 heures | ~29 heures |
Ce sont des coûts ponctuels. Après le scan initial, les nouveaux uploads sont traités en quelques secondes. Le conteneur ML tourne en basse priorité et ne bloque pas les uploads ni la navigation pendant qu'il traite la file d'attente.
Sélection des modèles
Immich utilise deux modèles ML principaux :
- Reconnaissance faciale : détecte et regroupe les visages dans votre bibliothèque. S'exécute automatiquement sur chaque upload.
- CLIP (recherche intelligente) : indexe les photos par contenu pour que vous puissiez chercher « coucher de soleil » ou « chien sur la plage » sans tags. Utilise plus de RAM que la reconnaissance faciale.
Les deux modèles se chargent en RAM quand ils sont sollicités pour la première fois et se déchargent après 5 minutes d'inactivité (MACHINE_LEARNING_MODEL_TTL=300 par défaut). Sur un VPS limité en mémoire, vous pouvez réduire cette valeur pour libérer la RAM plus vite :
# In .env
MACHINE_LEARNING_MODEL_TTL=60
Recréez le conteneur après avoir modifié les variables d'environnement (un simple redémarrage ne suffit pas) :
docker compose up -d --force-recreate immich-machine-learning
Répartition de la RAM par composant
| Composant | Usage RAM (VPS 8 Go) | Usage RAM (VPS 4 Go) |
|---|---|---|
| immich-server | ~500 Mo | ~500 Mo |
| immich-machine-learning | ~1,5-2 Go | désactivé |
| PostgreSQL | ~500 Mo-1 Go | ~500 Mo |
| Redis (Valkey) | ~50 Mo | ~50 Mo |
| OS + overhead Docker | ~1 Go | ~1 Go |
| Marge disponible | ~3-4 Go | ~2 Go |
Comment désactiver le ML pour économiser des ressources sur un petit VPS ?
Si vous avez un VPS 4 Go ou si vous voulez économiser des ressources, supprimez ou commentez le service immich-machine-learning dans docker-compose.yml :
cd /opt/immich
Éditez docker-compose.yml et commentez (ou supprimez) le bloc complet du service immich-machine-learning. Puis redémarrez :
docker compose up -d
Vous perdez la reconnaissance faciale, la recherche intelligente et la détection d'objets. L'upload de photos, la navigation, le partage et la gestion des albums fonctionnent normalement. Vous pouvez réactiver le ML plus tard en décommentant le service et en redémarrant.
Comment sauvegarder la base de données et les photos d'Immich ?
Sauvegardez deux choses : la base PostgreSQL avec pg_dump et le répertoire d'upload avec rsync. Planifiez les deux en cron. N'utilisez pas rsync --delete sur la cible de sauvegarde car une corruption sur la source se propagerait à votre sauvegarde. Stockez au moins une copie hors du serveur. Testez régulièrement votre procédure de restauration.
Sauvegarde de la base de données
docker exec -t immich_postgres pg_dump \
--clean --if-exists \
--dbname=immich \
--username=postgres | gzip > /opt/immich/backups/db-$(date +%Y%m%d-%H%M%S).sql.gz
Sauvegarde du répertoire d'upload
rsync -a --info=progress2 \
/opt/immich/data/ \
/mnt/backup/immich-data/
Pour gagner de la place, excluez les miniatures et les vidéos transcodées. Elles se régénèrent automatiquement :
rsync -a --info=progress2 \
--exclude='thumbs/' \
--exclude='encoded-video/' \
/opt/immich/data/ \
/mnt/backup/immich-data/
Automatiser avec cron
Créez un script de sauvegarde :
cat > /opt/immich/backup.sh << 'SCRIPT'
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/mnt/backup/immich"
mkdir -p "$BACKUP_DIR/db"
# Database dump
docker exec -t immich_postgres pg_dump \
--clean --if-exists \
--dbname=immich \
--username=postgres | gzip > "$BACKUP_DIR/db/immich-db-$(date +%Y%m%d).sql.gz"
# Keep last 14 database dumps
find "$BACKUP_DIR/db" -name "immich-db-*.sql.gz" -mtime +14 -delete
# Media sync (excludes regeneratable data)
rsync -a \
--exclude='thumbs/' \
--exclude='encoded-video/' \
/opt/immich/data/ \
"$BACKUP_DIR/media/"
echo "Backup completed: $(date)"
SCRIPT
chmod 700 /opt/immich/backup.sh
Planifiez-le pour tourner chaque nuit à 3h00 (après la sauvegarde interne d'Immich à 2h00) :
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/immich/backup.sh >> /var/log/immich-backup.log 2>&1") | crontab -
Sauvegarde hors site
Pour une vraie stratégie de sauvegarde 3-2-1, copiez les sauvegardes hors du serveur avec rclone vers n'importe quel fournisseur de stockage compatible S3 :
rclone sync /mnt/backup/immich remote:immich-backup --transfers 4
Consultez la documentation de votre fournisseur de stockage pour la configuration de rclone.
Tester la restauration
Une sauvegarde que vous n'avez pas testée n'est pas une sauvegarde. Voici la procédure de restauration :
cd /opt/immich
docker compose down -v
rm -rf /opt/immich/postgres/*
docker compose pull
docker compose create
docker start immich_postgres
sleep 10
gunzip --stdout /mnt/backup/immich/db/immich-db-20260320.sql.gz | \
sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" | \
docker exec -i immich_postgres psql \
--dbname=immich \
--username=postgres \
--single-transaction \
--set ON_ERROR_STOP=on
docker compose up -d
Après la restauration, connectez-vous à l'interface web. Parcourez votre timeline et confirmez que les photos se chargent. Si des miniatures manquent (parce que vous les avez exclues de la sauvegarde), allez dans Administration > Job Queues et lancez Generate Thumbnails.
Comment mettre à jour Immich en toute sécurité ?
Immich suit le versionnement sémantique et publie fréquemment. Certaines releases incluent des migrations de base de données. Le downgrade après une mise à jour n'est pas supporté. Vous avez donc besoin d'un workflow de mise à jour discipliné.
Procédure de mise à jour pas à pas
-
Lisez le changelog. Vérifiez la page des releases pour les breaking changes avant de pull quoi que ce soit.
-
Sauvegardez la base de données. Lancez le script de sauvegarde ou un
pg_dumpmanuel comme montré plus haut. Ne sautez pas cette étape. -
Mettez à jour le pin de version. Éditez
/opt/immich/.envet changezIMMICH_VERSIONpour la nouvelle version :
# Example: updating from v2.6.1 to v2.7.0
sed -i 's/IMMICH_VERSION=v2.6.1/IMMICH_VERSION=v2.7.0/' /opt/immich/.env
- Pull et redémarrage.
cd /opt/immich
docker compose pull
docker compose up -d
- Vérifiez les logs.
docker compose logs -f --tail=100
Recherchez les messages de migration et confirmez que le serveur démarre sans erreurs. Les migrations de base de données s'exécutent automatiquement au démarrage.
- Nettoyez les anciennes images.
docker image prune -f
Rollback
Si quelque chose casse, vous ne pouvez pas simplement revenir à la version précédente car la base de données a peut-être migré. Restaurez plutôt à partir de votre sauvegarde pré-mise-à-jour :
- Arrêtez la stack :
docker compose down -v - Restaurez la base depuis votre sauvegarde (voir la section restauration ci-dessus)
- Remettez
IMMICH_VERSIONà la version précédente dans.env - Redémarrez la stack :
docker compose up -d
C'est pourquoi vous sauvegardez avant chaque mise à jour.
Comment importer des photos depuis Google Takeout dans Immich ?
Le moyen le plus simple d'importer un export Google Photos est immich-go, un outil communautaire qui lit directement les fichiers ZIP de Google Takeout. Il préserve la structure des albums, les dates et les métadonnées GPS des fichiers JSON sidecar.
Téléchargez immich-go sur votre machine locale (pas le VPS). Générez une clé API dans Immich : cliquez sur votre avatar > Account Settings > API Keys > New API Key.
immich-go upload from-google-photos \
--server=https://photos.example.com \
--api-key=your-api-key \
/path/to/takeout-*.zip
Lancez d'abord un dry run pour voir ce qui sera importé :
immich-go upload from-google-photos \
--server=https://photos.example.com \
--api-key=your-api-key \
--dry-run \
/path/to/takeout-*.zip
L'outil déduplique par checksum. Si vous lancez l'import deux fois, rien n'est uploadé une seconde fois.
Pour les imports plus petits (moins de quelques milliers de photos), utilisez l'interface web d'Immich. Glissez-déposez les fichiers dans la vue timeline ou cliquez sur le bouton d'upload. L'uploader web gère les lots mais est plus lent qu'immich-go pour les grosses bibliothèques.
Montage de bibliothèque externe
Si vos photos sont déjà sur le système de fichiers du VPS (depuis une sauvegarde ou migration précédente), vous pouvez les monter comme bibliothèque externe au lieu de les re-uploader. Ajoutez le chemin comme volume dans docker-compose.yml sous immich-server :
volumes:
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
- /mnt/photos:/mnt/photos:ro
Puis dans l'interface web Immich, allez dans Administration > External Libraries et ajoutez /mnt/photos comme chemin de bibliothèque. Immich indexe les fichiers sur place sans les copier. Le flag :ro garde le montage en lecture seule pour qu'Immich ne puisse pas modifier vos originaux.
Dépannage
Le conteneur redémarre en boucle
Vérifiez les logs du conteneur concerné :
docker compose logs immich-server --tail=50
docker compose logs database --tail=50
Causes fréquentes : mauvais DB_PASSWORD dans .env (le conteneur et la base ne sont pas d'accord), RAM insuffisante (OOM killer), ou disque plein.
Les uploads échouent silencieusement
Presque toujours un problème de limite de taille du corps de requête du reverse proxy. Vérifiez votre configuration proxy pour client_max_body_size (Nginx) ou équivalent. Caddy n'a pas de limite par défaut. Les valeurs par défaut de Traefik varient selon la version.
Les modèles ML ne se chargent pas
Le conteneur ML télécharge les modèles au premier démarrage. Si votre VPS a une bande passante limitée ou si le téléchargement a été interrompu, les modèles peuvent être corrompus. Supprimez le conteneur, effacez le volume de cache des modèles et recréez-le :
docker compose rm -sf immich-machine-learning
docker volume rm immich_model-cache
docker compose up -d immich-machine-learning
Les photos s'affichent mais les miniatures sont cassées
Régénérez les miniatures depuis le panneau admin : Administration > Job Queues > Generate Thumbnails > Start.
Erreurs de connexion à la base après restauration
Si vous voyez des erreurs relation already exists ou foreign key constraint violated pendant une restauration, la base n'était pas totalement propre avant l'import. Arrêtez tous les conteneurs, supprimez le répertoire DB_DATA_LOCATION, recréez le conteneur postgres, attendez 10 secondes pour l'initialisation, puis relancez la restauration.
Consulter les logs
Tous les logs Immich passent par le driver de logging Docker :
docker compose logs -f
Pour un service spécifique :
docker compose logs database -f
docker compose logs immich-machine-learning -f
Filtrer uniquement les erreurs :
docker compose logs immich-server 2>&1 | grep -i error
Copyright 2026 Virtua.Cloud. Tous droits réservés. Ce contenu est une création originale de l'équipe Virtua.Cloud. Toute reproduction, republication ou redistribution sans autorisation écrite est interdite.
Prêt à essayer ?
Déployez votre serveur en quelques secondes. Linux, Windows ou FreeBSD.
Voir les offres VPS