Immich is an open-source photo and video library that you host yourself. It works much like Google Photos: the phone app backs up your camera roll, people are grouped by face, and you can search your pictures by what is in them. The difference is where the files live.
Google gives 15 GB for free, shared between Photos, Gmail and Drive. Past that, you pay Google every month, and your library sits on Google's servers. With Immich on a VPS in Montréal, the library is on a machine you administer, in Canada. Our catalogue has an Immich image ready to deploy; this article covers that route, a manual install, the plan to choose, backups and updates.
1. What Immich does
The mobile app uploads new photos and videos in the background and keeps the originals untouched. On the server, Immich builds a timeline, a map from the GPS data, and memories from past years. Its machine learning groups faces into people and indexes the content of each picture, so a search for "red car" or "beach at sunset" works without any tags. Albums can be shared with other users of your server or through a public link.
Immich is free and releases often, but it remains software you run yourself: updates, disk space and backups are your job. The sections below cover each one.
2. Which plan to choose
Immich's own requirements are 6 GB of RAM at minimum and 8 GB recommended, with 2 to 4 CPU cores. Its documentation adds that a 4 GB machine can run Immich with machine learning turned off. That sets the range:
| Plan | Resources | For Immich | Room for photos | Monthly |
|---|---|---|---|---|
| Starter | 2 vCPU · 4 GB · 40 GB | small library, machine learning off | about 25 GB | 16 CAD |
| Pro | 4 vCPU · 8 GB · 80 GB | Immich's recommended spec | about 60 GB | 30 CAD |
| Scale | 8 vCPU · 16 GB · 160 GB | family library, faster indexing | about 130 GB | 56 CAD |
The last column is an estimate: the system and Immich's containers take about 10 GB, and Immich's documentation says thumbnails and converted videos add 10 to 20 % on top of the originals. The Nano (2 GB) is too small, and the console does not offer the Immich image on it.
Hourly billing works well for a first test: deploy, upload a few hundred photos from your phone, check the search and the faces, then destroy the machine or keep it.
3. Install with our Immich image
Order a Starter or larger with the Immich image. This link opens the console with the image already selected:
https://console.ffxf.net/servers/order-vm?image=immich
The image is Ubuntu 24.04 with Docker. On the first boot, it starts Immich (the server,
the machine learning service, PostgreSQL and Valkey) behind Caddy, which handles HTTPS.
Every VM has its own domain name; when that name resolves to the machine, Caddy gets a
Let's Encrypt certificate and Immich answers at https://your-vm-domain.
Without it, Immich answers in plain HTTP on the machine's IPv4. The database password is
generated on that first boot and stored in /opt/immich/.env, readable by
root only.
Open the address and create the admin account right away: the first account created on an Immich server becomes its administrator.
The SSH user is ubuntu. Everything lives in /opt/immich:
compose.yml, .env and Caddyfile. To use your own
domain, point its A and AAAA records at the machine, replace the VM's name with yours in
both lines of the Caddyfile, then restart Caddy:
sudo nano /opt/immich/Caddyfile
sudo docker compose -f /opt/immich/compose.yml restart caddy
4. Manual install, on any VPS
If you prefer to build it yourself, or to run Immich next to other services, start from an Ubuntu or Debian image with Docker Engine and its Compose plugin (see Docker on a VPS). These are the commands from Immich's documentation:
mkdir ./immich-app
cd ./immich-app
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
In .env, replace DB_PASSWORD with a random value made only of
letters and digits (openssl rand -hex 16 gives one), uncomment
TZ and set it to America/Toronto, and leave
IMMICH_VERSION=v3. Then start it:
docker compose up -d
Immich listens on port 2283, in plain HTTP. Put a reverse proxy with HTTPS in front of it (our Nginx and HTTPS guide covers the certificate) and keep the settings Immich recommends for large uploads:
client_max_body_size 50000M;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
send_timeout 600s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Then close port 2283 to the outside, with a cloud firewall for instance.
5. The phone app
The Immich app is on the App Store, Google Play and F-Droid. Enter your server's HTTPS address, log in, open the backup screen and pick the albums to send. On Android, background backup runs on its own. On iPhone, it depends on when iOS lets the app run: opening the app now and then lets it catch up.
After the first large upload, Immich generates thumbnails, detects faces and indexes each photo. Without a GPU, this takes a while for thousands of pictures: the progress is under Administration, Job Queues. Search and people fill in as the jobs finish.
6. Backups
Two things matter: the original files and the database. Immich dumps its database every
day at 2:00 and keeps the last 14 dumps, in a backups folder next to the
photos. The folders to keep are library, upload,
profile and backups; thumbs and
encoded-video can be regenerated.
With our image, all of them are in one Docker volume:
/var/lib/docker/volumes/immich_upload_data/_data. With a manual install,
they are in your UPLOAD_LOCATION.
Immich recommends the 3-2-1 rule: three copies, on two kinds of media, one of them elsewhere. On FFxF, the machine itself is the first copy. The machine backups in the console are the second (7 manual backups are included, automatic backups cost 3 CAD a month). For the third, copy the library out, to a NAS at home for example:
sudo rsync -a --delete --exclude thumbs --exclude encoded-video \
/var/lib/docker/volumes/immich_upload_data/_data/ you@home-nas:/backups/immich/
Immich's documentation also suggests backing up the database before the files, or stopping the server during the copy, so the two match. The daily dump already sits in the copied folder: to restore, put the files back and load the latest dump, as described in Immich's backup guide.
7. Updates
Immich releases often (3.3.0 came out on October 7, 3.3.1 the next day), and major versions have changed the database and the configuration before. Read the release notes before each update, and take a machine backup in the console first.
Our image follows Immich's release tag, so an update takes the latest
version, which can be a new major one:
cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
To stay on version 3 until you decide otherwise, replace :release with
:v3 in compose.yml first. With a manual install,
IMMICH_VERSION=v3 in .env does the same, and the update is the
same pull then up -d.
8. The limits
Disk is the main one. Our largest plan has 160 GB, which fits a family library of about 130 GB of photos and videos. A multi-terabyte archive belongs on a home server or a storage box, not on these plans.
Machine learning runs on the CPU, so the first indexing of a big library is slow. The files are stored as-is on the server's disk, without encryption at rest. And you are the administrator: keep Ubuntu up to date too (our Ubuntu hardening guide lists the basics).
The other images in the catalogue, with their default users, are listed on the Images page.