Immich on Proxmox with a ZFS Mirror: Setup and 3-2-1 Backup
Published 2026-10-19
Immich is a self-hosted photo and video library with phone backup. This guide shows a setup that survives a disk failure: Immich in a VM on Proxmox, photos on a ZFS mirror, and a real 3-2-1 backup on top. It assumes you already have Proxmox installed and two disks of the same size for the mirror.
Hardware: official minimums
| Item | Minimum | Recommended |
|---|---|---|
| RAM | 6 GB | 8 GB |
| CPU | 2 cores | 4 cores |
| Database storage | Local SSD, never a network share | |
Source: Immich requirements (page updated 2026-10-08, checked 2026-10-19). The same page notes thumbnails and transcoded video add roughly 10–20% to library size, and that with only 4 GB RAM you should disable machine learning.
Step 1 — Create the ZFS mirror
- In Proxmox: Datacenter → node → Disks → ZFS → Create: ZFS, select both disks, RAID level Mirror.
- A two-disk mirror gives you the capacity of one disk; either disk can fail without data loss.
- Add it as storage for VM disks, or create a dataset (e.g.
tank/photos) to pass into the VM.
Step 2 — Create the VM
- Create a Debian or Ubuntu VM with at least the minimums above. Put the VM's system disk on SSD so the Postgres database is on local SSD.
- Set the CPU type to
host(or another x86-64-v2 capable type); Immich's machine-learning container requires x86-64-v2 on amd64. - Add a second virtual disk on the ZFS mirror for photos and mount it, e.g. at
/srv/photos.
Immich documents Docker Compose in a VM as the supported path; running inside LXC containers is described as not recommended.
Step 3 — Install Immich
- Install Docker and the Compose plugin.
- Download the official
docker-compose.ymlandexample.envfrom the Immich install docs. - In
.envsetUPLOAD_LOCATION=/srv/photos/libraryand keepDB_DATA_LOCATIONon the SSD system disk. docker compose up -d, open port 2283, create the admin account, install the phone app and turn on backup.
Step 4 — 3-2-1 backup
A mirror protects against a dead disk, not against deletion, ransomware or a house fire. Immich's own docs recommend a 3-2-1 strategy: 3 copies, on 2 kinds of media, 1 off-site.
| Copy | Where | How |
|---|---|---|
| 1 | ZFS mirror (live) | Immich itself |
| 2 | External USB disk or second machine | ZFS snapshots + zfs send, or restic/borg |
| 3 | Off-site (cloud bucket or a friend's server) | restic/borg with encryption |
Back up both parts. Immich creates database dumps automatically in UPLOAD_LOCATION/backups (default: daily at 2:00 AM, last 14 kept). Those dumps contain metadata only — no photos — so your backup job must copy the whole UPLOAD_LOCATION, which then includes the dumps. Source: Immich backup and restore, checked 2026-10-19.
Test a restore once: spin up a throwaway VM, restore files and a dump, and log in.
What else fits on the same server
- A file-sync service (e.g. Syncthing) on the same mirror.
- A password manager server, backed up with the same off-site job.
- Monitoring (disk SMART and ZFS scrub alerts) — the cheapest insurance on the list.
FAQ
- Is the mirror my backup?
- No. It is redundancy. Deleting a photo deletes it on both disks instantly.
- Can I put the database on the ZFS mirror over NFS?
- Immich says the database should never be on a network share. Keep it on local SSD.
- How much RAM does ZFS itself need?
- ZFS uses free RAM as cache (ARC) and gives it back under pressure; budget the VM's RAM first, then let the host use the rest.
Sources
- Immich requirements — checked 2026-10-19
- Immich backup and restore — checked 2026-10-19
Related (Korean): 개발 지식 모음 (한국어)