Immich with Postgres and Redis
Immich is a high-performance, self-hosted photo and video backup platform designed as a private alternative to cloud services like Google Photos. It provides automatic mobile uploads, AI-powered search, facial recognition, and a modern gallery experience while keeping your data fully under your control. This template includes: Immich Server for managing photos, videos, and user access Machine Learning service for facial recognition, smart search, and AI-powered features Redis for caching and background job processing PostgreSQL database with vector search support for fast metadata and AI indexing Persistent storage for media uploads, database data, and model cache Optional hardware acceleration support for transcoding and machine learning workloads Perfect for homelab users, families, and privacy-focused users who want a secure, self-hosted media backup solution with powerful AI features and a polished user experience.
yaml
docker-compose.yml
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
volumes:
- ${UPLOAD_LOCATION}:/data
ports:
- ${IMMICH_PORT:-2283}:2283
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
networks:
- immich_backend
deploy:
resources:
limits:
cpus: "2.5"
immich-machine-learning:
container_name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
volumes:
- model-cache:/cache
restart: always
healthcheck:
disable: false
networks:
- immich_backend
deploy:
resources:
limits:
cpus: "2.0"
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8@sha256:81db6d39e1bba3b3ff32bd3a1b19a6d69690f94a3954ec131277b9a26b95b3aa
healthcheck:
test: redis-cli ping || exit 1
restart: always
networks:
- immich_backend
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
networks:
- immich_backend
volumes:
model-cache:
networks:
immich_backend:
external: false
.ENV
.env example
# You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables
# The location where your uploaded files are stored
UPLOAD_LOCATION=./upload
# The location where your database files are stored. Network shares are not supported for the database
DB_DATA_LOCATION=./postgres
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
TZ=Etc/UTC
# The Immich version to use. You can pin this to a specific version like "v2.1.0"
IMMICH_VERSION=v2
# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=changeMe123
# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
IMMICH_PORT=2283
deployment
Quick Start
- Create a working directory named after the service.
- Copy the compose file and generated `.env` into that directory.
- Review the variables and replace placeholders with real values.
- Run `docker compose up -d`.
mkdir immich-postgres-redis
cd immich-postgres-redis
# create docker-compose.yml
# create .env
docker compose up -d