Задеплойте 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
- Вы входите в Pethost — с passkey, через GitHub или Google. Машины еще нет? Вы выбираете тариф, и ссылка ждет, пока машина не будет готова.
- Окно «Новый проект» открывается на приложении Immich. Вы заполняете то, что оно просит, и нажимаете «Создать проект»: Электронная почта, Пароль администратора.
- Через минуту-две Immich работает по своему адресу с HTTPS. Секреты создаются случайно, а данные попадают в ночной бэкап.
- Это проект как любой другой: вы или ваш агент можете его изменить, откатить или восстановить.
Вопросы про 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:
Еще в категории «Медиа»
- OwncastПрямые трансляции и чат на собственной странице
- NavidromeМузыкальный сервер, который стримит вашу собственную коллекцию
- RomMБиблиотека и плеер в браузере для ваших ретро-игр
- KomgaСервер и веб-читалка для ваших комиксов, манги и электронных книг
- LycheeФотогалерея, чтобы загружать, упорядочивать и показывать ваши фото
- AudiobookshelfСобственный сервер аудиокниг и подкастов: слушайте в браузере или приложениях, прогресс сохраняется на всех устройствах