Задеплойте 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 — з ключем доступу, через GitHub або Google. Машини ще немає? Ви обираєте тариф, і посилання чекає, доки машина не буде готова.
- Вікно «Новий проєкт» відкривається на застосунку Immich. Ви заповнюєте те, що він просить, і натискаєте «Створити проєкт»: Електронна пошта, Пароль адміністратора.
- За хвилину-дві Immich працює за власною адресою з HTTPS. Секрети створюються випадково, а дані потрапляють у щонічний бекап.
- Це проєкт як будь-який інший: ви або ваш агент можете його змінити, відкотити або відновити.
Питання про Immich
Immich безкоштовний?
Так. Immich має відкритий код за ліцензією AGPL-3.0, і його автори кажуть, що всі функції безкоштовні назавжди й нічого не сховано за пейволом. Купити його можна для себе або для сервера, щоб підтримати проєкт, але нічого додаткового це не відкриває.
Як зробити бекап фото з телефона в Immich?
Установіть застосунок Immich з App Store або Google Play, укажіть адресу свого Immich у полі «Адреса сервера», увійдіть і ввімкніть «Резервне копіювання» для вибраних альбомів. Застосунок завантажує нові фото й відео у фоні та пропускає те, що вже є на сервері.
Чи розпізнає 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Власний сервер аудіокниг і подкастів: слухайте в браузері чи застосунках, прогрес зберігається на всіх пристроях