Immich ist ein Programm, ähnlich wie Google Fotos, um seine Fotos zu organisieren. In einem anderen Beitrag habe ich Immich schon vorgestellt und gezeigt, wie ich es auf meinem Homeserver installiert habe.
In diesem Tutorial zeige ich dir, wie du Immich auf einem QNAP NAS installieren kannst.
Hardware
In meinem Fall handelt es sich um ein TS-233. Es sollte aber auch mit den meisten anderen QNAP NAS funktionieren. Es muss nur Container Station darauf laufen. Hier findest du die Systemanforderungen dafür: https://www.qnap.com/de-de/software/container-station
Installation von Container Station
Container Station ist die Docker-Umgebung von QNAP, in der wir später Immich installieren werden. Diese kann einfach im App-Center installiert werden:

Beim ersten Start wird gefragt, wohin die Docker-Dateien gespeichert werden sollen. Ansonsten ist keine weitere Konfiguration mehr möglich.
Aktivieren von SSH
Wähle in der Systemsteuerung „Netzwerk und Dateidienste“ → „Telnet / SSH“ und aktiviere dort die SSH-Verbindung. Verbinde dich anschließend per SSH mit dem NAS.

Vorbereiten der .env Datei
Lade dir die Beispiel-Datei hier herunter. Bearbeite die Datei so, dass die Dateipfade stimmen und wähle ein Passwort. Die Dateipfade beginnen immer mit /share/NameDesFreigabeOrdners
. Evtl. musst du die Ordner zuerst noch anlegen. In meinem Fall sieht die Datei so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 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=/share/DockerData/VolumeData/immich_data_tut # The location where your database files are stored DB_DATA_LOCATION=/share/DockerData/VolumeData/immich_pgdata_tut # 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=78fh8h77h8878 # The values below this line do not need to be changed ################################################################################### DB_USERNAME=postgres DB_DATABASE_NAME=immich |
Erstellen der temporären .env Datei
Wechsle ins Verzeichnis /tmp:
1 |
cd /tmp |
Erstelle anschließend die Datei mit dem Inhalt aus deiner .env Datei:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
echo "# 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=/share/DockerData/VolumeData/immich_data_tut # The location where your database files are stored DB_DATA_LOCATION=/share/DockerData/VolumeData/immich_pgdata_tut # 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=78fh8h77h8878 # The values below this line do not need to be changed ################################################################################### DB_USERNAME=postgres DB_DATABASE_NAME=immich" > .env |
Verwende dazu deine vorbereitete .env Datei und füge den Inhalt zwischen den Anführungszeichen ein.
Diese Datei wird nur temporär zum Erstellen des Containers gebraucht.
Installation von Immich
Wähle in Container Station „Anwendung“→“Erstellen“.
Lade dir jetzt hier die docker-compose.yml von Immich herunter. Diese kann leider nicht 1:1 so verwendet werden, sondern muss etwas abgeändert werden:
- Entferne „name: immich“ am Anfang
- Füge ein „
version: '3'
“ am Anfang hinzu - Ersetze ALLE Platzhalter/Variablen durch die von dir gewählten Werte in der .env-Datei. Aus „${UPLOAD_LOCATION}“ wird also z. B. „/share/DockerData/VolumeData/immich_data_tut“.
Füge diesen Code dann in den Editor des Fensters ein und wähle einen Namen.

