Immich : installation et découverte

Voilà un petit bout de temps que j’avais noté Immich comme futur container Docker à installer. Il s’agit d’une solution auto-hébergée de gestion de photos et de vidéos. Elle est souvent donnée comme un remplacement à Google Photos.

En ce qui me concerne, ce sera en remplacement de Nextcloud pour synchroniser les photos prises avec le smartphone sur un serveur local. C’est d’ailleurs la fonction principale d’Immich, celle pour laquelle le développeur l’a créé au début.

Car depuis les premières versions, Immich s’est beaucoup développé, d’autres fonctionnalités, comme la géolocalisation, la détection de visages, la création d’albums, le partage, un éditeur basique (recadrer, rotation), et j’en oublie sûrement. Immich propose aussi un outil en ligne de commande pour importer des photos ou des vidéos d’une autre source que le smartphone, comme des photos déjà archivées. On serait donc tenté de l’utiliser comme un album photo en ligne… Ce qui ne va finalement pas me convaincre, j’y reviens en fin d’article.

Voyons voir tout cela, l’installation a été hyper facile et rapide, il m’a fallu un peu plus de temps pour les réglages et la prise en main de l’interface, car on n’est plus dans la simple vue d’une arborescence de fichiers, tout passe par une base de données, ce qui change pas mal de choses.

Nextcloud

La synchro des photos proposée par Nextcloud ne fonctionne pas toujours très bien, et surtout on n’a aucun moyen d’agir dessus. La synchro peut être immédiate, ou arriver dix minutes plus tard, voir pas du tout (certains fichiers peuvent être omis, typiquement après une mise à jour de l’appli, c’est arrivé plusieurs fois).

Ce qui me dérange le plus, c’est dans le scénario suivant : je suis en train d’écrire un article pour le blog, ou de créer une bug sur Github, et j’ai besoin de prendre un screenshot sur mon tel. Je m’attend à ce que la synchro soit rapide, et que je puisse récupérer rapidement le fichier sur le PC, or ce n’est pas le cas, et j’ai plus vite fait de me l’envoyer par mail du smartphone, ce qui est quand même navrant.

Évidemment, la perte de fonctionnalité ou l’apparition de bugs après une mise à jour est également un sérieux problème. Dans l’ensemble, le manque de fiabilité est vraiment problématique (je ne suis pas le seul à m’en plaindre), et il était temps de passer à une autre solution.

Installation d’Immich

J’ai donc installé Immich en mode Docker, et l’installation a été d’une extrême simplicité, j’en étais même surpris !

Il y a deux fichiers à récupérer comme expliqué sur la page d’aide : un fichier docker-compose.yml dont je copie tel quel le contenu dans Dockge, et un fichier .env qu’il faudra personnaliser (toujours dans Dockge).

J’ai d’abord créé sur le NAS un dossier immich dans AppData, puis créé deux sous-dossiers library et postgres. Puis dans le fichier .env, j’ai renseigné les deux variables correspondantes :

UPLOAD_LOCATION=/srv/dev-disk-by-uuid-wwwwwwww-xxxxxx-yyyy-zzzzzzzz/AppData/immich/library
DB_DATA_LOCATION=/srv/dev-disk-by-uuid-wwwwwwww-xxxxxx-yyyy-zzzzzzzz/AppData/immich/postgres

Voilà pour l’essentiel. Reste la Timezone à définir, ainsi que le mot de passe pour la base de données :

TZ=Europe/Paris
DB_PASSWORD=mot_de_passe

Et voilà, rien d’autre à faire, le fichier compose.yaml de Dockge reste inchangé. Je démarre le container, et hop ! tout fonctionne immédiatement, c’est vraiment cool. 😎

Je passe les différents écrans pour déclarer l’utilisateur, et voilà, c’est fini côté serveur pour Immich.

Comme indiqué dans la page d’aide, je teste l’ajout d’une première photo avec le bouton « Envoyer » en haut à droite :

Et ma première photo apparaît dans Immich, tout paraît tellement facile, c’est impressionnant.

Accès à partir d’internet

