🧑‍💻 개발 지식

Home › Guides

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

ItemMinimumRecommended
RAM6 GB8 GB
CPU2 cores4 cores
Database storageLocal 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

  1. In Proxmox: Datacenter → node → Disks → ZFS → Create: ZFS, select both disks, RAID level Mirror.
  2. A two-disk mirror gives you the capacity of one disk; either disk can fail without data loss.
  3. 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

  1. 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.
  2. Set the CPU type to host (or another x86-64-v2 capable type); Immich's machine-learning container requires x86-64-v2 on amd64.
  3. 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

  1. Install Docker and the Compose plugin.
  2. Download the official docker-compose.yml and example.env from the Immich install docs.
  3. In .env set UPLOAD_LOCATION=/srv/photos/library and keep DB_DATA_LOCATION on the SSD system disk.
  4. 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.

CopyWhereHow
1ZFS mirror (live)Immich itself
2External USB disk or second machineZFS snapshots + zfs send, or restic/borg
3Off-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

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

Related (Korean): 개발 지식 모음 (한국어)

📤 Share