All Guides

Install Immich: Self-Host Your Own Google Photos Alternative 2026

Complete guide: Install Immich with Docker, set up SSL, configure the mobile app. Including Google Photos migration and backup strategy.

Dirk Hesse
January 22, 2026
9 min read

Immich is an open-source photo manager you host yourself, with auto-upload from your phone, face recognition and a map view. Your photos live on your server, in a location you choose. Immich has no licence fee; you only pay for the server. See matching offers in the VPS comparison.

This guide shows you step by step how to install Immich on your own server.

Prerequisites

What you need:

  • A VPS with enough RAM: according to the Immich docs, at least 6 GB, 8 GB recommended; 4 GB without machine learning. CPU: at least 2 cores, 4 recommended (as of Nov 7, 2026, Immich requirements). Don't have one? Find servers with 8+ GB RAM here →
  • Enough storage for your photos (see calculator below)
  • Ubuntu 22.04 or 24.04
  • Docker & Docker Compose
  • Optional: Domain for HTTPS

Storage Calculator

PhotosEstimated StorageRecommended VPS Storage
5,000~25-50 GB100 GB
20,000~100-200 GB300 GB
50,000~250-500 GB500 GB
100,000+~500 GB - 1 TBDedicated or NAS

The Immich docs recommend local SSD storage for the database, never a network share. Storage per plan is shown in the VPS comparison.

Looking for a server for Immich?

For Immich with machine learning, the Immich docs recommend 8 GB RAM. Find suitable servers here.

Show servers with 8+ GB RAM

Step 1: Install Docker

If Docker isn't installed yet:

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Log out and back in, or: newgrp docker

Check Docker Compose:

docker compose version
# Should show v2.x

Step 2: Install Immich

Immich provides an official installation script:

mkdir -p ~/immich && cd ~/immich
curl -fsSL https://get.immich.app | bash

What the script does:

  • Downloads docker-compose.yml
  • Creates .env with secure passwords
  • Creates upload/ directory for photos

Start Immich:

docker compose up -d

The first start takes a few minutes – several containers are being downloaded (Web, Server, ML, Redis, PostgreSQL).

Important: Note the automatically generated password from the .env file!


Step 3: Initial Setup

Open http://YOUR-SERVER-IP:2283 in your browser:

  1. Click 'Getting Started'
  2. Create the admin account (email + password)
  3. Optional: Create additional users for family
  4. Done! You can now upload photos

Tip: The admin can later invite more users and set storage quotas.


Step 4: Add External Library (Optional)

If you already have photos on the server, modify docker-compose.yml:

services:
  immich-server:
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /path/to/your/photos:/usr/src/app/external:ro  # Read-only

Then:

  1. Restart containers: docker compose up -d
  2. In Immich: Administration → External Libraries → Add Library
  3. Enter path /usr/src/app/external
  4. Start scan – Immich indexes all photos

Step 5: Set Up Mobile App

The Immich app is available in the App Store and Play Store:

  1. Install the app (search: 'Immich')
  2. Enter server URL: http://YOUR-IP:2283
  3. Log in with your account
  4. Enable backup: Settings → Backup → Enable Background Backup

Tip: For backup only over WiFi: Disable 'Use cellular data'

Warning: Without HTTPS, photos are transmitted unencrypted! For use outside your home network: Set up HTTPS (next step).


Step 6: Set Up HTTPS with Caddy

For secure access from anywhere, we'll set up a reverse proxy. Caddy is simpler than Nginx/Traefik:

Add Caddy to docker-compose.yml:

services:
  # ... existing Immich services ...

  caddy:
    image: caddy:latest
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
    depends_on:
      - immich-server

volumes:
  caddy_data:

Create Caddyfile:

photos.yourdomain.com {
    reverse_proxy immich-server:2283
}

Restart:

docker compose up -d

Caddy automatically obtains an SSL certificate from Let's Encrypt. Make sure your domain points to the server IP.


How do I import Google Photos into Immich?

You import Google Photos into Immich in two main steps: export your library via Google Takeout as ZIP archives, then upload them with immich-go, the community tool the Immich documentation recommends for this. immich-go reads the ZIPs directly, takes capture date, GPS data and descriptions from the Takeout JSON files and recreates your albums in Immich.

As of Nov 7, 2026, checked against the Immich CLI documentation, the immich-go README (version v0.32.0) and Google's Takeout help page.

