Skip to main content

How to Self-Host Immich: Google Photos Alternative with Mobile Backup 2026

·OSSAlt Team
immichphotosgoogle-photosmobile-backupself-hostingdocker2026

TL;DR

Immich (AGPL 3.0, ~55K GitHub stars, TypeScript + Go) is the fastest-growing self-hosted Google Photos replacement — purpose-built for automatic mobile backup with a near-identical UX. The iOS and Android apps run in the background and upload photos/videos as you take them. AI features (face recognition, scene detection, CLIP semantic search) run locally. Google Photos charges $2.99/month for 100GB; Immich is free and stores on your hardware. Compare Immich vs PhotoPrism: Immich has better mobile backup and faster UI; PhotoPrism has more mature AI classification and batch operations.

Key Takeaways

  • Immich: AGPL 3.0, ~55K stars — Google Photos-equivalent UX, best mobile backup
  • Automatic backup: iOS/Android apps silently backup in background (like Google Photos)
  • Machine learning: Face clustering, CLIP semantic search ("sunset over mountains")
  • Shared albums: Create albums and invite family/friends with a link
  • Memory lane: Shows "On this day" photos from past years
  • Active development: Releases weekly — fastest-moving self-hosted photo project

Immich vs PhotoPrism vs Google Photos

FeatureImmichPhotoPrismGoogle Photos
LicenseAGPL 3.0AGPL 3.0Proprietary
CostFreeFree$2.99/mo (100GB)
Mobile backup appYes (iOS + Android)No (3rd party)Yes
Background syncYes (automatic)Manual/3rd partyYes
Face recognitionYesYesYes
CLIP semantic searchYesNoYes
Scene classificationBasic1000+ labelsYes
Shared albumsYesYesYes
Memory laneYesNoYes
Duplicate detectionYesYesYes
Video transcodingYesYesYes
GitHub Stars~55K~34K

Part 1: Docker Setup

# docker-compose.yml
name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    restart: always
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - "2283:2283"
    depends_on:
      - redis
      - database
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    restart: always
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    healthcheck:
      disable: false

  redis:
    container_name: immich_redis
    image: docker.io/redis:6.2-alpine@sha256:148bb5ac8be21ac54f6bb42d3c4af0c8cfbae44e6ec8f5bfa33a80dd79a14f9d
    restart: always
    healthcheck:
      test: redis-cli ping || exit 1

  database:
    container_name: immich_postgres
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    restart: always
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: "--data-checksums"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: >-
        pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1;
        Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align
        --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
        echo "checksum failure count - $Chksum";
        [ "$Chksum" = '0' ] || exit 1
      interval: 5m
      start_interval: 30s
      start_period: 5m

volumes:
  model-cache:
  postgres_data:
# .env
UPLOAD_LOCATION=/path/to/your/photos    # Where photos are stored on host
IMMICH_VERSION=release
DB_PASSWORD=your-secure-db-password
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
REDIS_HOSTNAME=redis

docker compose up -d

Visit http://your-server:2283 → create admin account.


Part 2: HTTPS with Caddy

photos.yourdomain.com {
    reverse_proxy localhost:2283
}

Part 3: Install Mobile App and Enable Backup

iOS

  1. Install Immich from App Store
  2. Open app → Server URL: https://photos.yourdomain.com
  3. Log in
  4. Backup tab → Enable Auto Backup
  5. Grant photo library access
  6. Immich backs up photos and videos silently in the background

Android

  1. Install Immich from Play Store or F-Droid
  2. Same setup as iOS
  3. Enable Background backup → Immich uploads automatically when on WiFi

Backup Settings

In the mobile app → Backup settings:

  • WiFi only: Recommended (prevents mobile data usage)
  • Background backup: Keep enabled
  • Video backup: Optional (large files)
  • Exclude albums: Exclude screenshots, WhatsApp images, etc.

Part 4: AI Features

Face Recognition

Immich clusters faces automatically — runs on the machine learning container:

  1. Explore → People — view auto-detected face clusters
  2. Click a cluster → Set name → "Alice"
  3. All photos of Alice are now searchable

Semantic Search (CLIP)

Immich uses CLIP (Contrastive Language-Image Pretraining) for natural language photo search:

# Search examples in the search bar:
"birthday cake with candles"
"sunset over mountains"
"dog playing in snow"
"wedding ceremony outdoors"

No tags needed — the model understands photo content semantically.

Smart Albums

  1. Albums → + Create Album
  2. Or use Explore → People → [Person] to auto-populate a person's photos

Part 5: Sharing

Shared Albums

  1. Albums → [Album] → Share
  2. Add users (internal accounts) or generate a Public share link
  3. Public link: recipients can view/download without an account

Partner Sharing

Share your entire library with a partner:

  1. Settings → Sharing → Partner → Add partner
  2. They see all your photos in their app

Part 6: External Library (Without Re-uploading)

Point Immich at an existing photo directory without moving files:

# In docker-compose.yml, add to immich-server:
volumes:
  - ${UPLOAD_LOCATION}:/usr/src/app/upload
  - /path/to/existing/photos:/mnt/media/existing:ro    # Read-only external library

Then in Immich:

  1. Administration → External Libraries → Create External Library
  2. Path: /mnt/media/existing
  3. Click Scan Library — Immich indexes without copying

Part 7: Hardware Acceleration for ML

NVIDIA GPU

immich-machine-learning:
  image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
  deploy:
    resources:
      reservations:
        devices:
          - driver: nvidia
            count: 1
            capabilities: [gpu]

ARM / Apple Silicon

Use the ARM build — ML runs on CPU efficiently on M-series Macs or ARM servers:

immich-machine-learning:
  image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-armv8

Part 8: Memory Lane

Immich automatically creates "On this day" memories:

  • Opens the app → notifications for photos taken 1, 2, 3+ years ago today
  • Memories tab → swipe through past years like a story

Enable in: Settings → Notifications → Memories


Part 9: Duplicate Detection

Immich detects duplicate photos in your library:

  1. Administration → Utilities → Duplicate Detection
  2. Review detected duplicates side-by-side
  3. Trash duplicates with one click

Maintenance

# Update Immich (always use release tag, check changelogs):
docker compose pull
docker compose up -d

# WARNING: Breaking changes are common — read release notes before updating

# Check job queue status:
# Administration → Jobs → view active/completed jobs

# Backup database:
docker exec immich_postgres pg_dump -U postgres immich \
  | gzip > immich-db-$(date +%Y%m%d).sql.gz

# Backup uploads (photos):
# Just backup your ${UPLOAD_LOCATION} directory — original files live there

# Logs:
docker compose logs -f immich-server
docker compose logs -f immich-machine-learning

# Trigger full library scan:
# Administration → Jobs → Library → Run all

See all open source photo management tools at OSSAlt.com/categories/photos.

Comments