Why self-host Immich on a VPS
Your photos are among the most sensitive data you entrust to a cloud: faces, places, habits, geolocation. Immich reproduces the Google Photos experience, mobile apps included, but on infrastructure you own. Its stack is more demanding than a wiki's: an application server, a PostgreSQL with the pgvecto.rs vector extension for semantic search, Redis, and a machine learning service that computes the embeddings for facial recognition and keyword search. A dedicated VPS lets you isolate this resource-hungry ML service, size the storage to fit your photo library, and prevent your pictures from being used to train third-party models. You remain in control of encryption, backups and access.
What self-hosting Immich brings
- Automatic backup from iOS and Android as soon as a photo is taken, like a private cloud.
- Facial recognition and semantic search run on your server, with no data sent to a third party.
- Unlimited storage defined by your VPS disk, with no imposed quota or per-GB billing.
- Album sharing via a secure link that you control and can revoke at any time.
- Multi-user support: each member of the household or team has their own isolated library.
- EXIF metadata, maps and timelines kept locally, with no advertising exploitation.
Hardware and software requirements
Immich is the most demanding in this series because of its machine learning service. Plan for at least 4 GB of RAM, but 6 to 8 GB are recommended if facial recognition processes a large photo library. 2 to 4 vCPUs let you handle the initial indexing without freezing the interface. Storage is the key factor: plan generously, as a family library quickly exceeds 100 GB; a VPS with expandable disk is ideal. On the software side: Docker and docker compose v2, a domain (photos.yourcompany.com), and enough swap space to absorb the ML model's spikes during the first import.
Deploy Immich step by step
Prepare the VPS and storage
Update the system, install Docker, then create a dedicated mount point for media, for example /mnt/photos, separate from the system disk. Enable at least 2 GB of swap for the machine learning service.
Retrieve the official compose file and the .env
Download the docker-compose.yml and the example.env file from the Immich repository with wget. Rename it to .env, then set UPLOAD_LOCATION=/mnt/photos, the database password and DB_DATA_LOCATION to a persistent volume.
Understand the four services
The stack starts immich-server, immich-machine-learning, redis and database (PostgreSQL with the vector extension). Do not replace the database image with a standard PostgreSQL: the pgvecto.rs extension is essential for semantic search.
Launch the stack and create the administrator
Run docker compose up -d and wait for the large ML images to download. Open port 2283 internally, then create the administrator account via the web wizard before inviting other users.
Secure with a reverse proxy and SSL
Place Caddy in front of the server: photos.yourcompany.com { reverse_proxy immich-server:2283 }. Increase the proxy's maximum upload size (client_max_body_size on Nginx) because videos can be large, otherwise mobile uploads fail.
Configure the mobile app
Install Immich from the App Store or the Play Store, enter https://photos.yourcompany.com as the server URL, sign in, then enable automatic camera roll backup to continuously replicate your new photos.
During the first bulk import, run the generation of thumbnails and ML embeddings during off-peak hours and monitor the RAM with docker stats. If the machine learning service becomes saturated, you can temporarily point it to the lightest model in the settings, then switch back to a more accurate model once the initial indexing is finished. This prevents the VPS from collapsing under the load of the very first scan.