3 KiB
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
Recommended Settings
# 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.