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

  1. Create a working directory named after the service.
  2. Copy the compose file and generated `.env` into that directory.
  3. Review the variables and replace placeholders with real values.
  4. Run `docker compose up -d`.
mkdir immich-postgres-redis
cd immich-postgres-redis
# create docker-compose.yml
# create .env
docker compose up -d