Pour le rendre accessible de l’extérieur de mon LAN (et donc du smartphone), il reste comme d’habitude (je ne détaille pas, c’est toujours la même chose) à configurer le nom de sous-domaine côté hébergeur (CNAME), le fichier immich.subdomain.conf du proxy swag (voir plus bas), et enfin l’ajout de immich comme SUBDOMAINS dans le fichier docker de swag afin qu’il aille chercher un certificat Let’s Encrypt, puis de redémarrer le proxy. À partir de là, j’accède à mon serveur immich via HTTPS, c’est parfait.

Smartphone

Je passe alors sur le smartphone, désactive le Téléchargement automatique du client Nextcloud, puis installe Immich à partir de F-Droid.

Je configure les dossiers à synchroniser (les photos et mes captures d’écran), et c’est parti, la synchronisation se met en route, et au bout de quelques minutes, tout est synchronisé.

Je n’aurai finalement qu’un seul problème lors de cette installation d’Immich, ce sera lors de synchronisation des vidéos sur le smartphone, qui sont dans le même dossier que les photos. Tout a l’air de bien se passer, je vois la progression du transfert, mais elles échouent toutes avec un message du type ‘Connection reset by host » (je ne l’ai pas noté).

C’était le fichier du proxy qui provoquait cette erreur, et c’était de ma faute.

Fichier proxy

J’ai dans un premier temps utilisé un fichier proxy (immich.subdomain.conf) assez basique, ne contenant que le minimum, et que j’adapte à chaque nouveau serveur. J’ai bien vu qu’il existait deux fichiers d’exemples de fournis pour immich par swag/nginx, mais j’ai d’abord fait au plus simple, et comme le serveur fonctionnait…

Quand j’ai eu le problème d’upload des vidéos, le « reset by host » m’a tout de suite orienté vers le proxy. Le fichier que j’utilisais avec cette ligne :

client_max_body_size 20m;

Ce paramètre limite la taille des fichiers envoyés au serveur à 20 Mo. Dans les fichiers d’exemple fourni pour immich, ce paramètre est mis à zéro, ce qui désactive le test de la taille du fichier. J’ai donc fait pareil et le problème a été résolu, les vidéos ont pu être transférées sans problème :

client_max_body_size 0;

J’avais aussi un petit souci sur l’interface web d’Immich, où la version du serveur et son statut n’était pas affiché :

Après quelques recherches, je vois que cela vient probablement du proxy car Immich utilise les webSockets. J’ai donc fini par utiliser le fichier d’exemple fourni par Swag à savoir immich.subdomain.conf.sample, afin de partir d’une base plus solide. Et là aussi le problème est résolu :

Pour info, voilà le contenu de mon fichier immich.subdomain.conf :

Info
J’ai modifié la valeur de server_name pour correspondre à mon sous-domaine.
Par défaut, $upstream_app a la valeur immich. Pour ne pas avoir à modifier ma config (container name, cname), je l’ai remplacé par mon adresse IP locale 192.168.x.y (2 occurrences).
Tout le reste a été laissé par défaut.
$ cat immich.subdomain.conf
## Version 2025/07/18
# make sure that your immich container is named immich
# make sure that your dns has a cname set for immich
# immich v1.118+ only. For earlier versions, change $upstream_port to 3001

server {
    listen 443 ssl;
#    listen 443 quic;
    listen [::]:443 ssl;
#    listen [::]:443 quic;

    server_name immich.subdomain.domain.fr;

    include /config/nginx/ssl.conf;

    client_max_body_size 0;

    # enable for ldap auth (requires ldap-location.conf in the location block)
    #include /config/nginx/ldap-server.conf;

    # enable for Authelia (requires authelia-location.conf in the location block)
    #include /config/nginx/authelia-server.conf;

    # enable for Authentik (requires authentik-location.conf in the location block)
    #include /config/nginx/authentik-server.conf;

    # enable for Tinyauth (requires tinyauth-location.conf in the location block)
    #include /config/nginx/tinyauth-server.conf;

    location / {
        # enable the next two lines for http auth
        #auth_basic "Restricted";
        #auth_basic_user_file /config/nginx/.htpasswd;

        # enable for ldap auth (requires ldap-server.conf in the server block)
        #include /config/nginx/ldap-location.conf;

        # enable for Authelia (requires authelia-server.conf in the server block)
        #include /config/nginx/authelia-location.conf;

        # enable for Authentik (requires authentik-server.conf in the server block)
        #include /config/nginx/authentik-location.conf;

        # enable for Tinyauth (requires tinyauth-server.conf in the server block)
        #include /config/nginx/tinyauth-location.conf;

        include /config/nginx/proxy.conf;
        include /config/nginx/resolver.conf;
        set $upstream_app 192.168.x.y;
        set $upstream_port 2283;
        set $upstream_proto http;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;

    }

    location ~ (/immich)?/api {
        include /config/nginx/proxy.conf;
        include /config/nginx/resolver.conf;
        set $upstream_app 192.168.x.y;
        set $upstream_port 2283;
        set $upstream_proto http;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;

    }
}

