Русский
Начать

← Все шаблоны · Медиа

Задеплойте Immich в один клик

Ваши фото и видео с бэкапом с телефона, умным поиском, распознаванием лиц и альбомами

Альтернатива Google Photos и iCloud Photos на вашей машине.

Что такое Immich?

Immich — self-hosted библиотека фото и видео, которую запускают вместо Google Photos или iCloud Photos. Его приложения для iPhone и Android в фоне делают бэкап фотопленки, а веб-интерфейс и приложения показывают все на одной временной шкале, с альбомами, избранным, архивом, картой мест, где снято каждое фото, и воспоминаниями о том же дне в прошлые годы.

Машинное обучение, которое работает внутри Immich и ничего не отправляет в облачные сервисы, находит людей на фото и группирует их лица, читает текст на изображениях и работает в умном поиске, который находит фото по словам вроде «собака на пляже». Immich хранит RAW-файлы, Live Photos и фото с движением, делится альбомами или ссылками с кем угодно и дает партнеру доступ к вашей библиотеке. У каждого человека на сервере свой аккаунт.

Этот шаблон запускает сервер Immich, его машинное обучение, Valkey и его PostgreSQL с нужными ему векторными расширениями, а библиотеку хранит в томе. Администратор создается из почты и пароля, которые вы указываете, еще до того, как Immich начнет кому-либо отвечать, а публичные ссылки получают адрес проекта. Immich требует минимум 6 GB памяти и 2 ядра, поэтому подходит для тарифа Grow; диск занимают ваши фото, так что следите за его заполнением по мере роста библиотеки.

Хостинг Immich на Pethost

  1. Вы входите в Pethost — с passkey, через GitHub или Google. Машины еще нет? Вы выбираете тариф, и ссылка ждет, пока машина не будет готова.
  2. Окно «Новый проект» открывается на приложении Immich. Вы заполняете то, что оно просит, и нажимаете «Создать проект»: Электронная почта, Пароль администратора.
  3. Через минуту-две Immich работает по своему адресу с HTTPS. Секреты создаются случайно, а данные попадают в ночной бэкап.
  4. Это проект как любой другой: вы или ваш агент можете его изменить, откатить или восстановить.

Вопросы про Immich

Immich бесплатный?

Да. Immich распространяется с открытым кодом под лицензией AGPL-3.0, и его авторы говорят, что все функции бесплатны навсегда и ничего не спрятано за пейволлом. Купить его можно для себя или для сервера, чтобы поддержать проект, но ничего дополнительно это не открывает.

Как сделать бэкап фото с телефона в Immich?

Установите приложение Immich из App Store или Google Play, укажите адрес вашего Immich как «URL-адрес сервера», войдите и включите «Резервное копирование» для выбранных альбомов. Приложение загружает новые фото и видео в фоне и пропускает то, что уже есть на сервере.

Распознает ли Immich лица?

Да. Его машинное обучение, которое работает внутри Immich и никуда не отправляет ваши фото, находит лица на каждом фото и группирует их в разделе «Люди», где вы даете им имена. Оно также читает текст на изображениях, а умный поиск находит фото по тому, что на них изображено.

Сколько памяти и места на диске нужно Immich?

Immich требует минимум 6 GB памяти и 2 ядра, а здесь занимает около 1,5 GB в простое, около 2,5 GB, пока машинное обучение обрабатывает новые фото, и больше при первой загрузке, когда скачивает свои модели. На диске лежат ваши оригиналы плюс миниатюры и перекодированные видео, так что закладывайте больше места, чем занимает сама библиотека.

Безопасно ли хранить в Immich единственную копию фото?

Сам Immich советует держать для важных фото бэкап по схеме 3-2-1: три копии на двух типах носителей, одна из них в другом месте. Pethost каждую ночь делает бэкап томов проекта, а Immich еще и сам делает дампы своей базы данных; храните оригиналы где-нибудь еще.

Сколько памяти и диска нужно Immich?

Immich в простое расходует около 1,5 GB памяти вместе с базой данных и машинным обучением, около 2,5 GB, пока обрабатывает новые фото, и больше при первой загрузке, когда скачивает свои модели; диск занимает ваша библиотека плюс ее миниатюры и видео. На Pethost ему хватит тарифа Grow, и рядом останется место для других приложений.

Immich: файл Docker Compose

Шаблон — это этот compose.yaml и переменные, которые пишутся в .env проекта при его создании. Pethost запускает файл так, как он написан.

Контейнеры: 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).

Тома, в ночном бэкапе: 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:

Еще в категории «Медиа»