version: "3.9"

services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:v2.1.0

    volumes:
      - immich-library:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      immich-redis:
        condition: service_healthy
      immich-database:
        condition: service_healthy
    environment:
      PORT: 2283
      SERVER_URL: ${SERVER_URL}
      FRONT_BASE_URL: ${FRONT_BASE_URL}
      # Database Configuration
      DB_HOSTNAME: ${DB_HOSTNAME}
      DB_PORT: ${DB_PORT}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_DATABASE_NAME: ${DB_DATABASE_NAME}
      # Redis Configuration
      REDIS_HOSTNAME: ${REDIS_HOSTNAME}
      REDIS_PORT: ${REDIS_PORT}
      REDIS_DBINDEX: ${REDIS_DBINDEX}
      # Server Configuration
      TZ: ${TZ}
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:2283/server-info/ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:v2.1.0

    volumes:
      - immich-model-cache:/cache
    environment:
      REDIS_HOSTNAME: ${REDIS_HOSTNAME}
      REDIS_PORT: ${REDIS_PORT}
      REDIS_DBINDEX: ${REDIS_DBINDEX}
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3003/ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  immich-redis:
    image: redis:6.2-alpine

    volumes:
      - immich-redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  immich-database:
    image: tensorchord/pgvecto-rs:pg14-v0.3.0

    volumes:
      - immich-postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: '--data-checksums'
    healthcheck:
      test: pg_isready -U ${DB_USERNAME} -d immich || exit 1
      interval: 10s
      timeout: 5s
      retries: 5
    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',
      ]
    restart: unless-stopped

volumes:
  immich-model-cache:
  immich-postgres:
  immich-library:
  immich-redis-data:
