What it is
Immich is a self-hosted photo and video library with the user experience of Google Photos — mobile auto-backup, ML-based search ("dog", "beach"), face grouping, map view, shared albums. The crucial difference is that the photos live on my hardware.
Why I run it
Google Photos is too convenient to refuse and too invasive to fully embrace. Immich gives me the same workflow — open the camera roll, photos automatically upload to my own server — without paying for storage that I already have, and without the photos being training data.
The Immich app on the phone is good enough that the experience competes with the major cloud services. Auto-backup, "memories" notifications, face recognition, semantic search — all the things that make a photo library actually usable, all running locally.
How I use it
The mobile app does the auto-backup; the web UI is where I browse on a real screen. The library currently holds a few thousand photos and a few hundred videos. ML-based search works well enough that I use it as the default — "show me beach photos from 2024" turns out to be faster than scrolling.
Sharing happens via shared albums with links; no public surface, all access goes through Tailscale when I'm away from home.
Setup notes
- Host: a dedicated LXC on the laptop node, with photo storage on the node's 1 TB NVMe (LVM-mounted into the LXC).
- Reverse proxy: yes. The mobile app uploads bypass the proxy (direct LAN/Tailscale to the LXC IP), so I haven't needed the large-upload nginx tweaks (
client_max_body_size, increased read timeouts) for the proxy. Optional if web uploads of long videos start failing. - Backups: PBS captures the LXC. Photo data is one of the things I genuinely care about, so I plan an offsite tier eventually — currently the on-cluster backup is the only line of defense, which is honest but not ideal.
- Update cadence: manual. Immich's release cadence is fast and breaking changes happen; auto-updating this one is not a good idea.
Runbook
- Healthy looks like: web UI loads, mobile app uploads succeed, ML-based search returns results.
- Mobile app can't connect: check Tailscale if remote; if local, verify the LXC is up via the Proxmox UI.
- Photo uploads work on app but fail on web: web uploads route through the proxy, which has a smaller default body-size limit than direct LXC. Add
client_max_body_size 50000M;and bumped read/send timeouts on the proxy host's Advanced tab. - ML search returns nothing: the ML container is separate from the main Immich container. Check it's running; rebuilding the search index can take a while on first run.
- Where logs live:
docker logs immich_serverand the companion containers; the Immich web UI also has an admin → tasks view.