PhotoPrism ou Immich : quel serveur photo choisir ?
Comparez PhotoPrism et Immich : RAM minimale réelle, applications mobiles, cartes et commandes de sauvegarde exactes pour un déploiement Docker sur VPS.
PhotoPrism ou Immich : réponse courte
PhotoPrism ou Immich, c’est le choix entre deux usages différents, pas entre deux versions d’un même produit. Immich remplace Google Photos : une application mobile sauvegarde automatiquement les photos de votre appareil, et la timeline obtenue est familière à toute personne qui abandonne la galerie de son téléphone. PhotoPrism organise une photothèque que vous possédez déjà : il indexe les dossiers de fichiers présents sur le disque, lit leurs métadonnées, les place sur une carte et laisse les fichiers exactement à leur emplacement.
Choisissez Immich si le problème est le suivant : « mon téléphone est plein et je veux quitter Google Photos ». Choisissez PhotoPrism si le problème est le suivant : « j’ai 400 GB de photos sur un disque et je ne retrouve rien ». Les deux sont open source, s’exécutent sous forme de conteneurs Docker sur un VPS standard et indexent et recherchent votre photothèque sans envoyer quoi que ce soit à un tiers.
La philosophie diffère, et elle détermine tout
Immich gère les fichiers. Vous lui indiquez un emplacement d’importation, puis l’application mobile ou l’interface web y envoie les originaux. Immich les stocke sous son propre chemin, avec sa propre convention de nommage. La base de données contient les informations de référence sur les albums, les visages et la recherche. Cette conception explique la qualité de l’expérience mobile : le serveur connaît toujours l’état complet de chaque élément.
PhotoPrism lit les fichiers. Vous montez un dossier originals que vous contrôlez déjà, puis PhotoPrism crée un index à partir de son contenu. Votre arborescence reste la vôtre. Si vous supprimez PhotoPrism demain, les photos restent dans les mêmes dossiers, avec les mêmes noms. Les fichiers YAML sidecar que PhotoPrism a écrits pour décrire les informations qu’il a analysées restent dans son propre dossier de stockage, qui est l’emplacement utilisé par défaut.
Cette différence unique explique l’essentiel du reste. Immich offre une excellente prise en charge mobile parce qu’il contrôle l’importation. PhotoPrism gère mieux la curation d’une photothèque parce qu’il ne modifie jamais votre structure existante. Immich convient mieux à une famille dont les photos se trouvent sur les téléphones. PhotoPrism convient mieux à une archive stockée sur un disque.
Besoin en ressources matérielles : Immich en demande davantage
Les minima de mémoire documentés sont très différents. Sur un petit VPS, c’est généralement le facteur décisif.
Les données de ce graphique
[
{
"label": "Immich",
"min_ram_gb": 6
},
{
"label": "PhotoPrism",
"min_ram_gb": 3
}
]Immich indique 6 Go de RAM au minimum et recommande 8 Go. La documentation précise qu’une machine dotée de 4 Go ne peut l’exécuter qu’avec le machine learning désactivé. PhotoPrism documente 3 Go de mémoire physique et deux cœurs CPU. Au-delà de ce minimum, la quantité de RAM doit correspondre au nombre de cœurs.
L’écart est réel. Il vient du conteneur de machine learning. Immich exécute ses modèles dans un service immich-machine-learning distinct qui charge en mémoire CLIP (contrastive language image pretraining) et des modèles de détection des visages. Sur une machine de 2 Go, le kernel tue ce conteneur. Vous le voyez alors quitter avec le code 137, qui indique un processus tué par le signal 9. C’est ainsi qu’un kill pour manque de mémoire apparaît dans Docker. Les modèles intégrés de PhotoPrism utilisent ONNX. Sa documentation indique qu’ils offrent généralement de bonnes performances sur tous les types de matériel. PhotoPrism propose aussi un fallback documenté lorsque la mémoire est limitée : sur les machines dotées de 1 Go ou moins, il désactive la conversion RAW et la reconnaissance faciale. Cela ne garantit toutefois pas la stabilité. En dessous de son minimum de 3 Go, le projet avertit de risques d’instabilité et de problèmes de performances. Considérez donc cette valeur comme un véritable minimum.
La documentation de PhotoPrism indique explicitement qu’il faut au moins 4 Go de swap sur le serveur. La page des prérequis d’Immich ne mentionne pas le swap, mais celui-ci donne une marge supplémentaire à son conteneur de machine learning sur une petite machine. Ajoutez-le avant d’installer l’une ou l’autre application.
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -hfree -h doit maintenant afficher une ligne Swap: indiquant 4.0Gi. Si la sortie affiche 0B, alors swapon a échoué, généralement parce que le système de fichiers ne prend pas en charge fallocate, et sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 est utilisé en fallback. Les plafonds de mémoire des conteneurs sont également importants ici. Définir des limites de mémoire dans Docker Compose permet d’empêcher un service trop gourmand de faire tomber toute la machine. PhotoPrism fait exception : sa documentation déconseille de définir une limite mémoire stricte sur son conteneur. L’indexation de fichiers volumineux nécessite temporairement davantage de mémoire, et une limite peut provoquer des redémarrages inattendus.
Une autre exigence pose souvent problème. La base de données Postgres d’Immich doit se trouver sur un système de fichiers Unix normal, avec de véritables propriétaires et permissions, sur un stockage local, jamais sur un partage réseau. PhotoPrism déconseille également de stocker ses fichiers de base de données sur un dossier réseau partagé et recommande un stockage SSD local. Aucune de ces applications ne doit utiliser une base de données située sur un object store monté.
Installation de chacun
Les deux installations reposent sur un fichier Compose fourni par l’éditeur et une commande. Installez d’abord Docker Engine et le plugin Compose, comme indiqué dans notre guide de Docker Compose sur un VPS.
Immich publie son fichier Compose et un fichier d’environnement d’exemple avec chaque release.
sudo mkdir -p /opt/immich && cd /opt/immich
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.envModifiez .env avant de démarrer quoi que ce soit. UPLOAD_LOCATION est le répertoire où seront stockés vos originaux, et DB_PASSWORD doit être remplacé par une valeur utilisant uniquement les caractères A-Za-z0-9, car les caractères spéciaux cassent la chaîne de connexion. Démarrez ensuite le service.
docker compose up -d
docker compose psL’interface web écoute sur le port 2283. Le premier compte créé depuis cette page devient administrateur. Accédez-y et créez immédiatement ce compte, plutôt que de laisser une instance ouverte sur Internet.
PhotoPrism fournit un fichier Compose qui inclut déjà MariaDB.
sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yamlOuvrez compose.yaml et modifiez PHOTOPRISM_ADMIN_PASSWORD avant le premier démarrage. La documentation est claire sur ce point : l’application démarre avec le mot de passe initial indiqué dans ce fichier, sa longueur minimale est de 8 caractères et la valeur par défaut ne doit jamais être utilisée sur un serveur public. Configurez également le volume originals pour qu’il pointe vers le répertoire contenant vos photos.
docker compose up -d
docker compose logs -f photoprismPhotoPrism écoute sur le port 2342 avec l’utilisateur admin. Aucune des deux applications ne doit être exposée directement. Placez un reverse proxy avec TLS (transport layer security) devant l’application, selon la même architecture que celle utilisée pour un Nextcloud auto-hébergé avec Docker, TLS et des sauvegardes, ou gardez le serveur privé et accédez-y via un VPN. Si ce VPS héberge ensuite autre chose que des photos, appliquez la même restriction à chaque service ajouté, car un relais RustDesk auto-hébergé n’a besoin que de ses deux propres ports accessibles, et de rien d’autre.
Laquelle offre la meilleure application mobile
C’est sur ce point que les deux projets sont le plus éloignés, et c’est la raison pour laquelle la plupart des utilisateurs choisissent Immich.
Immich fournit des applications officielles pour Android et iOS. Elles sauvegardent automatiquement la pellicule en arrière-plan : les nouvelles photos quittent le téléphone sans qu’il soit nécessaire d’ouvrir une application. Pour l’utiliser depuis l’extérieur du domicile, Immich documente trois solutions : un VPN comme WireGuard ou OpenVPN, Tailscale ou un reverse proxy qui sert le site en HTTPS. Le reverse proxy permet aux applications mobiles de se connecter sans installer une application VPN sur chaque téléphone. Immich déconseille de rediriger directement le port 2283 vers Internet sans configuration supplémentaire.
PhotoPrism ne possède pas d’application native officielle. Le projet fournit une progressive web app, que vous pouvez ajouter à l’écran d’accueil depuis le navigateur. Il documente WebDAV (web distributed authoring and versioning) comme méthode de synchronisation depuis un téléphone. Le projet recommande pour cela une application tierce appelée PhotoSync, configurée pour utiliser le répertoire /import/ ou /originals/ via WebDAV. La solution fonctionne, mais il s’agit d’une application tierce payante qui effectue une tâche prise en charge directement par le client Immich.
Si la sauvegarde automatique des photos de plusieurs membres de la famille est nécessaire, le choix est arrêté : Immich.
Ce que le machine learning apporte réellement
Immich effectue des recherches sémantiques dans votre bibliothèque avec CLIP. Une requête comme « vélo rouge dans la neige » peut donc trouver des photos que personne n’a jamais taguées. L’application détecte et regroupe également les visages, et recherche les doublons. L’indexation d’un import volumineux sur CPU peut durer plusieurs heures en arrière-plan. C’est normal et cela ne nécessite pas de GPU (graphics processing unit).
PhotoPrism classe les images avec des labels à l’aide d’un modèle ONNX intégré, détecte les visages et les regroupe par personne avec des modèles de reconnaissance faciale ONNX, puis lit les métadonnées de localisation pour créer une carte des lieux. Un fichier vision.yml dans son dossier de configuration permet de remplacer le modèle utilisé pour les labels et les légendes par Ollama ou OpenAI. La carte est la fonction qui convainc les utilisateurs de rester : une bibliothèque indexée selon le lieu où les événements se sont déroulés offre une manière réellement différente de parcourir vingt ans de photos. La même idée fonctionne avec d’autres collections de médias. L’interface de vidéoclub des années 90 de Halcyon pour Jellyfin en est la version dédiée aux films : elle permet de parcourir les contenus par rayon plutôt que sous forme de liste. La reconnaissance faciale est incluse dans l’édition gratuite Community. Les abonnements payants Essentials et Plus ajoutent des fonctions telles que des couches cartographiques plus riches, davantage de rôles utilisateur et une interface de gestion des utilisateurs. Ils commencent à quelques euros par mois, avec une facturation annuelle, en octobre 2026.
Immich ne propose aucune fonction payante et le projet indique que cela ne changera jamais. Le projet vend toutefois des product keys à vie facultatives : $25 pour un utilisateur ou $100 pour un serveur complet, aux tarifs annoncés par Immich en juillet 2024. Leur achat ne débloque aucune fonction. Immich reste utilisable sans restriction si vous ne payez rien. Le cœur de PhotoPrism est gratuit, avec des fonctions payantes facultatives.
Les sauvegardes déterminent si vous pourrez conserver vos données
Un serveur photo sans sauvegarde peut perdre toutes les photos d’une famille à la première panne de disque. Les deux applications nécessitent 2 sauvegardes : la base de données et les fichiers.
Pour Immich, exportez la base de données depuis le conteneur Postgres et copiez l’emplacement des téléchargements.
docker exec -t immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > /backup/immich-db.sql.gzSauvegardez ensuite UPLOAD_LOCATION. Les dossiers contenant les données irremplaçables sont upload, library et profile. Les dossiers thumbs et encoded-video peuvent être régénérés, au prix de plusieurs heures de calcul CPU. Un export de la base de données ne suffit pas à lui seul, car il ne contient que les métadonnées.
Pour PhotoPrism, l’index possède sa propre commande.
docker compose exec photoprism photoprism backup -i -fCette commande écrit un export SQL dans storage/backup/. Copiez ensuite le dossier originals et le dossier storage. PhotoPrism écrit également des fichiers YAML sidecar qui décrivent chaque photo. L’index perdu peut donc être reconstruit à partir des fichiers seuls. C’est un avantage important pour une archive que vous prévoyez de conserver pendant plusieurs décennies.
Quel que soit votre choix, envoyez régulièrement ces sauvegardes vers un emplacement distant avec des sauvegardes restic chiffrées et dédupliquées vers un stockage distant. Une sauvegarde stockée sur le même disque que la bibliothèque n’est pas une sauvegarde. Configurez la tâche pour signaler toute erreur, car une sauvegarde qui s’est arrêtée silencieusement en mars ressemble exactement à une sauvegarde exécutée la nuit dernière jusqu’au jour où vous en avez besoin. Un serveur ntfy auto-hébergé vous transmettra cette erreur sur votre téléphone le soir même.
Lequel devez-vous utiliser
Utilisez Immich si vos photos sont sur des téléphones, si plusieurs personnes doivent sauvegarder leur pellicule et si vous pouvez fournir au serveur au moins 6 GB de RAM. C’est ce qui se rapproche le plus de Google Photos en auto-hébergement, et l’expérience mobile est son principal intérêt. Notre guide d’installation détaillé d’Immich explique les arrêts dus au manque de mémoire et les pièges liés aux mises à niveau.
Utilisez PhotoPrism si vous avez déjà une archive photo sur disque, si vous accordez de l’importance aux cartes et aux métadonnées tout en souhaitant conserver votre propre arborescence, ou si votre VPS dispose de 4 GB de RAM et que vous préférez une bibliothèque fonctionnelle à une bibliothèque qui utilise le swap. C’est le meilleur outil pour organiser et sélectionner les photos, et il sollicite moins les petites configurations.
Utiliser les deux est également pertinent. Immich gère l’import quotidien des photos depuis les téléphones. Une fois par an, vous triez les photos à conserver dans votre archive, puis vous laissez PhotoPrism les indexer. Ils ne se gênent pas, car PhotoPrism lit les dossiers tandis qu’Immich gère son propre stockage. Si aucune des deux ne vous convient, par exemple parce que vous exigez un chiffrement de bout en bout, notre tour d’horizon des alternatives à Immich auto-hébergées indique quelle option lève chaque limite et ce qu’elle vous fait perdre.
FAQ
PhotoPrism et Immich peuvent-ils partager le même dossier de photos ?
Pas de manière sûre dans les deux sens. PhotoPrism indexe un dossier originals et certaines de ses fonctions y écrivent, sauf s’il fonctionne en mode lecture seule. Immich, de son côté, s’attend à gérer le contenu de son emplacement d’envoi. Vous pouvez configurer PhotoPrism pour utiliser une copie en lecture seule du dossier library d’Immich afin de le parcourir. En revanche, ne laissez pas les deux applications gérer les mêmes fichiers. Le modèle de stockage d’Immich peut déplacer ou renommer des fichiers pendant que PhotoPrism les indexe.
Immich est-il suffisamment stable pour conserver l’unique copie de mes photos ?
Aucune application auto-hébergée ne doit conserver l’unique copie de quoi que ce soit. Immich suit désormais le versionnage sémantique et indique que les changements incompatibles sont limités aux versions majeures. Épinglez donc IMMICH_VERSION sur un tag de version majeure tel que v3, lisez les notes de version, puis effectuez la mise à niveau avec docker compose pull && docker compose up -d. La rétrogradation n’est pas prise en charge, même au sein d’une même version mineure. Effectuez donc un dump de la base de données avant chaque mise à niveau. Conservez une sauvegarde des fichiers d’origine hors du serveur pour limiter le risque.
Pourquoi le conteneur de machine learning d’Immich redémarre-t-il sans cesse ?
Il est généralement tué parce qu’il utilise trop de mémoire. Exécutez docker compose ps --all, car un conteneur arrêté n’apparaît pas sans ce flag, puis recherchez l’arrêt du service de machine learning avec le code 137. Ce code signifie que le processus a été tué avec le signal 9. Le killer out of memory du kernel est la cause habituelle, mais ce n’est pas la seule. Confirmez-la avec sudo dmesg | grep -i 'out of memory'. Ajoutez du swap ou désactivez complètement le machine learning sur une machine équipée de 4 GB de mémoire. Une limite mémoire sur le conteneur ne le ralentit pas : lorsque la limite est atteinte, le processus est toujours tué, mais il cesse de priver le reste du serveur de mémoire. La recherche intelligente et la reconnaissance faciale ne fonctionnent plus sans machine learning, mais le reste d’Immich continue de fonctionner correctement.
PhotoPrism a-t-il besoin de MariaDB, ou SQLite suffit-il ?
SQLite fonctionne et convient à une bibliothèque personnelle. Toutefois, PhotoPrism se limite à quatre workers lorsqu’il l’utilise, et la documentation recommande de passer à MariaDB, qui gère mieux les fortes concurrences. Le fichier compose fourni par le projet inclut déjà MariaDB. La méthode recommandée est donc également la méthode par défaut.
Combien d’espace disque faut-il prévoir au-delà de la taille de ma bibliothèque ?
Ajoutez 10 à 20 % à la taille de vos fichiers d’origine, quelle que soit l’application utilisée. Cela couvre les miniatures générées et les aperçus vidéo transcodés. Une collection de 200 GB nécessite environ 220 à 240 GB pour la bibliothèque seule, auxquels il faut ajouter de l’espace pour la base de données et la croissance future. Si vous conservez également une copie de sauvegarde locale complète sur le même volume, les fichiers d’origine et cette copie nécessitent au moins 400 GB avant tout autre élément. Prévoyez donc environ 450 GB ou placez la copie sur un volume séparé.