Adresse mail

Dans les paramètres d’administration, il peut être utile de créer une adresse mail, que ce soit pour les notifications du serveur que pour envoyer un mail d’invitation (Immich est multi-utilisateurs, vous pouvez faire profiter vos amis de votre serveur auto-hébergé).

On saisit les informations habituelles d’un compte mail (serveur SMTP), en faisant bien attention à utiliser une adresse valide dans le champ « Depuis l’adresse », sinon le serveur SMTP refusera probablement d’envoyer le mail avec un message du genre « Sender mismatch ». Pour ce faire, j’ai choisi de créer un alias à mon compte mail, ce qui me permettra d’identifier facilement les mails en provenance du serveur :

Découverte & Utilisation

Une fois les photos du smartphone ajoutées, il ne reste plus qu’à explorer l’interface. Le mieux est de regarder cette vidéo, en français, qui en fait le tour, et qui se termine même par une installation docker d’Immich.

Franchement, ça a l’air pas mal :

  • une vue globale en mode « time line »
  • une vue « Explorer » où l’on peut chercher par lieu ou par personne (il y a un container machine-learning qui offre ces options, avec aussi une détection de doublons).
  • une vue carte pour chercher en fonction des données GPS des photos.
  • la possibilité d’éditer une photo avec les fonctions de base (rotation, redimensionner, etc…).

Il est possible d’ajouter dans la colonne de gauche une vue par dossier (Paramètres du compte – Fonctionnalités- Dossiers) qui apparaîtra en fonction du modèle de stockage défini (Administration – Modèle de stockage). Pour ma part, j’ai choisi le même que j’utilisais dans Nextcloud, à savoir Année & Mois :

Ce qui donne :

C’est la seule façon que j’ai trouvé pour afficher les photos en mode « mosaïque » et pas en mode « timeline » :

On peut aussi définir des favoris, créer des albums, partager des photos ou des albums avec des personnes. Enfin, on peut aussi archiver certaines photos, qui n’apparaîtront plus mais seront tout de même conservées.

Immich CLI

Il me reste une chose à faire : importer d’anciennes photos qui ne sont plus sur le smartphone, mais que je souhaite ajouter à Immich. Pour ce faire, Immich propose un outil en ligne de commande.

NPM et Node.js

La doc est là : The Immich CLI. Pour utiliser le CLI d’Imich, il faut installer npm et node.Js. NPM est un package manager dédié pour Node.js,

Selon cette page : https://linuxconfig.org/install-npm-on-linux, et puisque je suis sous Arch (EndeavourOS), il suffit de taper cette commande :

$ sudo pacman -S npm # also installs nodejs

Puis on installe le client Immich :

$ sudo npm i -g @immich/cli

Le CLI

Il suffit ensuite de se logguer avec l’API Key que l’on peut générer dans « Paramètres du Compte – Clés d’API » (NOTE : il faudra accorder toutes les autorisations pour cette clef d’accès) :

immich login http://192.168.x.y:2283/api IMMICH_API_KEY

Et voilà, on peut utiliser les commandes pour ajouter des images dans un nouvel album, par exemple (le nom du dossier contenant les photos sera le nom de l’album) :

immich upload --album --recursive nom_du_dossier/

On peut aussi ajouter l’option --recursive s’il y a des sous-dossiers : dans ce cas, chaque sous-dossier deviendra le nom d’un nouvel album. On peut aussi ajouter des images à un album existant (--album-name "Voyage 2023"). Mais on ne peut pas créer de sous-albums.

Attention, si Immich détecte que l’image existe déjà, il ne l’ajoutera pas :