Wähle „Erstellen“. Das Erstellen des Containers sollte fehlschlagen, da die Datei .env noch in einem weiteren Verzeichnis erstellt werden muss.
Erstellen der permanenten .env Datei
Wechsle im Terminal (SSH-Verbindung) in das Verzeichnis, das du beim ersten Start von Container Station angegeben hast. Wechsle dort ins Verzeichnis container-station-data/application/namedeinesimmichcontainers
. Führe dort denselben Code aus, wie du es auch schon im Verzeichnis /tmp gemacht hast, um die .env Datei zu erstellen.
Installation von Immich – Teil 2
Versuche nun wieder Immich wie vorher zu installieren. Bei diesem Mal sollte es ohne Probleme funktionieren und nach einiger Zeit sollte Immich unter http://IP_DEINES_NAS:2283 erreichbar sein.
12. November 2024 um 10:49 Uhr
Hi, hier ist ein gaaanz großer Anfänger.
Ich habe meinen Docker soweit installiert und denke mal ich muss postgres ebenfalls als Docker zunächst installieren oder? Kann immich den Container so ohne weiteres finden?
Wo erstelle ich den Pfad denn intelligenterweise?
Tut mir leid für die Basicfragen – hoffe du kannst mir helfen.
Gruß,
Jay
12. November 2024 um 16:56 Uhr
Hi, die docker-compose.yml erstellt automatisch einen postgres Container, der auch schon mit dem immich Container korrekt verbunden ist. Da musst du nichts mehr extra installieren.
Die Pfade erstellst du am besten direkt auf der Oberfläche des NAS, indem du einen Freigabeordner erstellst und darin dann die weitere Ordnerstruktur, falls du das gemeint hast.
7. Oktober 2024 um 17:26 Uhr
Ich habe die docker-compose.yml so wie oben beschrieben angepasst, aber wenn ich sie validiere, gibt es haufenweise Fehlermeldungen, offenbar fehlen vor den Variablen wie :volumes etc. Leerzeichen. Wenn ich dann alle angepasst habe und validate nichts rotes mehr anzeigt, bekomme ich beim nächsten Validate die Meldung, das nur version 2 und 3 unterstützt werden. Weiter weiß ich jetzt nicht mehr, kann mir jemand den Schubs in die richtige Richtung geben? Oder eine fertige docker-compose.yml wo ich dann nur noch die Pfade und das Passwort ändern muß?
7. Oktober 2024 um 18:08 Uhr
Da hat wordpress einen Fehler gemacht. Bei version muss eine 3 in einfachen, oberen Anführungszeichen rein. In meinem Beitrag oben hat sich ein unteres Anführungszeichen verirrt. Sollte jetzt korrigiert sein.
Vor den Variablen müssen manchmal Leerzeichen rein, manchmal nicht.
19. September 2024 um 11:54 Uhr
Nun alles gut – habe die komplette Containerstation deinstalliert und neu installiert – damit hat es nun dann auf Anhieb geklapt.
War wohl was kaputt gegangen…
DANKE für deine Hilfe!
19. September 2024 um 14:12 Uhr
Freut mich, wenns bei dir geklappt hat 🙂
30. September 2024 um 7:58 Uhr
nun ergibt sich eine weitere Frage – wie machst du Updates von Immich?
Das Terminal selbst ist ja per default nicht eingehängt – es kommt darauf „You must enable the interactive (-i) and TTY (-t) processes to attach the terminal to a container.“
Als Abhilfe habe ich die Container einfach komplett entfernt und das ganze neu gestartet – klappt auch, ist halt etwas „ums Eck gedacht“ – sollte das nicht auch wo via apt-get update bzw. upgrade gehen?
(aber da bräuchte es die KKonsole – s.o. 🙂
Danke dir nochmals
lg
Michael
30. September 2024 um 18:00 Uhr
Genau so funktioniert ein Update bei Docker. Den Container neu erstellen. Evtl. gibt es da auch eine extra Funktion dafür, wo man nur kurz mit einem Klick bestätigen kann und dann der Container mit den gleichen Einstellungen neu erstellt wird? Ich hab gerade das NAS nicht zur Hand, um nachzuschauen. Aber ansonsten, ja, musst du jedes Mal neu erstellen.
Etwas im Docker-Container per Terminal zu ändern ist meist keine gute Idee, da diese Änderungen eben (durch ein neu Erstellen des Containers wegen einem Update) flüchtig sind.
apt upgrade aktualisiert keine Docker Container
12. September 2024 um 15:57 Uhr
Nachtrag zur letzten Frage:
es gibt ganz unten in der yml noch diesen Eintrag:
volumes:
model-cache:
Kann ich da was sinnvoll definieren für mein Cache-Problem???
Danke
12. September 2024 um 12:04 Uhr
so – ich hatte es nun mal liegen gelassen und heute nochmals frisch gestartet – Alles läuft nach Installation soweit fein, doch nun habe ich wieder den selben Fehler:
Die Gesichtserkennung und KI funktionieren nicht – es kommt immer im Container immich-machine-learning die Fehlermeldung
WARNING Versuch, den Cache für das Modell ‚buffalo_l‘ zu löschen, aber
das Cache-Verzeichnis existiert nicht
–> in der docker-compose.yml steht ja auch unter
immich-machine-learning:
volumes:
– model-cache:/cache
was auch immer ich dort definiere bzw. hineinschreibe – es funktioniert nicht.
Gebe ich dort auch ein share an, z.b.
model-cache:/share/Container/immich/daten dann klappt das Erstellen des Stacks gar nicht…
Wo muss am QNAP-NAS dieser cache liegen, bzw. wie kann ich den in der .yml definieren, damit auch die Gesichtserkennung bei immich funktioniert?
Wäre so ein tolles Tool und endlich weg von Google-Cloud mit den Fotos, doch ist für mich diese Suche essentiell 🙁
Danke & LG
Michael
12. September 2024 um 14:19 Uhr
Hallo Michael,
Dein Ansatz war richtig – aber falsch herum. Links steht der Pfad auf dem Host, rechts der im Container. Es müsste wenn dann also
/share/Container/immich/daten:/cache
sein. Der Pfad auf dem NAS sollte sich von dem der Datenbank und dem der Fotos unterscheiden. Da wird dann nur das KI-Modell zwischengespeichert.
12. September 2024 um 15:02 Uhr
danke – habe das angepasst und in die YML für machine-learning das adaptiert:
– /share/Container/immich/cache:/cache
– nun gibt es ein weiteres Volume in der Diskstation, doch das hat status „unbenutzt“.
Und das log vom machine-learning sagt immer noch dasselbe:
[09/12/24 14:57:30] INFO Downloading detection model ‚buffalo_l‘. This may
take a while.
[09/12/24 14:57:40] WARNING Failed to load detection model ‚buffalo_l‘.
Clearing cache.
[09/12/24 14:57:40] WARNING Attempted to clear cache for model ‚buffalo_l‘, but
cache directory does not exist
Noch eine Idee?
Danke dir…
LG Michael
12. September 2024 um 21:18 Uhr
Anscheinend hat das etwas mit der IP des Machine Learning Containers zu tun, siehe: https://www.reddit.com/r/immich/comments/19a2fii/unable_to_set_up_facial_recognition_unraid_docker/
Den Zusammenhang verstehe ich aber nicht ganz.
Dadurch, dass du den Pfad zum Cache Ordner direkt angegeben hast, kannst du den gesamten unteren Teil („volumes“) weglassen.
17. September 2024 um 8:32 Uhr
mit IP 0.0.0.0 sprach es bei mir im LOG gar nicht mehr an im immich_machine_learning – nix mehr im LOG.
Habe nun ganz unten im YML lt. deiner Beschreibung die beiden Zeilen auskommentiert:
# volumes:
# model-cache:
-> brachte auch keine Änderung.
Hier das log:
[09/17/24 08:28:01] INFO Waiting for application startup.
[09/17/24 08:28:01] INFO Created in-memory cache with unloading after 300s
of inactivity.
[09/17/24 08:28:01] INFO Initialized request thread pool with 4 threads.
[09/17/24 08:28:01] INFO Application startup complete.
[09/17/24 08:28:23] INFO Downloading detection model ‚buffalo_l‘. This may
take a while.
[09/17/24 08:28:33] INFO Downloading detection model ‚buffalo_l‘. This may
take a while.
[09/17/24 08:28:33] WARNING Failed to load detection model ‚buffalo_l‘.
Clearing cache.
[09/17/24 08:28:33] WARNING Attempted to clear cache for model ‚buffalo_l‘, but
cache directory does not exist
[09/17/24 08:28:43] WARNING Failed to load detection model ‚buffalo_l‘.
Clearing cache.
[09/17/24 08:28:43] WARNING Attempted to clear cache for model ‚buffalo_l‘, but
cache directory does not exist
das log am immich_server zeigt mir dabei dies an:
[Nest] 7 – 09/17/2024, 8:28:43 AM ERROR [Microservices:JobService] Unable to run job handler (faceDetection/face-detection): Error: Machine learning request ‚{„facial-recognition“:{„detection“:{„modelName“:“buffalo_l“,“options“:{„minScore“:0.7}},“recognition“:{„modelName“:“buffalo_l“}}}‘ failed with status 500: Internal Server Error
[Nest] 7 – 09/17/2024, 8:28:43 AM ERROR [Microservices:JobService] Error: Machine learning request ‚{„facial-recognition“:{„detection“:{„modelName“:“buffalo_l“,“options“:{„minScore“:0.7}},“recognition“:{„modelName“:“buffalo_l“}}}‘ failed with status 500: Internal Server Error
at MachineLearningRepository.predict (/usr/src/app/dist/repositories/machine-learning.repository.js:22:19)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async MachineLearningRepository.detectFaces (/usr/src/app/dist/repositories/machine-learning.repository.js:33:26)
at async PersonService.handleDetectFaces (/usr/src/app/dist/services/person.service.js:283:52)
at async /usr/src/app/dist/services/job.service.js:148:36
at async Worker.processJob (/usr/src/app/node_modules/bullmq/dist/cjs/classes/worker.js:394:28)
at async Worker.retryIfFailed (/usr/src/app/node_modules/bullmq/dist/cjs/classes/worker.js:581:24)
[Nest] 7 – 09/17/2024, 8:28:43 AM ERROR [Microservices:JobService] Object:
Danke nochmals – ich stehe voll an…
17. September 2024 um 19:29 Uhr
Vielleicht ein Rechte-Problem. Du könntest mal im Terminal versuchen:
chmod 777 /pfad/zum/immich/model/cache
Ansonsten bin ich leider ratlos…
3. September 2024 um 19:53 Uhr
wie müsste man machen für updates?
einzelne container redeployen?
3. September 2024 um 19:58 Uhr
Das müsste gehen. Wobei man denke ich auch die ganze Anwendung redeployen können müsste. Hab ich grad nicht mehr im Kopf.
24. August 2024 um 9:47 Uhr
habe nun händisch gesucht und die YML angepasst:
image: ghcr.io/immich-app/immich-server:pr-11927
image: ghcr.io/immich-app/immich-machine-learning:pr-11927
klappt aber leider noch immer nicht – das log sagt es fehlen ihm die ENV-Werte
FRAGE: du schreibst wechsle ins /TMP verzeichnis:
Welches ist da gemeint: direkt am NAS via SSH auf /TMP oder unter /share/Container/container-station-data/tmp ????
Da kann ich ja auch via Filestation hingehen und die Datei direkt von einem anderen Ort wo ich sie anlegte dort hinkopieren – erspart mir das Gezicker mit dem SSH.
UND: im SSH gäbe es auch den VI-Editor …
25. August 2024 um 16:22 Uhr
Zu deiner Frage: Es ist tatsächlich /tmp gemeint. Deswegen braucht es auch SSH.
Zum Thema vi: Lässt sich ohne Einarbeitung leider überhaupt nicht nutzen. Wenn man das mal drauf hat, ist es bestimmt ein mächtiges Tool. Mir reicht aber meistens nano. Da der bei qnap nicht vorinstalliert ist, eben der Umweg mit echo.
Zu deiner vorherigen Nachricht: Du musst alle Umgebungsvariablen in der docker compose ersetzen. Bei ${IMMICH_VERSION:-release} reicht es, wenn du diesen Teil einfach ganz entfernst, da hier „release“ der Standard ist und das „release“ wie oben zu sehen gelöscht wird.
2. September 2024 um 21:26 Uhr
wie müsste die Zeile bzw. Zeilen aussehen?
danke
2. September 2024 um 21:32 Uhr
ok.. auch den : noch mit entfernen dann gibt es keinen error der Datei.. aber dann habe ich das:
Failed to create application „immich-app“.
Error message: failed to pull image ghcr.io/immich-app/immich-machine-
learning Error response from daemon:
manifest unknown]
2. September 2024 um 22:31 Uhr
Versuch mal, „release“ statt ${IMMICH_VERSION:-release} einzusetzen
3. September 2024 um 9:01 Uhr
damit schaut es mal besser aus…
melde mich wieder wie es ausging…
3. September 2024 um 9:17 Uhr
damit hat es nun wunderbar geklappt
DANKE !!
3. September 2024 um 12:02 Uhr
Freut mich, wenns bei dir geklappt hat
7. Oktober 2024 um 17:21 Uhr
statt „nano“ verwende ich „joe“, der ist fast befehls-/tastenkompatibel
7. Oktober 2024 um 18:02 Uhr
Interessant. Was ist der Vorteil von joe gegenüber nano?
24. August 2024 um 8:59 Uhr
Ich erhalte leider beim Erstellen (auch nach Ablage der tmp-files) immer diese Fehlermeldung:
Failed to create application „immich-2“. Error message: failed to pull image ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}[invalid reference format]
21. Juli 2024 um 16:24 Uhr
meine „.env“ datei ist unter „/tmp“ gespeichert, aber ich erhalte beim erstellen vom container die meldung dass die env datei nicht gefunden werden kann. er sucht sie natürlich im container docker. allerdings dort in: „container-station-data/tmp/tmpEbgKhz/compose/.env“
den pfad gibt es aber wohl wirklich nur ganz kurz während er versucht die anwendung zu erstellen, danach ist er weg.
musste übrigens in der yml „start_interval“ in „interval“ ändern, da es dass attribut in version 3 so nicht mehr gibt, für alle nachfolgdenden leser 🙂
21. Juli 2024 um 16:29 Uhr
Danke für die Hinweise 🙂
21. Juli 2024 um 17:11 Uhr
der erste teil war eher eine frage, weil ich die env nicht in den unterordner der temporär erstellt wird reinkopieren kann, der wird für 1-2 sekunden erstellt und ist dann wieder weg wenn die fehlermeldung erscheint. hast du einen tipp?
21. Juli 2024 um 17:42 Uhr
Das Erstellen des Containers SOLL ja fehlschlagen, bzw. so ist es oben beschrieben. Dabei wird aber der Ordner „container-station-data/application/namedeinesimmichcontainers“ erstellt, bei dem man dann die .env Datei nochmal erstellen muss.
Bei dem zweiten Versuch, den Container zu erstellen, sollte dann alles klappen.
So war es zumindest bei mir.
Vielleicht gab es auch ein Update und das funktioniert jetzt anders…
21. Juli 2024 um 17:57 Uhr
ja, leider wird der ordner nicht erstellt. applications bleibt leer
22. Juli 2024 um 14:51 Uhr
So sollte das natürlich nicht sein. Ich nehme an der Ordner „container-station-data/tmp/tmpEbgKhz/compose/.env“
ist Zufalls-generiert, also immer anders? Sonst könnte man ja den Ordner vorher erstellen und da die Datei reinpacken.
22. Juni 2024 um 20:09 Uhr
Thanks a lot for this tutorial, I have been looking for a while for some help to install Immich on Qnap Container Station! It is now up an running. Did you try to enable hardware acceleration for transcoding or machine learning?
23. Juni 2024 um 7:46 Uhr
Hi, thanks for your comment.
I’ve not changed anything from default configuration. Machine learning and transcoding works just fine.