Netgrimoire/Convert_Immich.md
2026-02-06 15:57:16 +00:00

3 KiB

title description published date tags editor dateCreated
Immich on ZFS Moving Immich to its own ZFS dataset true 2026-02-06T15:57:04.261Z service zfs immich dataset markdown 2026-02-06T15:57:04.261Z

Moving Immich to a ZFS Dataset

Overview

This guide covers moving an existing Immich installation to its own ZFS dataset to enable zfs send backups.

Prerequisites

  • ZFS pool mounted at /srv/vault
  • Existing Immich installation at /srv/vault/immich
  • Immich running via Docker Compose

Steps

1. Stop Immich Services

cd /srv/vault/immich  # or wherever your docker-compose.yml is
docker compose down

2. Create the New Dataset

sudo zfs create vault/immich

3. Move Existing Data Temporarily

sudo mv /srv/vault/immich /srv/vault/immich_old

4. Set Mountpoint and Mount Dataset

sudo zfs set mountpoint=/srv/immich vault/immich
sudo zfs mount vault/immich

5. Copy Data to New Dataset

sudo rsync -avxHAX /srv//immich_old/ /srv/immich/

Flags preserve permissions, ownership, and special attributes.

6. Verify Data Copy

sudo du -sh /srv/vault/immich_old
sudo du -sh /srv/vault/immich

Sizes should match closely.

7. Start Immich

cd /srv/vault/immich
docker compose up -d

8. Test and Clean Up

Verify everything works, then remove old data:

sudo rm -rf /srv/vault/immich_old

ZFS Dataset Properties

# Compression - helps with photos and database
sudo zfs set compression=lz4 vault/immich

# Record size - balance for mixed workload
sudo zfs set recordsize=128K vault/immich

# Better database performance
sudo zfs set primarycache=all vault/immich
sudo zfs set atime=off vault/immich

Property Explanations

  • compression=lz4: Fast, low CPU overhead, works well for both photos and database
  • recordsize=128K: Good compromise between database (8K blocks) and photos (larger files)
  • atime=off: Disables access time updates, reduces unnecessary writes
  • primarycache=all: Keeps both metadata and data in ARC cache (default)

Backup with ZFS Send/Receive

Create Snapshot

zfs snapshot vault/immich@backup-$(date +%Y%m%d)

Send to Remote Server

zfs send vault/immich@backup-$(date +%Y%m%d) | ssh backup-server zfs receive tank/backups/immich

Incremental Backups

# After first full backup
zfs snapshot vault/immich@backup-$(date +%Y%m%d)
zfs send -i vault/immich@previous-snapshot vault/immich@backup-$(date +%Y%m%d) | \
  ssh backup-server zfs receive tank/backups/immich

Optional: Separate Datasets for Database and Photos

For optimal performance, split into separate datasets:

sudo zfs create vault/immich/database
sudo zfs create vault/immich/photos

# Database optimized
sudo zfs set recordsize=16K vault/immich/database
sudo zfs set logbias=latency vault/immich/database

# Photos optimized  
sudo zfs set recordsize=1M vault/immich/photos

Then update your Docker Compose volume mounts accordingly.