Polski
Zacznij

← Wszystkie szablony · Multimedia

Wdróż Immich jednym kliknięciem

Twoje zdjęcia i filmy, z backupem prosto z telefonu, inteligentnym wyszukiwaniem, rozpoznawaniem twarzy i albumami

Alternatywa dla Google Photos i iCloud Photos, hostowana u siebie.

Czym jest Immich?

Immich to hostowana u siebie biblioteka zdjęć i filmów, której ludzie używają zamiast Google Photos albo iCloud Photos. Jego aplikacje na iPhone’a i Androida robią w tle backup zdjęć z aparatu, a strona internetowa i aplikacje pokazują wszystko na jednej osi czasu, z albumami, ulubionymi, archiwum, mapą miejsc, w których zrobiono każde zdjęcie, i wspomnieniami z tego samego dnia w poprzednich latach.

Uczenie maszynowe, które działa w samym Immich i niczego nie wysyła do usług w chmurze, znajduje osoby na zdjęciach i grupuje ich twarze, czyta tekst na obrazach i napędza inteligentne wyszukiwanie, które znajduje zdjęcie po słowach takich jak „pies na plaży”. Immich przechowuje pliki RAW, Live Photos i zdjęcia ruchome, udostępnia albumy albo linki komu chcesz, a dzięki funkcji „Dzielenie z partnerami” druga osoba może oglądać twoją bibliotekę. Każda osoba na serwerze ma własne konto.

Ten szablon uruchamia serwer Immich, jego uczenie maszynowe, Valkey i jego PostgreSQL z potrzebnymi rozszerzeniami wektorowymi, a bibliotekę trzyma na wolumenie. Administrator powstaje z e-maila i hasła, które podajesz, zanim Immich komukolwiek odpowie, a udostępnione linki dostają adres projektu. Immich wymaga co najmniej 6 GB pamięci i 2 rdzeni, dlatego mieści się w planie Grow; zdjęcia zajmują dysk, więc pilnuj, ile zostało na nim miejsca, gdy biblioteka rośnie.

Hosting Immich na Pethost

  1. Logujesz się do Pethost kluczem dostępu, przez GitHub albo Google. Nie masz jeszcze maszyny? Wybierasz plan, a link czeka, aż będzie gotowa.
  2. Okno „Nowy projekt” otwiera się na aplikacji Immich. Wypełniasz to, o co prosi, i klikasz „Utwórz projekt”: E-mail, Hasło administratora.
  3. Za minutę czy dwie aplikacja Immich działa pod własnym adresem z HTTPS. Jej sekrety są tworzone losowo, a dane trafiają do nocnego backupu.
  4. To projekt jak każdy inny: ty albo twój agent możecie go zmienić, cofnąć do wcześniejszej wersji albo przywrócić.

Pytania o Immich

Czy Immich jest darmowy?

Tak. Immich to open source na licencji AGPL-3.0, a jego twórcy mówią, że wszystkie funkcje są darmowe na zawsze i nic nie jest ukryte za paywallem. Możesz go kupić dla siebie albo dla serwera, żeby wesprzeć projekt, ale niczego więcej to nie odblokowuje.

Jak zrobić backup zdjęć z telefonu do Immich?

Zainstaluj aplikację Immich z App Store albo Google Play, podaj adres swojego Immich jako „URL Serwera”, zaloguj się i włącz kopię zapasową dla wybranych albumów. Aplikacja wgrywa nowe zdjęcia i filmy w tle i pomija to, co już jest na serwerze.

Czy Immich rozpoznaje twarze?

Tak. Jego uczenie maszynowe, które działa w samym Immich i nigdzie nie wysyła twoich zdjęć, wykrywa twarze na każdym zdjęciu i grupuje je w zakładce „Osoby”, gdzie nadajesz im imiona. Czyta też tekst na obrazach, a inteligentne wyszukiwanie znajduje zdjęcia po tym, co na nich jest.

Ile pamięci i miejsca na dysku potrzebuje Immich?

Immich wymaga co najmniej 6 GB pamięci i 2 rdzeni, a tutaj zajmuje około 1,5 GB w spoczynku, około 2,5 GB, gdy uczenie maszynowe przetwarza nowe zdjęcia, a przy pierwszym wgraniu, gdy pobiera swoje modele, jeszcze więcej. Na dysku są oryginały plus miniatury i transkodowane filmy, więc zaplanuj więcej miejsca, niż zajmuje sama biblioteka.

Czy Immich jest bezpieczny dla jedynej kopii moich zdjęć?

Sam Immich zaleca backup 3-2-1 zdjęć, na których ci zależy: trzy kopie na dwóch rodzajach nośników, w tym jedna w innym miejscu. Pethost robi backup wolumenów projektu co noc, a Immich sam robi też dumpy swojej bazy danych; trzymaj oryginały również gdzie indziej.

Ile pamięci i miejsca na dysku potrzebuje Immich?

Immich w spoczynku zajmuje razem z bazą danych i uczeniem maszynowym około 1,5 GB pamięci, podczas przetwarzania nowych zdjęć około 2,5 GB, a przy pierwszym wgraniu, gdy pobiera swoje modele, jeszcze więcej; dysk to twoja biblioteka plus jej miniatury i filmy. Na Pethost wystarczy mu plan Grow, z miejscem na inne aplikacje obok.

Immich: plik Docker Compose

Szablon to ten compose.yaml i zmienne zapisywane do .env projektu przy jego tworzeniu. Pethost uruchamia plik dokładnie tak, jak jest napisany.

Kontenery: 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).

Wolumeny, w nocnym backupie: 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:

Więcej w kategorii Multimedia