Home Software How to Install Immich on Proxmox: LXC Setup with ZFS Storage

How to Install Immich on Proxmox: LXC Setup with ZFS Storage

How to Install Immich on Proxmox: LXC Setup with ZFS Storage

Why Run Immich in an LXC Container on Proxmox?

If you’re running Proxmox and want to self-host a photo backup solution, Immich is the clear frontrunner in 2026. The immediate decision you face is how to deploy it: as a full virtual machine (VM) or a lightweight LXC container. For almost every homelab setup, the LXC route is the better choice.

An LXC container shares the host kernel, which means dramatically lower overhead compared to a VM. You get near-native I/O performance, which matters when Immich is transcoding video or generating ML-based facial recognition thumbnails. More importantly, LXC containers allow direct passthrough of ZFS datasets, giving you efficient storage without the complexity of network mounts or virtual disk files that waste space on snapshots.

This guide walks you through the complete process: automated setup via the Proxmox VE Helper Scripts, the critical ZFS dataset creation, and the one step most guides skip — properly mounting that dataset inside the container so Immich can actually write to it.

Hardware Requirements: What You Need Before Starting

Immich is more resource-hungry than a simple file server. The machine learning features (facial recognition, object tagging, scene classification) are the main drivers of CPU and RAM usage.

4 CoresMinimum CPU
4 GBMinimum RAM (8 GB recommended)
50 GBMinimum Container Disk
1 TB+Recommended Photo Storage

For the Proxmox host itself, a modern Intel Core i3 or AMD Ryzen 3 is a comfortable minimum. If you plan to run Immich alongside other services like Plex or a file server, step up to a Core i5 or Ryzen 5. The ML jobs run as background tasks, so they won’t block the UI, but they will consume CPU cycles when active.

Tip:

If you’re building a new server, aim for 16 GB of RAM on the Proxmox host. You can allocate 8 GB to the Immich LXC and still have headroom for a few additional containers. For power-efficient builds, check out our guide on how to reduce your NAS’s power consumption — an Intel N100 or N305 mini PC idles around 8-12W and handles Immich well for a household of 2-4 people.

Method 1: Automated Install Using Proxmox VE Helper Scripts

The fastest way to get Immich running is through the Proxmox VE Helper Scripts by tteck. This script creates a Debian LXC container, installs Docker inside it, pulls the Immich stack, and configures the basics. It saves you roughly 30–45 minutes of manual configuration.

1
SSH into your Proxmox host

Open a terminal and connect to your Proxmox node. You’ll run the script directly from the shell.

2
Run the Immich installer script

Execute: bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/immich.sh)". The script will prompt you for container ID, hostname, CPU cores, RAM, and disk size.

3
Complete the interactive prompts

Allocate at least 8 GB of RAM and 2 CPU cores. Set the root disk to 50 GB — this is for the container OS and Docker images, not your photo storage. The script will finish by displaying the container’s IP address and port 2283 for the Immich web UI.

4
Access the Immich web interface

Open a browser and go to http://[container-IP]:2283. Create your admin account. The default storage location inside the container is /opt/immich, but you’ll change that in the next section.

Good to Know:

The helper script also sets up automatic updates via a cron job. Run pveam update periodically to keep the container template fresh. If you prefer a manual install, you can follow the official Immich Docker Compose guide — the storage mount steps below apply to both methods.

The Critical Step: Connecting Immich to Your ZFS Storage

This is where most guides fall short. After the container is created, Immich stores all uploaded photos inside the container’s root disk. That’s fine for testing, but for production use, you want your photo library on a dedicated ZFS dataset — it gives you snapshots, compression, and the ability to grow storage without touching the container.

Creating the ZFS Dataset on the Proxmox Host

First, decide where your photo library will live. If you already have a ZFS pool (for example, a mirror or RAIDZ array), create a dedicated dataset for Immich.

zfs create tank/immich
zfs set compression=lz4 tank/immich
zfs set atime=off tank/immich

