This is an old revision of the document!
Immich
Immich is a modern photo management web application which aims to be similar to Google Photo. It can be uses to backup phone photos and also manage older collection of older photos.
Immich is a fairly new player in the game but it's growing a lot and is gaining a lot of traction. It's heavily under development and very polished. Overall it's probably the best solution but:
- Doesn't support folders as albums (sorry, long term solution must be stored in folders and not only in a database)
- Uses a database for metadata, which is not good again for long term solution.
- It's been a bit unclear since it was acquired by Futo's. Futo's stance on Open Source is unclear to me.
- After moving to Futo they added some controversial support system (on which they also backtracked), and it seemed not very well tought of.
- Devs don't seems to care too much on user needs and keep plowing ahead on their roadmap.
Immich, at this time, does not support base_url out of the box. A lot of discussion is going on around the topic and somebody found a nice fix using a specific NGINX setup, which i will describe in this page.
Overall, i stopped using it.
Installation
Use photos user and group, see Photos Management Server.
Immich needs to be installed using a docker compose file. This is the official and only supported installation method. I will show you, of course, how to run it rootless with podman. Immich installation is detailed here, and i suggest you take a look at.
I assume you have already created the photo user and group, but in case you didn't, here you go: So, let's get going. Create an immich user:
useradd -d /data/daemons/photos photos
And download the standard Immich docker-compose and env files:
su - photos wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml #optional: wget https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml #optional: wget https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
(enabling hardware acceleration is optional and i will not cover it here, as it's not needed in my use-case)
I will not give you a full docker-compose file, because Immich sometimes ships with backward incompatibilities, you must start from the one linked above and do the following modifications:
- Specify a network to all containers
- Add any specific volumes for specific external galleries
- Remove the restart and healthcheck sections
This is the specific code for the network:
# Add these two lines to each one of the services (immich-server, immich-microservices, immich-machine-learning, redis, database, ...) networks: - immich-net # This goes at the end of the file: networks: immich-net: {}
Please note that you can have more than one mount, ideally one for each folder tree that contains photos you want to add as external library to Immich.
edit the /data/daemons/immich/.env file to adapt at least your Uploads and external folder:
UPLOAD_LOCATION=/data/Media/Photos/Uploads EXTERNAL_PATH=/path/to/your/external/photos/trees IMMICH_VERSION=release
Configuration
External Library setup
Storage Template setup
NGINX reverse proxy
Immich on sub-path
If you do not want to use a specific sub-domain for Immich, the specific NGINX example here will include the base_url fix as described here:
location /immich { proxy_pass http://127.0.0.1:2283; rewrite /immich/(.*) /$1 break; proxy_buffering on; sub_filter_once off; sub_filter_types text/html; sub_filter ' href="/' ' href="/immich/'; sub_filter ' src="/' ' src="/immich/'; sub_filter ' action="/' ' action="/immich/'; sub_filter 'import("/_app' 'import("/immich/_app'; sub_filter 'base: ""' 'base: "/immich"'; location /immich/_app/immutable/chunks { proxy_pass http://127.0.0.1:2283; rewrite /immich/(.*) /$1 break; sub_filter_types *; sub_filter '"/api/socket.io"' '"/immich/api/socket.io"'; } location ~ /immich/_app/immutable/chunks/index\\. { proxy_pass http://127.0.0.1:2283; rewrite /immich/(.*) /$1 break; sub_filter_types *; sub_filter '"/' '"/immich/'; } location ~ /immich/_app/immutable/chunks/api\\. { proxy_pass http://127.0.0.1:2283; rewrite /immich/(.*) /$1 break; sub_filter_types *; sub_filter '="/api"' '="/immich/api"'; sub_filter 'basePath:"/api"' 'basePath:"/immich/api"'; } location ~ /immich/api { proxy_pass http://127.0.0.1:2283; rewrite /immich/(.*) /$1 break; proxy_cache off; sub_filter_types *; sub_filter '"redirectUri":"/' '"redirectUri":"/immich/'; } proxy_pass_request_headers on; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; 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; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_redirect off; }
you need also to disable authentication, since Immich cannot work with Proxy Auth and you would end up with double-authentication.
(note: YMMV, at this time this seems broken by an Immich upgrade)
Immich on sub-domain
In case you do not care for sub_path and you want to use a dedicated subdomain, go ahead and use this much simpler NGINX configuration. I will assume your subdomain is called immich.mydomain.com:
- immich.conf
server { server_name immich.mydomain.com; listen 8443 ssl; # managed by Certbot listen 443 ssl; # managed by Certbot client_max_body_size 50000M; large_client_header_buffers 4 32k; access_log /var/log/nginx/immich.mydomain.com_access_log main; error_log /var/log/nginx/immich.mydomain.com_error_log info; location / { proxy_pass http://127.0.0.1:2283/; } include com.mydomain/certbot.conf; }
you need also to disable authentication, since Immich cannot work with Proxy Auth and you would end up with double-authentication.
First usage
Fire up your browser at https://yourdomain.com/immich (or https://immich.yourdomain.com) and follow instructions.
To add external libraries, it's currently (Immich 1.92.1) a bit convoluted.
First you need, as administrator, to go to each user settings (under administration panel) and add the external path as specified in the docker compose (ex: /usr/src/app/external) then, as specific user, you also need to add an external library and repeat the same path in your user settings.
It's confusing, i think this will be improved in future releases.
Command line CLI
Immich has a CLI which requires NPM:
emerge nodejs
as user immich:
npm i -g @immich/cli
The CLI might require login for upload operations:
immich login-key https://10.0.0.1/immich/api [apiKey] immich upload --recursive directory/