Deutsch
Loslegen

← Alle Vorlagen · Medien

Immich mit einem Klick deployen

Deine Fotos und Videos, vom Handy gesichert, mit intelligenter Suche, Gesichtserkennung und Alben

Eine selbst gehostete Alternative zu Google Photos und iCloud Photos.

Was ist Immich?

Immich ist eine selbst gehostete Foto- und Videobibliothek, die viele statt Google Photos oder iCloud Photos betreiben. Die Apps für iPhone und Android sichern die Kamerarolle im Hintergrund, und die Weboberfläche und die Apps zeigen alles auf einer Zeitleiste, mit Alben, Favoriten, einem Archiv, einer Karte, die zeigt, wo jedes Foto aufgenommen wurde, und Erinnerungen an denselben Tag in früheren Jahren.

Machine Learning, das in Immich selbst läuft und nichts an einen Cloud-Dienst schickt, findet die Personen auf deinen Fotos und gruppiert ihre Gesichter, liest Text in Bildern und steckt hinter der intelligenten Suche, die ein Foto anhand von Wörtern wie „Hund am Strand“ findet. Immich bewahrt RAW-Dateien, Live Photos und bewegte Fotos auf, teilt Alben oder Links, mit wem du willst, und lässt per „Partner-Sharing“ eine weitere Person deine Bibliothek sehen. Jede Person auf dem Server hat ein eigenes Konto.

Diese Vorlage betreibt den Server von Immich, sein Machine Learning, Valkey und sein PostgreSQL mit den nötigen Vektorerweiterungen, die Bibliothek in einem Volume. Der Admin wird aus der E-Mail-Adresse und dem Passwort angelegt, die du angibst, bevor Immich irgendwem antwortet, und geteilte Links bekommen die Adresse des Projekts. Immich verlangt mindestens 6 GB RAM und 2 Kerne und passt damit in den Tarif Grow; deine Fotos belegen die Disk, behalte also im Blick, wie voll sie wird, während die Bibliothek wächst.

Immich-Hosting auf Pethost

  1. Du meldest dich bei Pethost an, mit Passkey, GitHub oder Google. Noch keine Maschine? Du wählst einen Tarif, und der Link wartet, bis sie bereit ist.
  2. „Neues Projekt“ öffnet sich bei Immich. Du füllst aus, was die App braucht, und klickst auf „Projekt erstellen“: E-Mail, Admin-Passwort.
  3. In ein, zwei Minuten läuft Immich unter eigener Adresse mit HTTPS. Die Secrets werden zufällig erzeugt, und die Daten sind im nächtlichen Backup.
  4. Es ist ein Projekt wie jedes andere: Du oder dein Agent könnt es ändern, zurückrollen oder wiederherstellen.

Fragen zu Immich

Ist Immich kostenlos?

Ja. Immich ist Open Source unter der AGPL-3.0-Lizenz, und laut dem Team dahinter sind alle Funktionen für immer kostenlos, ohne Paywall. Du kannst Immich für dich oder für einen Server kaufen, um das Projekt zu unterstützen, schaltest damit aber nichts weiter frei.

Wie sichere ich die Fotos von meinem Handy in Immich?

Installier die Immich-App aus dem App Store oder von Google Play, gib die Adresse deines Immich als „Server-URL“ an, melde dich an und schalte die „Sicherung“ für die Alben ein, die du auswählst. Die App lädt neue Fotos und Videos im Hintergrund hoch und überspringt, was schon da ist.

Erkennt Immich Gesichter?

Ja. Das Machine Learning, das in Immich selbst läuft und deine Fotos nirgendwohin schickt, erkennt die Gesichter auf jedem Foto und gruppiert sie unter „Personen“, denen du Namen gibst. Es liest auch Text in Bildern, und die intelligente Suche findet Fotos anhand dessen, was darauf zu sehen ist.

Wie viel RAM und Disk braucht Immich?

Immich verlangt mindestens 6 GB RAM und 2 Kerne und braucht hier im Ruhezustand etwa 1,5 GB, etwa 2,5 GB, während das Machine Learning neue Fotos verarbeitet, und mehr beim ersten Upload, wenn es seine Modelle herunterlädt. Auf der Disk liegen deine Originale plus Vorschaubilder und transcodierte Videos, plan also mehr Platz ein, als die Bibliothek selbst groß ist.

Ist Immich sicher genug für die einzige Kopie meiner Fotos?

Immich selbst rät zu einem 3-2-1-Backup für Fotos, die dir wichtig sind: drei Kopien auf zwei Arten von Datenträgern, eine davon an einem anderen Ort. Pethost sichert die Volumes des Projekts jede Nacht, und Immich erstellt zusätzlich selbst Dumps seiner Datenbank; bewahr die Originale trotzdem auch woanders auf.