The compression=lz4 setting is nearly free in terms of CPU overhead and typically saves 20–40% on photo storage. Disabling atime reduces write amplification. If you’re new to ZFS sizing, see our guide on how much storage you need for a NAS to estimate your photo library growth.

Binding the ZFS Dataset into the LXC Container

This is the step that trips everyone up. You cannot simply mount a ZFS dataset inside an unprivileged container without explicitly declaring it in the container’s configuration file.

1
Stop the Immich container

In the Proxmox web interface, select the Immich LXC and click “Stop”. Editing the config while the container is running can cause corruption.

2
Edit the container’s configuration file

On the Proxmox host, open /etc/pve/lxc/[CT_ID].conf in a text editor. Add the following line:

mp0: /tank/immich,mp=/mnt/immich

This maps the host path /tank/immich to the container path /mnt/immich. If your dataset path is different, adjust accordingly.

3
Start the container and verify the mount

Start the container from the Proxmox UI. SSH into the container and run df -h | grep /mnt/immich. You should see the ZFS pool listed with its capacity. If the mount point is empty or the command returns nothing, double-check the config file syntax — a missing comma or typo is the usual culprit.

Warning:

If you’re using an unprivileged container (the default for the helper script), you may need to enable NFS or bind-mount features. Add features: keyctl=1,nesting=1 to the container config file to allow proper filesystem operations. Without this, Immich may fail to read or write files even though the mount appears correct.

Configuring Immich to Use the Mount Point

After the mount is verified, you need to tell Immich where to store its data. The helper script installs Immich via Docker Compose in /opt/immich. Edit the docker-compose.yml file inside the container:

nano /opt/immich/docker-compose.yml

Find the immich-server service’s volumes section. Change the UPLOAD_LOCATION environment variable and the volume mount path to point to your dataset:

environment:
  - UPLOAD_LOCATION=/mnt/immich
volumes:
  - /mnt/immich:/usr/src/app/upload

Save the file and restart the Immich stack: docker compose down && docker compose up -d. Upload a test photo and verify it appears in /mnt/immich/upload from the container’s shell.

💾
Key RuleThe ZFS dataset must be owned by the container’s root user. If you see permission errors, run chown -R 100000:100000 /tank/immich on the Proxmox host — this maps the unprivileged container’s UID 0 to the host’s subuid range.

Verifying Storage Permissions After Setup

Silent write failures are the most frustrating issue with LXC storage mounts. Immich may report that a photo was uploaded successfully, but the file never actually lands on disk. This happens when the mount point exists but the container lacks write permissions.

Run this quick test from inside the container:

touch /mnt/immich/testfile.txt
ls -la /mnt/immich/testfile.txt
rm /mnt/immich/testfile.txt

If the touch command fails with “Permission denied”, the issue is UID mapping. If it succeeds but the file doesn’t appear on the host’s ZFS dataset, the mount entry in the container config is pointing to the wrong host path. If everything works with test files but Immich still fails to write, check the Docker container’s user — Immich runs as UID 1000 inside the container by default, and that UID must have write access to the mounted directory.

💾 Expert Note:

One subtle issue: if you’re using the Proxmox VE Helper Scripts default configuration, the container’s root filesystem is on a ZFS volume (zvol), not a dataset. This is fine for the OS, but the photo storage dataset should be a separate ZFS filesystem (dataset) for proper snapshot management and compression. Never store your Immich library on a zvol — you lose the ability to take incremental snapshots and the performance for small files is worse.

Performance Tuning for Machine Learning Features

Immich’s ML pipeline is the main reason you need more than minimal hardware. If you skip the ML features, you can get away with 4 GB of RAM and 2 cores. But for facial recognition and smart search, allocate at least 8 GB of RAM and 4 cores to the container.

You can adjust these resources on a running LXC container from the Proxmox UI without downtime. Go to the container’s “Resources” tab and change the memory or CPU limit. The changes take effect immediately. If you notice the ML jobs are slow, check the container’s CPU usage with htop — the ML process is single-threaded for most operations, so higher clock speed helps more than additional cores.

