Proxmox + Immich: Mediendaten auf Netzwerkfreigabe speichern

EliasEcke

Newbie
Registriert
Juni 2024
Beiträge
1
Hallo zusammen, ich versuche gerade Immich auf meinem Proxmox-Server einzurichten, habe aber spezifische Anforderungen bezüglich der Speicherung der Mediendateien. Ich würde mich über eure Einschätzungen zum besten Ansatz hierfür freuen.

Mein aktuelles Setup:
  • Proxmox VE auf einem Dell Thin-Client mit 256GB-M.2-Sata SSD für das System
  • OpenMediaVault läuft als VM
  • OMV verwaltet zwei externe 8TB HDD, die über USB mit dem Proxmox-Host verbunden ist (per Pass-through an die OMV-VM weitergegeben) (und ja, ich weiß dass das nicht gut ist. Mir bleibt aber leider nichts anderes übrig)
  • Ich habe bereits NFS- und Samba-Freigaben auf der OMV-VM eingerichtet, die für andere Dienste ordnungsgemäß funktionieren

Was ich erreichen möchte:
Ich möchte Immich auf meinem Proxmox-Server installieren (Methode noch zu bestimmen), aber ich möchte nicht, dass speicherintensive Daten (Fotos, Videos, Thumbnails usw.) auf der Proxmox-Systemfestplatte gespeichert werden. Stattdessen sollen all diese Daten auf meiner externen HDD gespeichert werden, die von OMV verwaltet wird, speziell über die NFS oder Samba-Freigabe, die ich dort bereits konfiguriert habe.


Meine konkreten Fragen:
  1. Welche Methode eignet sich am besten, um Immich auf Proxmox für diesen Anwendungsfall zu installieren? Sollte ich:
    • Eine Ubuntu-VM erstellen und Docker + Immich darauf installieren?
    • Einen LXC-Container verwenden?
    • Einen anderen Ansatz, den ich noch nicht in Betracht gezogen habe?
  2. Wie konfiguriere ich die Immich-Installation richtig, damit ALLE Mediendaten (Upload-Cache, Thumbnails, kodierte Videos und Originalmedien) auf der Netzwerk-Freigabe gespeichert werden?
  3. Hat jemand Erfahrung mit diesem spezifischen Setup (Immich + Proxmox + OMV-Freigabe), der seine Konfiguration, docker-compose-Dateien oder so?

Ich bin mit Linux-Befehlen und Docker-Grundlagen leider nicht so gut vertraut

Vielen Dank für jede Hilfe oder Anleitung, die ihr geben könnt!
 
Ich würde tendenziell auf jedenfall zu einer Docker Installation raten. Das ist auch die Empfehlung seitens Immich. Im Standard Compose file kannst du auch für Thumbnails und Daten unterschiedliche Pfade angeben. Müsstest du halt an deine Struktur anpassen. Mein Compose File hat eine kleine Anpassung damit sie mit Portainer geht. Dazu gibt es noch eine externe Traefik instanz die sich um die Zertifikate und ähnliches kümmert.

https://immich.app/docs/install/docker-compose

Code:
services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
      - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
      - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
      - ${BACKUP_LOCATION}:/usr/src/app/upload/backups
      - /etc/localtime:/etc/localtime:ro
      - /dev/dri:/dev/dri
    env_file:
      - stack.env
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.immich-server.entrypoints=websecure"
      - "traefik.http.routers.immich-server.rule=Host(`${IMMICH_TRAEFIK_HOST:-immich.example.com}`)"
      - "traefik.http.routers.immich-server.tls=true"
      - "traefik.http.services.immich-server.loadbalancer.server.port=2283"
    environment:
      IMMICH_WORKERS_INCLUDE: 'api'
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false
    networks:
      - backend
      - frontend

  immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - ${THUMB_LOCATION}:/usr/src/app/upload/thumbs
      - ${ENCODED_VIDEO_LOCATION}:/usr/src/app/upload/encoded-video
      - ${PROFILE_LOCATION}:/usr/src/app/upload/profile
      - ${BACKUP_LOCATION}:/usr/src/app/upload/backups
      - /etc/localtime:/etc/localtime:ro
      - /dev/dri:/dev/dri
    env_file:
      - stack.env
    environment:
      IMMICH_WORKERS_EXCLUDE: 'api'
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false
    networks:
      - backend
      - frontend

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
      - /dev/dri:/dev/dri
    env_file:
      - stack.env
    restart: always
    healthcheck:
      disable: false
    networks:
      - frontend
      - backend
    deploy:
      resources:
        limits:
          cpus: '2.00'

  redis:
    container_name: immich_redis
    image: docker.io/redis:6.2-alpine@sha256:905c4ee67b8e0aa955331960d2aa745781e6bd89afc44a8584bfd13bc890f0ae
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always
    networks:
      - backend

  database:
    container_name: immich_postgres
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    environment:
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_USER=${DB_USERNAME}
      - POSTGRES_DB=${DB_DATABASE_NAME}
      - POSTGRES_INITDB_ARGS=--data-checksums
    volumes:
      - ${DB_DATA_LOCATION:-./postgres}:/var/lib/postgresql/data
    healthcheck:
      test: >-
        pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
        Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --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
    restart: always
    networks:
      - backend

volumes:
  model-cache:

networks:
  frontend:
    external: true
  backend:
    external: true

.env
Code:
UPLOAD_LOCATION=/mnt/user/immich/library
THUMB_LOCATION=/mnt/user/appdata/immich/thumbs
ENCODED_VIDEO_LOCATION=/mnt/user/appdata/immich/encoded-video
PROFILE_LOCATION=/mnt/user/appdata/immich/profile
BACKUP_LOCATION=/mnt/user/appdata/immich/backups
DB_DATA_LOCATION=/mnt/user/appdata/immich/postgres
IMMICH_VERSION=v1.131.3
DB_PASSWORD=pass
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
IMMICH_TRAEFIK_HOST=immich.mydomain.com
TZ=Europe/Berlin
 
NFS oder CIFS/SMB in einem LXC mounten kann fummelig sein. Wenn du dich da nicht unbedingt auskennst und auch nicht so extrem viel mit beschäftigen willst, dann nimm eine VM, binde dort NFS/SMB ein und reiche das dann in den gewünschten Dockercontainer weiter.
Ist vielleicht nicht die leichtgewichtigste Lösung, aber vermutlich etwas einfacher zu nutzen, vor allem, wenn man sich eher auf Tutorials aus dem Inet verlassen muss. Außerdem ist Docker meines Wissens auch die präferierte Lösung für immich.
 
Ich würde ubuntu im lxc nutzen.
Dort erst NFS mit deiner gewünschten Freigabe einbinden. (Inkl. Automount beim Neustart)
Docker basics installieren
Dann das composefile an deine Ordnerstruktur anpassen und go!
 
Zurück
Oben