Skip to content

Setup Immich

Overview

Self-hosted photo and video management solution.

Important Docker Files

.env file

.env
NAME=immich
APPDATA=
MEDIA=
SUB=photos
DOMAIN=
TAG=release
PORT=2283
DB_PASSWORD=
DB_HOSTNAME=immich-db
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
REDIS_HOSTNAME=immich-redis

hwaccel.yml file

hwaccel.yml
services:
  cuda:
      deploy:
        resources:
          reservations:
            devices:
              - driver: nvidia
                count: 1
                capabilities:
                  - gpu
  nvenc:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu
                - compute
                - video

docker-compose.yml file

docker-compose.yml
name: immich
services:
  immich:
    container_name: ${NAME}
    image: ghcr.io/immich-app/immich-server:${TAG}
    restart: always
    extends:
      file: hwaccel.yml
      service: cuda  
    volumes:
      - ${MEDIA}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      - ${NAME}-redis
      - ${NAME}-db
    networks:
      - proxy
      - internal-db
    env_file:
      - .env
    labels:
      swag: enable
      swag_address: ${NAME}
      swag_port: ${PORT}
      swag_proto: http
      swag_url: ${SUB}.${DOMAIN}
      com.centurylinklabs.watchtower.enable: true
  immich-ml:
    container_name: ${NAME}-ml
    image: ghcr.io/immich-app/immich-machine-learning:${TAG}-cuda
    restart: always
    env_file:
      - .env
    networks:
      - internal-db
      - proxy
    extends:
      file: hwaccel.yml
      service: cuda
    volumes:
      - ${APPDATA}/${NAME}/${NAME}-ml:/cache
    labels:
      traefik.enable: false
      com.centurylinklabs.watchtower.enable: true
  immich-redis:
    container_name: ${NAME}-redis
    image: redis:alpine
    restart: always
    networks:
      - internal-db
    volumes:
      - ${APPDATA}/${NAME}/${NAME}-redis:/data
    labels:
      com.centurylinklabs.watchtower.enable: true
  immich-db:
    container_name: ${NAME}-db
    image: tensorchord/pgvecto-rs:pg16-v0.2.0
    restart: always
    networks:
      - internal-db
    env_file:
      - .env
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
    healthcheck:
      test: pg_isready --dbname='${DB_DATABASE_NAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
      interval: 5m
      start_interval: 30s
      start_period: 5m
    command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
    volumes:
      - ${APPDATA}/${NAME}/${NAME}-db:/var/lib/postgresql/data
    labels:
      com.centurylinklabs.watchtower.enable: true
networks:
  proxy:
    external: true
  internal-db:
    external: true

Start the Container

Start the Container
docker compose up -d