Raja's Exocortex

Immich - Self-hosted Google Photos

Immich is a self-hosted Google Photos app for Android, iOS and web. Immich is better than Photoprism as it has native mobile apps and can sync to the backend natively.

Immich is hosted behind Traefik using native authentication, without Google OAuth2. Geolocation works for all photos. Face recognition, machine learning, etc do yet not work.

Android App

Android app supports background and foreground data sync, library support, sharing, etc.

Backend Deployment

After deployment do not change the hosted URL (eg. photos.example.com or immich.example.com).

File: docker-compose.yaml

# Filename: docker-compose.yaml
# Download the latest docker-compose and .env from
#   https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#   https://github.com/immich-app/immich/releases/latest/download/example.env
#
# Deploy behind traefik
#

name: immich-example-com

services:
  immich-server:
    container_name: immich_server.example.com
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    depends_on:
      - redis
      - database
    restart: always

    labels:
      - com.centurylinklabs.watchtower.enable=true
      - traefik.enable=true
      - traefik.http.routers.immich.rule=Host(`immich.example.com`) || Host(`photos.example.com`)
      - traefik.http.routers.immich.tls=true
      - traefik.http.routers.immich.tls.certresolver=lets-encrypt


  immich-microservices:
    container_name: immich_microservices.example.com
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/hardware-transcoding
    #   file: hwaccel.transcoding.yml
    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    depends_on:
      - redis
      - database
    restart: always

    labels:
      - com.centurylinklabs.watchtower.enable=true

  immich-machine-learning:
    container_name: immich_machine_learning.example.com
    # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
    volumes:
      - ./model-cache:/cache
    env_file:
      - .env
    restart: always

    labels:
      - com.centurylinklabs.watchtower.enable=true

  redis:
    container_name: immich_redis.example.com
    image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
    restart: always

    labels:
      - com.centurylinklabs.watchtower.enable=true

  database:
    container_name: immich_postgres.example.com
    image: registry.hub.docker.com/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    restart: always

    labels:
      - com.centurylinklabs.watchtower.enable=true

File: .env

# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=./data-library
# The location where your database files are stored
DB_DATA_LOCATION=./data-postgres

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release

# Connection secret for postgres. You should change it to a random password
DB_PASSWORD=d41d8cd24f88b204e9765998ecf8427e

# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Pending Config

#TODO Google OAuth2. #TODO Face recognition. #TODO Machine learning without CPU or GPU support.

References