1. Create the Takeout export

  1. Open Google Takeout and select only "Google Photos".
  2. File type ZIP, archive size 50 GB: Google splits larger exports into several archives, and 50 GB gives you the fewest parts.
  3. Create the export and download all parts (takeout-…-001.zip, -002.zip …) completely. According to Google, the archives expire after about 7 days.

2. Create an API key in Immich

immich-go talks to your server through the API. Create the key in the Immich web interface under account settings → "API Keys". The immich-go installation guide lists the permissions it needs and links the ready-made binaries for Linux, macOS and Windows.

3. Upload with immich-go

immich-go runs on the machine where the ZIPs are and uploads to your server over the network. Use the HTTPS address from step 6, otherwise photos and the API key travel unencrypted. Pass all parts in one command; ZIPs don't need to be extracted (TGZ archives do):

immich-go upload from-google-photos --server=https://photos.yourdomain.com --api-key=YOUR-API-KEY /path/to/takeout-*.zip

What happens to albums and metadata?

Defaults according to the immich-go command reference:

  • Albums: --sync-albums is on and recreates your Takeout albums in Immich. Untitled albums are skipped unless you add --include-untitled-albums.
  • Metadata: Capture date, GPS coordinates and descriptions come from the JSON files. Files without a matching JSON file are left out; --include-unmatched adds them with less metadata.
  • Archive, partner, trash: Archived photos and photos from a partner account are imported, photos in the trash are not (--include-trashed).
  • Tags: People names from Takeout and a Takeout timestamp become tags in Immich.
  • Duplicates: Files already on the server are not uploaded again, so you can simply restart an interrupted import.

Note: The official Immich CLI (immich upload) uploads files but, according to its documentation, does not read Takeout JSON files. For Takeout, the Immich documentation recommends immich-go.


Configure Machine Learning

Immich uses ML for face recognition and object search. For large libraries, tuning is worthwhile:

Disable ML

Turn machine learning off under Administration → Settings → Machine Learning Settings. To keep the service from starting at all, comment out the immich-machine-learning section in docker-compose.yml (as of Nov 7, 2026, Immich FAQ).

Change ML Model

Set the Smart Search model under Administration → Settings → Machine Learning Settings → Smart Search → Model Name (Immich search docs).

Note: The first ML run can take a long time for large libraries; check progress under Administration → Job Queues.


Backup Strategy

Your photos are important – definitely set up backups:

Daily: PostgreSQL database

docker exec immich_postgres pg_dumpall > backup.sql

Weekly: Upload directory (photos) with rsync to backup server or storage box

Example cronjob:

# Daily DB backup
0 3 * * * docker exec immich_postgres pg_dumpall > /backup/immich-db-$(date +\%Y\%m\%d).sql

# Weekly photo backup (incremental)
0 4 * * 0 rsync -avz ~/immich/upload/ [email protected]:/immich-backup/

Common Issues

ML Container Won't Start (OOM)

Not enough RAM. Either upgrade VPS or disable ML.

Photos Appear Twice

Enable 'Detect duplicate assets' in Administration → Jobs before the next import.

Mobile App Can't Find Server

Check:

  1. Is firewall port 2283 open?
  2. URL correct (don't forget http://)?
  3. Is server on the same network?

Thumbnails Load Slowly

NVMe storage helps. Or: Reduce thumbnail size in Administration → Settings.

Faces Not Recognized

Start ML job manually: Administration → Jobs → Face Detection → Run


Conclusion

Your photos live on your server, in a location you choose. If you manage other people's photos, you remain responsible for GDPR compliance, usually with a data processing agreement with your host. You can also run Paperless for documents or Vaultwarden as a password manager on the same server.


Frequently Asked Questions

How long does the Google Photos migration take?
The upload depends on your internet speed and the size of your library. The first ML run afterwards can take a long time for large libraries; check progress under Administration → Job Queues.
Can I use Immich without a domain?
Yes, via IP address and port (http://IP:2283). For use outside your home network, we recommend HTTPS with a domain though.
How much storage do the thumbnails need?
According to the Immich docs, thumbnails and transcoded videos add 10–20% to the library on average (as of Nov 7, 2026).
Is Immich stable enough for production use?
Since version 2.0.0 of October 1, 2025, the Immich team calls its releases stable and uses semantic versioning (per the Immich blog, as of Nov 7, 2026). For important data: always set up backups.

Ready for your own photo cloud?

For Immich with machine learning, the Immich docs recommend 8 GB RAM. Find suitable servers here.

Servers with 8+ GB RAM

Matching VPS Calculator

Immich Self-Hosting: Die besten VPS 2026

Finde den perfekten Server für deine private Foto-Cloud

Go to Calculator

Related Articles