Tools
replaces Google Photos
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.

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.
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=immichChange 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.
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.
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.
Visit your domain and click "Getting Started." There's no separate setup wizard: the first account you register becomes the admin account, full stop.
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.
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.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.More tools
Every guide here assumes you've already completed the base setup: server, firewall, and Docker.