For the ZFS dataset, enable the relatime=on property if you’re running ML jobs that read metadata frequently. The default atime=off is fine for most users, but if you notice that Immich’s “recently added” view is slow to populate, switching to relatime can help without the full write penalty of atime.

Bottom Line: LXC with ZFS is the Right Call for Immich

For 90% of Proxmox homelab users, installing Immich in an LXC container with a dedicated ZFS dataset is the optimal setup. You get low overhead, direct filesystem access, and the ability to snapshot your photo library independently of the container OS. The automated helper script gets you to a working install in under 10 minutes, and the storage mount step — the one that causes the most headaches — is a single line in a config file once you know where to put it.

Choose this approach if you want a low-maintenance setup that integrates cleanly with your existing Proxmox storage. If you absolutely need GPU passthrough for hardware-accelerated transcoding, a VM might be necessary, but that adds complexity and overhead that most home users don’t need. Stick with the LXC, set up your ZFS mount correctly, and you’ll have a reliable photo backup system that runs for years.

Frequently Asked Questions

Should Immich run in an LXC container or a VM on Proxmox?

For almost all homelab setups, an LXC container is the better choice. LXCs have near-zero overhead compared to a VM, allowing direct ZFS dataset passthrough without the performance penalty of virtual disk files. A full VM adds about 1–2 GB of RAM overhead and requires you to manage a separate kernel and init system. The only reason to use a VM is if you need GPU passthrough for hardware-accelerated transcoding, which LXCs cannot do easily. For a typical 2–6 person household, the LXC route is simpler, faster, and more resource-efficient.

Why can’t my Immich container write to my ZFS dataset?

This is almost always a mount point configuration issue. The most common cause is forgetting to add the mount entry to the container’s config file at /etc/pve/lxc/[CT_ID].conf. Without the mp0: /pool/dataset,mp=/mount/point line, the container cannot see the host’s ZFS dataset. The second most common cause is UID mapping in unprivileged containers — you need to run chown -R 100000:100000 /pool/dataset on the host to match the container’s subuid range. A quick test: touch a file from inside the container at the mount point. If it fails with “Permission denied”, check UID mapping. If it succeeds but Immich still can’t write, check the Docker user permissions inside the Immich stack.

How much RAM does Immich need on Proxmox?

The baseline for a functional Immich instance is 4 GB of RAM allocated to the LXC container. This covers the web server, database, and basic upload functionality. If you enable the machine learning pipeline — facial recognition, object tagging, smart search — you should allocate at least 8 GB. The ML jobs are memory-intensive, especially when processing large batches of new photos. For a household of 4 people with 50,000+ photos, 12–16 GB is not excessive. You can adjust the RAM allocation on a running LXC container from the Proxmox web interface without downtime, so start with 8 GB and increase if you see OOM errors in the container logs.

Is there an automated script to install Immich on Proxmox?

Yes, the Proxmox VE Helper Scripts by tteck provide a fully automated install for Immich. The script creates a Debian LXC container, installs Docker, pulls the Immich Docker Compose stack, and configures the web interface on port 2283. It’s the fastest way to get a working setup — roughly 5–10 minutes from start to finish. The script prompts you for container ID, hostname, CPU cores, RAM, and disk size. After the script finishes, you still need to manually configure the ZFS storage mount point (as described in this guide), but the script handles all the Docker and networking complexity. You can find the script at the official Proxmox Helper Scripts GitHub repository.

📋 Sources & Last Verified:

Last verified: July 09, 2026. Specifications cross-checked against manufacturer documentation where available.

🛡 Shop Recommended Hardware

Prices and stock verified regularly by our affiliate partners. As an affiliate, HomeLabCost may earn a commission on qualifying purchases at no extra cost to you.

Browse Hardware Picks →

homelabcost

HomeLabCost editor covering NAS builds, hardware selection, and homelab server setup guides.

Leave a Reply

Your email address will not be published. Required fields are marked *