privacyhomelab

Self-Host Immich: The Photo Backup That Kills Google Photos

Google Photos is convenient right up until you notice you’re renting access to your own memories — and the free tier is long gone. Immich is the self-hosted replacement that finally feels as good as the thing it’s replacing: automatic phone backup, a slick timeline, face and object search, all running on your own box. Here’s the setup I run.

Why Immich specifically

Self-hosted photo apps used to mean an ugly gallery and no phone sync. Immich copies the parts of Google Photos you actually use:

  • Background auto-backup from the phone app — the whole point.
  • AI search — type “beach” or a person’s name and it finds them, locally.
  • Timeline, albums, sharing — the app feels like the real thing.

The trade you’re making: it’s your disk and your backup discipline now. That’s the whole deal — no monthly fee, no scanning, no lock-in.

Step 1 — deploy Immich

Don’t hand-write the compose file — Immich ships a ready stack and updates it every release. Grab the release files:

mkdir immich && cd immich
wget 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

Open .env and set two things that matter: UPLOAD_LOCATION (where your photos physically live — point it at your big disk, not the OS drive) and DB_PASSWORD. Then bring it up:

docker compose up -d

Browse to http://<your-host>:2283, create the admin account, and you’re in.

Step 2 — turn on phone backup

Install the Immich app (iOS/Android), point it at http://<your-host>:2283, log in, and enable backup for your camera roll. First sync of a years-deep library takes a while; after that it drips new photos up in the background exactly like Google Photos did.

Step 3 — give it real storage

This is where a homelab stops being a toy. A single phone’s photo library is easily hundreds of gigabytes, and Immich keeps full-resolution originals plus generated thumbnails. Two things follow:

  • Disk. Put UPLOAD_LOCATION on a proper drive — a 2TB NVMe is the sane floor, and it keeps the timeline scroll instant. The OS SD card or a tiny boot SSD will fill in a week.
  • RAM. The machine-learning container (face/object search) wants a few GB free. On my Ryzen mini PC with 64GB it runs face recognition happily alongside everything else.

Step 4 — the off-site copy (do NOT skip this)

Here’s the honest part nobody likes: a self-hosted primary is not a backup. If that one disk dies, your photos die with it — same as trusting a single cloud. The rule is 3-2-1: your data in at least two places, one of them off-site.

The lazy, cheap answer is Backblaze B2 — S3-compatible object storage at a few dollars a terabyte. Sync your UPLOAD_LOCATION up nightly with rclone:

# one-time: rclone config  → create a B2 remote called "b2"
rclone sync /path/to/UPLOAD_LOCATION b2:your-immich-bucket \
  --fast-list --transfers 8

Drop that in a nightly cron job and you’ve got an encrypted-at-rest, off-site copy of every photo for pocket change — and you still own all of it.

Keep Immich on your LAN. There is no reason to port-forward your entire photo library to the public internet. If you want it on your phone away from home, reach it over a VPN like Tailscale — never a hole in your router.

Is it good enough to actually switch?

For me, yes — I moved off Google Photos and haven’t looked back. The app is good, search works, and the peace of mind of owning the whole thing is worth the one evening of setup. Just take the off-site backup seriously and you’re strictly better off than you were renting it.

The full build — including running Immich next to n8n and my local LLM on the same box — is in the video.

← All guides