StackSwitcher
OPEN-SOURCE MIGRATION BENCHMARK License: AGPL-3.0 ★ 117.7k GitHub Stars

Replace Google Photos with Self-Hosted Immich

Self-hosted photo and video backup with mobile apps, face recognition and smart search. Instead of paying $0/mo for a 10-person team on Google Photos (free 15 GB per Google account; paid Google One plans from $1.99/mo, US), you can self-host Immich on a €8.99/mo Linux VPS (EUR, excl. VAT) and keep full control of your data.

10-Seat Annual Savings
+$0 / yr
vs Google Photos standard plan
Container RAM & vCPU
6144 MB RAM
2.0 vCPU • Migration: Moderate
Recommended Cloud Box
€8.99/mo
EUR/mo, excl. VAT, incl. IPv4, Germany/Finland
Hetzner CX33 (8GB RAM / 4 vCPU)

1-to-100 Seat Total Cost of Ownership (TCO) Table

Comparing Google Photos (free 15 GB per Google account; paid Google One plans from $1.99/mo, US) vs self-hosted Immich on a Hetzner CX33 (8GB RAM / 4 vCPU).

Team Size Google Photos Cost (USD) Immich Server (EUR, billed separately) SaaS Spend Dropped (USD/yr, before server)
1 Seat (Solo) $0.00/mo ($0/yr) €8.99/mo (CX33, EUR excl. VAT) $0 / year
5 Seats $0.00/mo ($0/yr) €8.99/mo (CX33, EUR excl. VAT) $0 / year
10 Seats $0.00/mo ($0/yr) €8.99/mo (CX33, EUR excl. VAT) $0 / year
25 Seats $0.00/mo ($0/yr) €8.99/mo (CX33, EUR excl. VAT) $0 / year
50 Seats $0.00/mo ($0/yr) €8.99/mo (CX33, EUR excl. VAT) $0 / year
100 Seats $0.00/mo ($0/yr) €8.99/mo (CX33, EUR excl. VAT) $0 / year

Server prices are Hetzner's EUR/mo, excl. VAT, incl. IPv4, Germany/Finland list prices and are not subtracted from the USD figures.

Prices last checked: 31 Oct 2026

Production Docker Compose + Caddy Auto-SSL

Copy and run docker compose up -d on any Ubuntu 24.04 server.

Open in Multi-Tool Builder →
# Production Docker Compose: Immich (Replaces Google Photos)
services:
  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    networks:
      - stack_net

  # Immich v3.3.5: services from the official release docker-compose.yml
  # https://github.com/immich-app/immich/releases/download/v3.3.5/docker-compose.yml
  # StackSwitcher changes: IMMICH_VERSION default pinned to v3.3.5, services joined to stack_net so Caddy can reach them.
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-v3.3.5}
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - '2283:2283'
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false
    networks:
      - stack_net

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

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:9@sha256:c123e3715db63d06d4ad6964884037aa0d5d4d703939b9929954112889708e1d
    healthcheck:
      test: redis-cli ping | grep -q PONG || exit 1
    restart: always
    networks:
      - stack_net

  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    shm_size: 128mb
    restart: always
    healthcheck:
      disable: false
    networks:
      - stack_net

networks:
  stack_net:
    driver: bridge

volumes:
  caddy_data:
  model-cache:
Caddyfile (Automatic HTTPS Reverse Proxy):
# Automatic Let's Encrypt HTTPS for Immich
photos.{$DOMAIN:yourdomain.com} {
  encode zstd gzip
  reverse_proxy immich-server:2283
}

Why Teams Switch to Immich

  • ✓Official iOS and Android apps with background backup
  • ✓Machine-learning container for face recognition and smart search
  • ✓Official docs ask for 6 GB RAM minimum, 8 GB recommended
GitHub Repository immich-app/immich
Official Website immich.app
Docker Image ghcr.io/immich-app/immich-server:v3.3.5
Database Needed Built-in / SQLite
PRODUCTION BOILERPLATE ZIP

Get All 16 Pre-Built Production Stacks + Encrypted S3 Backups

Includes pre-tuned docker-compose.yml, Caddy Auto-SSL, AES-256 encrypted nightly S3/R2 Postgres backups, and Ubuntu 24.04 UFW/Fail2ban hardening scripts.

Data last updated: . How we check • Changelog • Open dataset (CC BY 4.0)

Config templates are MIT licensed and provided "AS IS", with no warranty of any kind and no liability. Prices and specs are informational estimates from our dataset, so check the vendor and project sites before you decide. See the Terms & No Warranty disclaimer.