Immich 3.0 on Proxmox LXC: Self-Host Your Entire Photo Library in 2026
Self-Hosting

Immich 3.0 on Proxmox LXC: Self-Host Your Entire Photo Library in 2026

Ricardo Gil
July 6, 2026
8 min read
#Immich #Proxmox #Self-Hosting #Home Lab #Photo Management #LXC #2026

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:

  • Crucial P3 Plus 2TB NVMe (PCIe 4.0) β€” solid price-to-performance for the Immich database and working volume
  • WD Red Plus 8TB NAS Hard Drive β€” for the photo library volume if you're going spinning storage
  • Seagate IronWolf 12TB NAS Drive β€” step up if your library is large or growing fast
  • Kingston 32GB DDR4 ECC SODIMM β€” for nodes where you want headroom for multiple VMs and this LXC
  • Beelink EQ12 Mini PC (N100, 16GB RAM) β€” if you want a dedicated, low-power Proxmox node just for Immich
  • 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
    bash -c "$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/ct/immich.sh)"

    The script will walk you through:

  • Container ID and hostname
  • RAM and vCPU allocation
  • Disk size for the container root (recommend 32GB minimum)
  • Bridge and IP settings
  • 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:

    bash
    # 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:

    bash
    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:

    bash
    zfs create tank/photos

    Then add a bind mount to the LXC config (/etc/pve/lxc/.conf):

    code
    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:

    code
    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:

    bash
    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://:2283 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.

    nginx
    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:

    code
    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:

    bash
    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:

  • WD 8TB Elements Desktop External Drive β€” affordable external for ZFS send snapshots
  • Samsung T7 Shield 4TB Portable SSD β€” fast portable for on-the-go backup rotation
  • Sabrent Rocket 4 Plus 4TB NVMe β€” if you want a secondary NVMe pool in the same server
  • Plugable 7-Port USB 3.0 Hub β€” if you're running multiple USB backup drives
  • 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.

    πŸ“¬Weekly Newsletter

    Get the best home lab & AI content

    No spam. One email per week. Unsubscribe anytime.

    Share this article