Tools

replaces Google Photos

Immich

Automatic, private photo and video backup from your phone, with face recognition, a searchable timeline, and shared albums, without your photos touching Google's servers.

immich.app ↗Steps and versions verified against official docs: September 2026
The Immich photo timeline on desktop and mobile, next to the Immich logo
Official Immich screenshot

This assumes you've already done the base setup: a server, SSH access, a firewall, and Docker installed. Immich is heavier than the other tools here (the official minimum is 6 GB RAM and 2 CPU cores), so check your server's size before you start.

01

Set up the project folder

Immich runs as four containers working together: the main server, a machine-learning service for face and object recognition, a cache (Redis), and a Postgres database with a vector-search extension built in, so you can't swap in a plain, stock Postgres image. Create a folder, and inside it a .env file:

UPLOAD_LOCATION=./library
DB_DATA_LOCATION=./postgres
IMMICH_VERSION=v2.1.0
DB_PASSWORD=changeThisToARandomPassword123
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Change DB_PASSWORD to a random password of your own, using only letters and numbers. Punctuation in this particular password can break how Docker reads the file. Also note IMMICH_VERSION here: Immich's own docs recommend pinning it to a specific release like this, rather than leaving it on "always latest," so the mobile app and server upgrade together deliberately instead of drifting apart.

02

Write the compose file

Save this as docker-compose.yml in the same folder. It joins the shared web network on immich-server instead of publishing port 2283 directly, so it can sit behind a reverse proxy; the domains and HTTPS deep dive covers what that network is and why every tool on this site uses it.

name: immich
services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    security_opt:
      - no-new-privileges:true
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false
    networks:
      - default
      - web

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

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:9
    security_opt:
      - no-new-privileges:true
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping | grep -q PONG || exit 1"]
    restart: always

  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    security_opt:
      - no-new-privileges:true
    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

networks:
  web:
    external: true

volumes:
  model-cache:

Then start everything: docker compose up -d. The first start takes a few minutes.

03

Wire it into the shared reverse proxy

This site uses one Caddy instance for the whole server, not one per app, and every tool guide points back to the same setup rather than each showing its own. If you haven't set it up yet, the domains and HTTPS deep dive is the canonical walkthrough, including the exact port and Caddyfile block for every tool on this site. Once it's running, connecting Immich is one block in the shared Caddyfile:

photos.yourdomain.com {
    reverse_proxy immich-server:2283
}

Then reload it: docker compose restart caddy in the proxy's folder.

04

Create your account

Visit your domain and click "Getting Started." There's no separate setup wizard: the first account you register becomes the admin account, full stop.

05

Install the apps and turn on backup

Android: Google Play / F-DroidiOS: TestFlight (beta)

One real caveat worth knowing up front: the iOS app is currently distributed through Apple's TestFlight beta program, not a normal App Store listing. That's Immich's own current distribution choice, not a mistake on your end. In the app, enter your server address and log in, then turn on background backup in settings so new photos upload automatically.

Before you rely on this

  • DB_PASSWORD only applies the very first time the database container initializes. Changing it in .env later does nothing to the already-created database. If you need to change it after the fact, you have to do that inside Postgres itself, not just in the file.
  • There are two things to back up here, not one: the photo and video files at UPLOAD_LOCATION, and the database, which holds every album, face tag, and share link. Immich automatically dumps the database to a backups folder inside your upload location every night and keeps the last 14 copies, but that folder still lives on the same server. Copy it, and your photo library, somewhere else too. The backups deep dive covers what a routine you can actually trust looks like.
  • Immich moves fast and development is very active, which is mostly good news, but it means release notes matter. Past updates have changed the default port and required database extension upgrades. Skim the changelog before you run an update, especially after not updating for a while.

More tools

Ready for the next one?

Every guide here assumes you've already completed the base setup: server, firewall, and Docker.