# Immich Testing & Validation Plan **Goal:** Decide if Immich is stable and complete enough to replace iCloud Photos + Synology Photos as Claudio's primary photo management system. **Valid for:** Claudio's personal use + eventual family migration (Alena + others) **Last updated:** 2026-04-01 --- ## What We Need to Validate 1. Automatic phone backup (iOS + Android) 2. Immich library + database backup and restore 3. Public sharing with non-account holders (guest experience) 4. Overall stability under real-world use --- ## 1. Automatic Phone Backup ### How it works Immich has a mobile app (iOS + Android) with two backup modes: - **In-app backup:** User opens the app, goes to the album they want to back up, and hits the backup icon. New photos/videos in that album upload automatically. - **Background backup (Android):** The app periodically checks selected albums in the background and uploads new photos without opening the app. - **iOS background backup:** iOS restricts true background processing, so the app relies on resume-triggered uploads when you open or return to the app. ### What to test | Test | Expected behavior | Pass criteria | |---|---|---| | Select album for backup | Immich shows only that album's new photos | Correct album selected | | New photo taken → app open | Photo appears on server within minutes | Upload completes | | Multiple new photos at once | All upload, progress shown | No dropped uploads | | App killed, reopened | Pending uploads resume | No data loss | | Battery impact | Not excessive (subjective) | Acceptable to Claudio | | Backup of HEIC/HEVC videos | Transcoded or original preserved | Plays back correctly | | Backup while on mobile data | Configurable: WiFi only or all networks | Respects setting | ### Action items - [ ] Install Immich app on Claudio's iPhone, log in - [ ] Enable backup for Camera Roll album (or most important album) - [ ] Take 5 test photos, wait 2 min, verify on server - [ ] Enable background backup if Android (not applicable for iOS) - [ ] Test backup while on LTE/mobile data (with WiFi-only disabled) - [ ] Check battery usage after 24h with background backup ### Notes from research - iOS app uses `https://demo.immich.app` as demo server endpoint for initial setup — not needed for self-hosted - The app connects to `immich.frusetik.com` directly (behind Pangolin) - If Pangolin auth is ever re-enabled on Immich, mobile backup will break — keep Immich **Not Protected** in Pangolin - For Alena's Android phone: test background backup there too when migration time comes --- ## 2. Immich Library + Database Backup ### What needs to be backed up Immich stores three critical data volumes: | Volume | What it contains | Size | |---|---|---| | `UPLOAD_LOCATION` (`immich-upload`) | Original photos + videos | Largest | | `DB_DATA_LOCATION` (`pgdata`) | PostgreSQL database (metadata, thumbnails, users, albums) | Medium | | `THUMB_LOCATION` (`immich-thumbs`) | Generated thumbnails | Medium | | `ENC_DATA_LOCATION` (`immich-encrypted`) | Encrypted files (if used) | Varies | ### Backup approach **Database backup (PostgreSQL):** ```bash docker exec immich_postgres pg_dumpall \ --clean \ --if-exists \ --username="${DB_USERNAME}" \ > backup_$(date +%Y%m%d_%H%M%S).sql ``` **Volume backup:** ```bash # Using docker volume backup docker run --rm \ -v immich_app_upload:/src \ -v /path/to/backups:/dst \ alpine \ tar czf /dst/immich_upload_$(date +%Y%m%d).tar.gz -C /src . ``` ### Recommended backup script (from Immich docs template) The official backup script (`docker/immich/backup.sh` in the Immich repo) handles: - Pause the Immich server before backup - Run `pg_dumpall` to SQL file - Backup the upload volume - Unpause the server - Retention: keeps last N backups ### What to test | Test | Expected behavior | Pass criteria | |---|---|---| | Run `pg_dumpall` backup | Clean SQL file created, no errors | File size > 0, valid SQL | | Restore from SQL dump | Immich starts with correct data | All albums, users, metadata present | | Volume backup + restore | Photos play back correctly | No corruption | | Test restore on fresh Immich install | Full recovery | All data intact | | Backup during active upload | No corruption, consistent state | Server pauses cleanly | ### Action items - [ ] Locate Immich docker volumes on the home lab machine (`docker volume ls | grep immich`) - [ ] Write and test `pg_dumpall` backup script - [ ] Test backup of `UPLOAD_LOCATION` volume - [ ] Do a **practice restore** to a test Immich instance - [ ] Set up automated daily backup via cron - [ ] Verify backup lands offsite (parents' NAS or cloud storage) - [ ] Document exact restore procedure — time to restore SLA ### Notes from research - Immich docs explicitly recommend `pg_dumpall --clean --if-exists` over plain `pg_dump` - Database backup should be taken with Immich server **paused or in maintenance mode** to ensure consistency - Volume snapshots via docker or restic are the most reliable for file-level backups - The official Immich Docker setup already uses named volumes — good for scripted backup --- ## 3. Public Sharing with Non-Account Holders ### How it works Immich has a built-in **public sharing** feature: - Create an album (or select an existing one) - Generate a public share link - Share the link with anyone — no Immich account needed - Recipients can **view** and **download** photos from that album The shared link is read-only for non-account holders. ### What to test | Test | Expected behavior | Pass criteria | |---|---|---| | Create public link for album | Unique URL generated | Link works immediately | | Open link in incognito browser | Photos load without login | No auth prompt | | Photos load on mobile browser | Thumbnails + full-size load | Responsive, no broken images | | Download single photo | Correct file, original quality | Matches uploaded file | | Download full album as ZIP | ZIP with all photos | Correct files, no corruption | | Link expiry settings | Link works before expiry, blocked after | Respects setting | | Shared video playback | Video plays in browser | No plugin needed | | Very large album (500+ photos) | Loads without crashing | Performance acceptable | ### Action items - [ ] Create test album with 10 photos, generate public link - [ ] Open link on laptop (Chrome, Firefox, Safari) - [ ] Open link on phone (Chrome/Safari) without being logged in - [ ] Test download of a photo from shared link - [ ] Test download ZIP of entire album - [ ] Test sharing a video — does it play or only download? - [ ] Verify no Immich instance details leak in shared page (no internal IPs, no API endpoints visible) - [ ] Set up immich-public-proxy if extra privacy layer is desired (see notes below) ### Notes from research - **immich-public-proxy** (GitHub: `alangrainger/immich-public-proxy`) — a separate proxy that front-ends Immich sharing to hide instance details and add extra safety for truly public links. Worth evaluating if sharing with strangers is a core use case. - Built-in sharing is already functional without extra proxy - Public links do not require the viewer to have an Immich account - Album visibility: only explicitly shared albums are accessible — nothing else is exposed --- ## 4. Overall Stability ### What to test | Test | Expected behavior | Pass criteria | |---|---|---| | Upload 100+ photos via web | All processed, thumbnails generated | No dropped uploads, no errors | | Search by date, location | Correct results | Relevant photos found | | Create album, add photos | Album contains correct photos | Album persists after reload | | Delete photo | Removed from server + app | Gone from all views | | Duplicate detection | Duplicates flagged | Accurate detection | | Memory usage on server | Not excessive under load | < 4GB RAM under normal use | | Long-running server (1 week) | No crashes, no memory leaks | Stable, no restarts needed | ### Action items - [ ] Upload 50-100 test photos via web upload - [ ] Test search (date range, maybe location if geolocation is on) - [ ] Test duplicate detection - [ ] Monitor server resource usage for 24h - [ ] Let it run for 1 week before declaring stable --- ## Decision Criteria Before Claudio commits to Immich as primary: | Criterion | Must pass before going live | |---|---| | Phone backup works reliably | ✅ | | Backup + restore tested | ✅ | | Public sharing guest experience good | ✅ | | Stable for at least 1 week | ✅ | --- ## Migration Path Once all criteria pass: ``` Phase 1: Claudio uses Immich alongside iCloud + Synology Photos (dual feed) Phase 2: Claudio confirms Immich backup is trustworthy → stop iCloud sync Phase 3: Alena + family migration (per their capacity and interest) Phase 4: Decommission Synology Photos (or keep as secondary backup) ``` --- ## Related - [[Frusetik Access Architecture]] — Immich is NOT protected by Pangolin auth (required for iOS app compatibility) - [[Homelab Todo List]] — backup system items tracked separately