Pourquoi auto-héberger PhotoPrism sur un VPS
Là où Immich vise l'expérience cloud complète avec sauvegarde mobile temps réel, PhotoPrism privilégie l'indexation et l'organisation d'une photothèque existante, souvent volumineuse, posée sur un système de fichiers. Il analyse vos dossiers, classe les photos par labels (montagne, plage, voiture), détecte les visages, lit les EXIF et géocode les clichés. Tout cela s'exécute localement via TensorFlow embarqué. L'héberger sur un VPS a un double intérêt : centraliser des archives photo dispersées sur un disque accessible partout, et bénéficier d'un étiquetage automatique sans jamais transmettre les images à un service tiers. PhotoPrism fonctionne avec MariaDB pour de bonnes performances et lit directement un dossier originals que vous remplissez par WebDAV, rsync ou montage.
Les atouts d'un PhotoPrism auto-hébergé
- Étiquetage automatique par IA locale : recherche par mots-clés, lieux et couleurs sans cloud.
- Indexation d'archives existantes posées sur le disque, via WebDAV, rsync ou montage réseau.
- Détection des doublons et des photos similaires pour nettoyer une collection encombrée.
- Cartes interactives basées sur les coordonnées GPS extraites des métadonnées EXIF.
- Mode lecture seule possible : PhotoPrism indexe sans jamais modifier vos fichiers originaux.
- Interface PWA installable, accessible depuis n'importe quel navigateur de votre réseau.
Prérequis chiffrés : RAM, CPU, stockage et réseau
PhotoPrism est gourmand en mémoire dès que TensorFlow entre en jeu. Voici les seuils à respecter pour éviter les mauvaises surprises. Sans GPU et avec le moteur ML actif, comptez 2 Go de RAM minimum : en dessous, le processus d'indexation déclenche un OOM (out of memory) et le conteneur redémarre en boucle. Avec le ML pleinement actif (détection de visages, classification de scènes), 4 Go de RAM sont recommandés — c'est le palier confort pour une bibliothèque de 10 000 à 50 000 photos. Un vCPU minimum suffit pour naviguer, mais l'indexation initiale d'une grande archive tire parti de 2 à 4 cœurs : PhotoPrism distribue le travail via PHOTOPRISM_WORKERS. Le port par défaut est 2342 ; pensez à l'ouvrir temporairement pour un premier test avant de placer le reverse proxy. Côté stockage, provisionnez vos originals (la taille réelle de votre bibliothèque) plus 30 à 40 % pour les miniatures multi-résolutions, le cache et l'index MariaDB. Une bibliothèque de 100 Go d'originaux génère généralement entre 20 et 35 Go de données dérivées. Ajoutez une partition de swap de 2 Go minimum si votre VPS a moins de 4 Go de RAM : elle absorbe les pics d'indexation sans crash, au prix d'une légère lenteur.
Déployer PhotoPrism étape par étape
Préparer le VPS et les volumes
Installez Docker, puis créez deux dossiers persistants :
/opt/photoprism/originalspour vos photos et/opt/photoprism/storagepour le cache et la base d'index. Séparer ces volumes simplifie les sauvegardes.Déclarer PhotoPrism et MariaDB
Dans
docker-compose.yml, ajoutez un servicemariadbavec un volume dédié et un servicephotoprism(imagephotoprism/photoprism:latest). Liez-les viaPHOTOPRISM_DATABASE_DRIVER=mysqlet pointezPHOTOPRISM_ORIGINALS_PATHvers votre dossier de photos.Définir l'administrateur et le mode d'indexation
Renseignez
PHOTOPRISM_ADMIN_PASSWORDet activezPHOTOPRISM_READONLY=truesi vous voulez qu'il indexe sans toucher aux originaux. Lancez ensuite la stack avecdocker compose up -d.Importer et lancer la première indexation
Copiez vos photos dans le dossier
originalsviarsyncou WebDAV, puis déclenchez l'analyse depuis l'interface ou en ligne de commande avecdocker compose exec photoprism photoprism index. C'est là que l'IA génère labels et miniatures.Configurer nginx comme reverse proxy avec SSL Certbot
Installez nginx et certbot sur l'hôte. Créez un bloc server dans
/etc/nginx/sites-available/photoprism.confqui écoute sur le port 80, redirige vers 443 et proxifie vershttp://127.0.0.1:2342. Ajoutez les directivesproxy_set_header Host $host,proxy_set_header X-Real-IP $remote_addretproxy_set_header X-Forwarded-Proto $schemepour que PhotoPrism détecte correctement le schéma HTTPS. Obtenez le certificat aveccertbot --nginx -d galerie.votredomaine.com. Le renouvellement automatique est géré par le timer systemd de certbot — vérifiez avecsystemctl status certbot.timer.
Accès mobile : application iOS et Android
PhotoPrism ne propose pas d'application native de sauvegarde automatique comme Immich, mais son interface PWA (Progressive Web App) est optimisée pour mobile : ajoutez-la à l'écran d'accueil depuis Safari (iOS) ou Chrome (Android) pour une expérience quasi-native. Pour la consultation et la recherche, c'est suffisant. Si vous souhaitez un accès hors réseau local, activez le HTTPS (voir l'étape reverse proxy) : la PWA ne s'installe qu'en contexte sécurisé. Pour la sauvegarde depuis le téléphone, la solution complémentaire habituelle est Syncthing ou rclone : configurez-les pour envoyer le dossier DCIM vers /opt/photoprism/originals sur le VPS, puis planifiez une ré-indexation automatique via un cron qui exécute docker compose exec -T photoprism photoprism index --cleanup.
Optimisation ML sur VPS sans GPU : les variables clés
Sur un VPS standard (pas de GPU dédié), TensorFlow tourne en mode CPU. Trois variables d'environnement permettent d'ajuster le rapport qualité/ressources. PHOTOPRISM_WORKERS contrôle le nombre de threads d'indexation parallèles — mettez-le au nombre de vCPU disponibles (2 ou 4) pour accélérer l'indexation initiale sans saturer le CPU. Sur un VPS à 1 vCPU, forcez-le à 1 pour éviter la contention. PHOTOPRISM_DISABLE_TENSORFLOW (valeur true) désactive entièrement le moteur ML : plus de classification automatique ni de détection de visages, mais l'indexation est significativement plus rapide pour l'indexation et la consommation RAM chute à moins d'1 Go. Utile pour une migration initiale d'une très grosse archive — réactivez ensuite le ML pour relancer l'analyse. PHOTOPRISM_DETECT_NSFW (valeur true) active le filtre de contenu inapproprié, au prix d'un passage supplémentaire du modèle sur chaque image : ne l'activez que si vous en avez réellement besoin, car il alourdit l'indexation. Pour les VPS entre 2 et 4 Go de RAM, la configuration recommandée est PHOTOPRISM_WORKERS=2, PHOTOPRISM_DETECT_NSFW=false et TensorFlow actif — vous obtenez le ML sans risque d'OOM.
Dépannage : les erreurs les plus fréquentes
OOM (Out of Memory) dès le démarrage ou pendant l'indexation. C'est la première erreur sur les VPS à 1 Go de RAM. La signature dans les logs Docker : Killed ou signal: killed sur le processus photoprism. Solution immédiate : ajouter du swap (fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile) et ajouter la ligne dans /etc/fstab pour le rendre persistant. Solution durable : passer à un VPS avec 2 Go minimum. Indexation interminable qui ne se termine jamais. Sur une bibliothèque de 50 000 photos sur un VPS à 2 vCPU, la première indexation complète (avec ML) peut prendre 6 à 24 heures. C'est normal. Suivez la progression dans les logs avec docker compose logs -f photoprism. Si le processus semble bloqué sans avancer depuis plus d'une heure, vérifiez l'utilisation CPU : docker stats photoprism. Si elle est à 0 %, redémarrez le service. Problèmes de permissions sur les volumes. PhotoPrism tourne avec l'UID 1000 par défaut. Si /opt/photoprism/originals appartient à root, l'accès échoue silencieusement. Corrigez avec chown -R 1000:1000 /opt/photoprism. Vérifiez aussi que le volume storage est inscriptible : c'est là que PhotoPrism écrit les miniatures et l'index local. L'interface charge mais les photos n'apparaissent pas. Vérifiez que l'indexation a bien été lancée (photoprism index) et non seulement le service démarré. L'import initial n'est pas automatique.
Stratégie de sauvegarde : originals, storage et base de données
Une sauvegarde PhotoPrism efficace distingue trois composants aux besoins différents. Le dossier originals contient vos fichiers maîtres (JPEG, RAW, vidéos) : c'est l'irremplaçable. Sauvegardez-le en priorité avec une copie hors site — rclone sync /opt/photoprism/originals remote:backup/originals vers un stockage objet (Backblaze B2, S3) fonctionne bien et supporte les reprises incrémentales. Fréquence recommandée : quotidienne. Le dossier storage contient les miniatures générées, le cache et les données de sidecar. Il peut être entièrement reconstruit par une ré-indexation (photoprism index --force) : sauvegardez-le uniquement si vous voulez éviter de relancer une longue indexation après incident. Un snapshot hebdomadaire suffit. La base MariaDB stocke l'index des métadonnées, les albums, les labels manuels et les faces identifiées — tout le travail de curation que vous avez fait manuellement. Sauvegardez-la séparément avec un dump régulier : docker compose exec mariadb mysqldump -u photoprism -p photoprism > /opt/backup/photoprism-db-$(date +%Y%m%d).sql. Planifiez ce dump en cron et chiffrez-le avant l'envoi hors site. Si vous utilisez SQLite au lieu de MariaDB, copiez simplement le fichier .db après avoir arrêté PhotoPrism pour garantir la cohérence.
PhotoPrism ou Immich : lequel choisir
Faites défiler le tableau
| Critère | PhotoPrism | Immich |
|---|---|---|
| Objectif principal | Indexer et organiser une photothèque existante | Cloud photo complet avec sauvegarde mobile |
| Application mobile | PWA, pas de sauvegarde auto native | Apps iOS/Android avec backup automatique |
| Base de données | MariaDB ou SQLite | PostgreSQL avec extension vectorielle |
| Recherche IA | Labels TensorFlow par contenu et couleur | Recherche sémantique et reconnaissance faciale avancée |
| RAM recommandée | 4 Go (2 Go minimum sans GPU) | 6 à 8 Go |
| Modèle de fichiers | Lit un dossier originals, mode lecture seule possible | Gère sa propre arborescence d'upload |
| Multi-utilisateurs | Limité, orienté collection unique | Bibliothèques isolées par utilisateur |
| Cas d'usage idéal | Archiver et fouiller de gros dossiers photo | Remplacer Google Photos au quotidien |
Montez votre dossier originals en lecture seule (:ro dans le volume Docker) et activez PHOTOPRISM_READONLY=true. PhotoPrism indexera et générera labels et miniatures dans le volume storage séparé, sans jamais risquer de modifier ou supprimer un fichier original. Vous pouvez ainsi pointer en toute sécurité vers une archive précieuse, et même synchroniser ce dossier via rsync depuis un autre serveur.