Wie viel RAM und Speicherplatz braucht Immich?

Immich braucht mit Datenbank und Machine Learning im Ruhezustand etwa 1,5 GB RAM, etwa 2,5 GB, während es neue Fotos verarbeitet, und mehr beim ersten Upload, wenn es seine Modelle herunterlädt; die Disk ist deine Bibliothek plus deren Vorschaubilder und Videos. Auf Pethost reicht dafür der Tarif Grow, mit Platz für weitere Apps daneben.

Immich: die Docker-Compose-Datei

Die Vorlage ist diese compose.yaml und die Variablen, die beim Erstellen in die .env des Projekts geschrieben werden. Pethost führt die Datei so aus, wie sie geschrieben ist.

Container: immich-server (ghcr.io/immich-app/immich-server:v3), immich-machine-learning (ghcr.io/immich-app/immich-machine-learning:v3), redis (valkey/valkey:9), database (ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0).

Volumes, im nächtlichen Backup: library, db, model-cache.

services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:v3
    restart: unless-stopped
    environment:
      DB_HOSTNAME: database
      DB_USERNAME: postgres
      DB_PASSWORD: ${DB_PASSWORD}
      DB_DATABASE_NAME: immich
      REDIS_HOSTNAME: redis
      TZ: ${TZ:-Etc/UTC}
      URL: ${URL}
      ADMIN_EMAIL: ${ADMIN_EMAIL}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
    # A new Immich makes whoever opens it first its administrator. So its first start runs it on
    # port 2284, which nobody reaches, signs the administrator up there with the email and password
    # given, and sets the address shared links use; only then does Immich answer on 2283.
    command:
      - |
        set -e
        if [ ! -f /data/.pethost-admin ]; then
          # In a process group of its own, so that its workers stop with it.
          IMMICH_PORT=2284 setsid start.sh &
          setup=$$!
          SETUP_PID=$$setup node -e '
            const base = "http://127.0.0.1:2284/api";
            const { URL: url, ADMIN_EMAIL: email, ADMIN_PASSWORD: password } = process.env;
            const json = { "content-type": "application/json" };
            const call = async (path, options) => {
              const response = await fetch(base + path, options);
              if (!response.ok) throw new Error(path + ": " + response.status + " " + (await response.text()));
              return response.json();
            };
            const setUp = async () => {
              const { isInitialized } = await call("/server/config");
              if (isInitialized) return;
              const name = email.split("@")[0];
              await call("/auth/admin-sign-up", { method: "POST", headers: json, body: JSON.stringify({ email, password, name }) });
              const { accessToken } = await call("/auth/login", { method: "POST", headers: json, body: JSON.stringify({ email, password }) });
              const headers = { ...json, authorization: "Bearer " + accessToken };
              const config = await call("/system-config", { headers });
              config.server.externalDomain = url;
              await call("/system-config", { method: "PUT", headers, body: JSON.stringify(config) });
            };
            (async () => {
              let failure;
              for (let i = 0; i < 300; i++) {
                // Immich stops if it cannot start: the container starts again and so does this.
                try {
                  process.kill(Number(process.env.SETUP_PID), 0);
                } catch {
                  process.exit(1);
                }
                try {
                  return await setUp();
                } catch (error) {
                  failure = error;
                  await new Promise((done) => setTimeout(done, 1000));
                }
              }
              console.error(failure);
              process.exit(1);
            })();
          '
          kill -- -$$setup
          wait $$setup || true
          while kill -0 -- -$$setup 2>/dev/null; do sleep 1; done
          touch /data/.pethost-admin
        fi
        unset ADMIN_PASSWORD
        exec start.sh
    volumes:
      - library:/data
    depends_on:
      redis:
        condition: service_started
      database:
        condition: service_healthy
    # Its first start makes the database and the administrator before it answers on 2283.
    healthcheck:
      test: ["CMD-SHELL", "immich-healthcheck"]
      interval: 30s
      start_period: 10m
      start_interval: 5s

  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:v3
    restart: unless-stopped
    volumes:
      - model-cache:/cache

  redis:
    image: valkey/valkey:9
    restart: unless-stopped
    healthcheck:
      test: redis-cli ping | grep -q PONG || exit 1

  database:
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    restart: unless-stopped
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: --data-checksums
    shm_size: 128mb
    volumes:
      - db:/var/lib/postgresql/data

volumes:
  library:
  db:
  model-cache:

Mehr in Medien