Crawling for assets...
Hashing files           | ████████████████████████████████████████ | 100% | ETA: 0s | 1/1 assets
Checking for duplicates | ████████████████████████████████████████ | 100% | ETA: 0s | 1/1 assets
Found 0 new files and 1 duplicate
All assets were already uploaded, nothing to do.

En fait, pour chaque image, un hash est créé et stocké dans la base de données. Mettre comme j’avais fait l’image dans la corbeille ne l’efface pas, l’image en question n’est simplement plus affichée dans Immich. Il faudra donc vider la corbeille pour pouvoir l’uploader à nouveau…

Toutes les infos et les exemples d’utilisation sont sur cette page.

Les commandes sont finalement assez limitées, j’espérais pouvoir par exemple forcer un upload pour remplacer une photo existante, ou pouvoir effacer un album ET ses photos. Ce n’est apparemment pas possible.

Sauvegarde

Il y a aussi l’aspect sauvegarde à prendre en compte, qui est expliqué ici. Une stratégie 3-2-1 est recommandée, soit une copie locale, une autre dans le cloud, et une troisième dans un lieu physique éloigné de quelques kms minimum… Mais bon, à chacun de voir l’importance qu’il accorde à ses photos et au risque que sa maison brûle alors que le cloud vient de perdre les données. 😡

On peut retrouver l’arborescence de ses photos dans AppData/immich/library/user (selon le choix de modèle de stockage choisi (voir plus haut). La base de données est sauvegardée automatiquement chaque jour dans AppData/immich/library/backups.

Immich stocke deux types de contenu dans le système de fichiers : (a) les ressources originales non modifiées (photos et vidéos), et (b) le contenu généré. Le plus simple est donc de sauvegarder tout le contenu de AppData/immich/library/ pour être tranquille.

Un script pour les recopier sur un autre disque en local, typiquement sur une autre machine est une première étape. Les recopier aussi dans un cloud me paraît déjà pas mal comme niveau de sauvegarde.

Homepage Dashboard

Pour finir, j’ai bien sûr créé une entrée Immich dans mon Homepage Dashboard, en suivant la documentation pour le widget, mais j’ai d’abord eu un message d’erreur API :

C’était bizarre, puisque j’avais bien les infos sur le nombre de photos etc… mais pas celles sur le CPU, la MEM et le réseau. Logiquement, j’avais indiqué un mauvais nom pour le container (immich) : la stack créée dans Dockge s’appelle bien immich, mais le container pour le server s’appelle immich_server (en fait immich crée 4 containers, dont un pour le machine-learning).

Et donc en indiquant le bon nom de container, tout a fonctionné comme attendu :

Conclusion et ressenti

L’ensemble est vraiment pas mal, auto-héberger toutes les photos du smartphone de façon très simple, avec plein d’options très sympathiques (géolocalisation et détection de visage) est vraiment sympa. Et surtout, cela a l’air d’être beaucoup plus fiable que Nextcloud, ma solution précédente.

Je constate déjà qu’une photo ou un screenshot est immédiatement téléchargé sur le serveur, et visualiser la photo dans Immich (via Firefox) est plus rapide et semble plus pratique que de parcourir l’arborescence fichier de Nextcloud pour retrouver la photo.

J’aime bien avoir la possibilité de rechercher par localisation, et aussi par personne. C’est le genre de truc plutôt sympa ! 😎

Avec les autres fonctionnalités, j’avais envisagé la création d’albums pour certaines photos comme celles de mes voyages, afin de les avoir facilement sur le tel grâce à l’application android. Mais les limitations en terme d’affichage, le mode « timeline », ne me conviennent pas vraiment. J’aurais préféré avoir une vue mosaïque en option. J’aurais aussi aimé pouvoir créer des sous-albums pour mieux organiser les photos, mais c’est impossible. Enfin, les possibilités en mode commande (CLI) sont assez limitées.

On s’aperçoit alors des limitations d’Immich. Comme je le disais en début d’article, il a été créé au départ pour copier automatiquement les photos du smartphone sur une serveur sans avoir à remettre ses photos entre les mains de Google. Je pense que dans un premier temps, je vais me contenter de l’utiliser de cette manière, on verra si par la suite Immich évolue dans la direction que je souhaite.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *