Google Photos keeps nudging you toward paid storage, and iCloud does the same. If you're already running Proxmox in your home lab, Immich on Proxmox LXC is the cleanest exit. Immich 3.0 dropped in 2026 with a completely overhauled machine learning stack, better mobile backup reliability on Android, and non-destructive editing β and it now genuinely rivals Google Photos for day-to-day use.
This guide walks you through standing up Immich 3.0 inside a Proxmox LXC container with ZFS dataset passthrough for your photo library. No fluff, no hand-waving. Production-grade from the start.
Why Immich Crossed the Threshold in 2026
Immich has over 90,000 GitHub stars as of mid-2026 β one of the fastest-growing self-hosted projects ever. The 3.0 release wasn't just a version bump. It overhauled the CLIP-based semantic search pipeline (so face detection and "photos of my dog at the beach" queries actually work well), introduced breaking changes to API endpoints that cleaned up years of technical debt, and shipped proper mobile non-destructive editing with reversible crop/rotate.
The Android background backup is finally reliable. Previous versions were notoriously fragile on aggressive battery optimization profiles. Immich 3.0 uses a periodic task scheduler that survives Doze mode β a real improvement if you've been burned before.
Bottom line: if you tried Immich 12β18 months ago and moved on, it's worth another look.
Hardware Requirements for Immich 3.0 on Proxmox
Immich is more resource-hungry than a typical self-hosted app. The CLIP ML model and face recognition pipeline eat RAM during initial library scans.
Minimum: 6 GB RAM, 2 vCPUs Recommended: 8β16 GB RAM, 4 vCPUs CPU requirement (important): Since v3.0, the ML container on amd64 requires x86-64-v2 microarchitecture. Most CPUs from 2012 onward are fine. Older Xeons (pre-Sandy Bridge) are not.
For storage, Immich needs a fast NVMe for the database and ML model cache, and can mount your photo library from a ZFS dataset, NFS share, or local directory. Keep the database on SSD β don't put it on spinning rust.
If you're building or upgrading your Proxmox node for this:
Setting Up the Proxmox LXC Container
The fastest path is the community-maintained Proxmox VE Helper Scripts project. It handles container creation, privilege settings, Docker installation, and Immich deployment in one shot.
SSH into your Proxmox host and run:
bash -c "$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/ct/immich.sh)"
The script will walk you through:
When it's done, you have a Debian LXC with Docker and Immich pre-installed.
If you prefer manual control, create an unprivileged LXC from a Debian 12 template, then:
# Inside the LXC
apt update && apt install -y curl docker.io docker-compose-plugin
mkdir -p /opt/immich && cd /opt/immich
curl -o docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
curl -o .env https://github.com/immich-app/immich/releases/latest/download/example.env
Edit .env to set UPLOAD_LOCATION to your desired photo path, then:
docker compose up -d
Passing Through a ZFS Dataset for the Photo Library
This is the part most guides gloss over. You want your photo library on a ZFS dataset (or NFS share), not inside the container's root disk. Here's the clean way to do it.
On the Proxmox host, create a dataset:
zfs create tank/photos
Then add a bind mount to the LXC config (/etc/pve/lxc/):
mp0: /tank/photos,mp=/mnt/photos
For unprivileged containers, you'll need to map the UID/GID. Immich's Docker containers run as UID 1000. Add to the LXC config:
lxc.idmap: u 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: u 1001 101001 64535
lxc.idmap: g 0 100000 1000
lxc.idmap: g 1000 1000 1
lxc.idmap: g 1001 101001 64535
And on the host, chown the dataset to the mapped UID:
chown -R 1000:1000 /tank/photos
Restart the container and update UPLOAD_LOCATION=/mnt/photos in your .env, then docker compose up -d again.
Configuring Immich 3.0 After First Boot
Hit http:// in your browser. You'll be prompted to create an admin account.
First things to configure:
Storage template: In Admin β Storage Template, set a folder structure like {{y}}/{{MM}}/{{dd}}. This organizes uploads by date on disk, making it easier to reason about your ZFS dataset.
Machine learning: The CLIP model and facial recognition models download on first use. With the default setup, this can take 5β10 minutes and spike RAM. Give the container at least 8GB for this initial scan to avoid OOM kills.
External library: If you have an existing photo archive, add it as an External Library under Administration β External Libraries. Immich will scan and index it without moving files. This is the cleanest way to onboard a large existing archive.
Reverse proxy: Put Immich behind Nginx or Caddy with SSL before exposing it externally. Immich's upload path supports large files, so set client_max_body_size 50000M in your Nginx config.
client_max_body_size 50000M;
proxy_read_timeout 600s;
proxy_pass http://<LXC-IP>:2283;
Mobile Backup Setup
Install the Immich mobile app (Android / iOS), point it at your server URL, and log in.
On Android: go to Settings β Background Backup and enable the periodic task scheduler. Disable battery optimization for the Immich app in Android's battery settings β without this, background uploads stall on aggressive profiles.
On iOS: background upload works when the app is in the foreground or recently backgrounded. For reliable automatic backup, iOS users should schedule the app to open at a consistent time (Shortcuts automation works here).
Hardware Accelerated Transcoding (Optional)
If your Proxmox host has an Intel iGPU (12th gen or newer), you can pass it through to the LXC for hardware-accelerated thumbnail generation and video transcoding. This meaningfully reduces CPU load during library indexing.
In the LXC config:
lxc.cgroup2.devices.allow: c 226:* rwm
lxc.cgroup2.devices.allow: c 29:0 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
Then in Immich's Admin UI, go to Administration β Video Transcoding and set the hardware acceleration to vaapi. The thumbnail generation pipeline picks it up automatically.
For dedicated GPU passthrough (discrete card), you'll need a privileged LXC or a full VM β the LXC bind mount approach above only works for iGPU/render nodes.
Backup Strategy for Your Immich Instance
Immich itself recommends backing up:
1. The PostgreSQL database (docker exec immich_postgres pg_dumpall -U postgres > backup.sql)
2. The UPLOAD_LOCATION directory
3. The model-cache volume (optional β it re-downloads if lost)
For the photo library volume, ZFS snapshots are the right tool:
zfs snapshot tank/photos@$(date +%Y%m%d)
Pair that with sanoid for automated snapshot retention, and optionally replicate to a second pool or offsite with zfs send | zfs recv.
For hardware to handle offsite or secondary backups:
Gotchas and Caveats
Docker in unprivileged LXC: Officially unsupported by Proxmox, but it works in practice with the right kernel flags. If you see cgroupv2 errors, add features: keyctl=1,nesting=1 to your LXC config.
x86-64-v2 requirement: If Immich's ML container exits immediately with an Illegal instruction error, your CPU doesn't meet the v2 requirement. Check with grep flags /proc/cpuinfo | grep -q sse4_2 && echo OK.
Initial scan RAM spike: First-run library indexing (especially facial recognition) can push RAM usage to 2β3x normal. Don't size the container too tight. OOM kills mid-scan corrupt the ML model cache and require a full re-download.
External libraries are read-only: Immich doesn't move or modify files in external libraries β it only reads and indexes them. This is the right behavior, but be aware that deleting a photo in the Immich UI doesn't delete it from disk when using external libraries.
Verdict
Immich 3.0 on Proxmox LXC is the most complete self-hosted photo management stack available in 2026. The setup has some rough edges β the UID mapping dance for unprivileged containers, the initial ML scan RAM spike, the x86-64-v2 CPU requirement β but once it's running, day-to-day use is solid.
If you're already on Proxmox, the overhead of adding this container is minimal and the payoff is full ownership of your photo library with zero subscription cost. The ZFS passthrough approach means your photo archive lives on a proper filesystem with snapshot-based backups, which is meaningfully better than Google Photos' "trust us" storage model.
For most home lab operators, this is now the obvious choice over PhotoPrism or Nextcloud Photos. Immich has the momentum, the active development, and the UX polish to back it up.
---
Disclosure: This post contains affiliate links. If you purchase through these links, I may earn a small commission at no extra cost to you.