Установка IMMICH в LXC контейнер Proxmox

Добрый день.

Простейшая инструкция по установке IMMICH.

От создания контейнера, до запуска в браузере.

Просто копируйте команды и запускайте.

По времени 30 минут с кофейком.

Справится любой.

https://disk.yandex.ru/i/w94YmdWWnoADcQ

Полная инструкция по установке Immich в LXC-контейнер Debian на Proxmox

:package: Часть 1: Создание LXC-контейнера в Proxmox

1.1 Создание контейнера

1.1 Создание контейнера

  1. Войдите в веб-интерфейс Proxmox (https://ваш-ip:8006)
  2. В правом верхнем углу нажмите “Create CT”
  3. Заполните параметры на вкладке “General” :
  • Node : выберите ваш сервер
  • CT ID : например, 200 (запомните этот номер)
  • Hostname : immich-server
  • Password : установите надежный пароль для root
  • Confirm Password : повторите пароль
  1. На вкладке “Template” :
  • Storage : выберите ваше хранилище
  • Template : выберите debian-12-standard
  1. Нажмите “Next”

1.2 Настройка диска

  1. Disk size : установите минимум 20 GB (рекомендуется 50+ GB)
  2. Нажмите “Next”

1.3 Настройка CPU

  1. Cores : установите минимум 2 ядра (рекомендуется 4)
  2. Нажмите “Next”

1.4 Настройка памяти

  1. Memory : установите минимум 4096 MB (рекомендуется 8192 MB)
  2. Нажмите “Next”

1.5 Настройка сети

  1. IPv4 : выберите DHCP или Static
  • Если Static, укажите IP-адрес, например: 192.168.1.100/24
  • Gateway: 192.168.1.1
  1. Нажмите “Next” , затем “Finish”

Контейнер создастся за 1-2 минуты.

1.6 КРИТИЧЕСКИ ВАЖНЫЕ настройки безопасности

Эти настройки необходимы для работы Docker внутри LXC:

  1. Остановите созданный контейнер :
  • В Proxmox найдите контейнер immich-server (200)
  • Нажмите “Stop” и дождитесь остановки
  1. Настройте Features :
  • Откройте контейнер → “Options”“Features”
  • Нажмите “Edit”
  • Установите флажки:
    • ✓ nesting: 1
    • ✓ keyctl: 1
  • Нажмите “OK”
  1. Добавьте настройку AppArmor :
  • Войдите на хост Proxmox через SSH или консоль
  • Выполните команду (замените 200 на ваш CT ID):

bash

nano /etc/pve/lxc/200.conf

  1. Добавьте в конец файла строку :

bash

lxc.apparmor.profile: unconfined

  1. Сохраните файл : Ctrl+X, затем Y, затем Enter
  • Запустите контейстер обратно :
    2. В Proxmox нажмите “Start” на контейнере
    3. Дождитесь полной загрузки (30-60 секунд)

:penguin: Часть 2: Настройка LXC-контейнера Debian

2.1 Вход в контейнер

2.1 Вход в контейнер

  1. Откройте консоль контейнера :
  • В Proxmox выберите контейнер immich-server
  • Нажмите “Console”“Open terminal”

ИЛИ

  1. Подключитесь по SSH :
  • Узнайте IP-адрес контейнера в Proxmox (в разделе сеть)
  • С вашего компьютера:

bash

ssh root@IP-АДРЕС-КОНТЕЙНЕРА

  1. Введите пароль, установленный при создании контейнера

2.2 Обновление системы

bash

# Обновите список пакетов

apt update

# Обновите установленные пакеты

apt upgrade -y

# Установите необходимые утилиты

apt install -y curl wget nano sudo gnupg software-properties-common

2.3 Установка Docker

bash

# Скачайте скрипт установки Docker

curl -fsSL https://get.docker.com -o get-docker.sh

# Запустите скрипт установки

sh get-docker.sh

# Добавьте текущего пользователя в группу docker

usermod -aG docker $USER

# Чтобы изменения вступили в силу, выйдите и зайдите обратно

exit

Войдите в контейнер снова (через консоль Proxmox или SSH).

2.4 Установка Docker Compose

bash

# Установите Docker Compose plugin

apt install -y docker-compose-plugin

# Проверьте установку

docker --version

docker compose version

Должны отобразиться версии Docker и Docker Compose.

:rocket: Часть 3: Подготовка Immich

3.1 Создание рабочей директории

Спойлер

bash

# Создайте директорию для Immich

mkdir -p /opt/immich-app

# Перейдите в директорию

cd /opt/immich-app

3.2 Загрузка файлов конфигурации

bash

# Скачайте docker-compose.yml

wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

# Скачайте файл переменных окружения

wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

3.3 Настройка файла переменных окружения

bash

# Откройте файл для редактирования

nano .env

В файле .env измените следующие строки:

  1. Установите часовой пояс (раскомментируйте строку):

text

TZ=Europe/Moscow

Замените Europe/Moscow на ваш часовой пояс

  1. ОБЯЗАТЕЛЬНО измените пароль базы данных :

text

DB_PASSWORD=ВашНадежныйПароль123

Используйте только буквы A-Z, a-z и цифры 0-9, без спецсимволов

  1. Проверьте пути хранения данных (оставьте по умолчанию или измените):

text

UPLOAD_LOCATION=./library

DB_DATA_LOCATION=./postgres

Сохраните файл : Ctrl+X, затем Y, затем Enter.

3.4 Создание директорий для данных

bash

# Создайте директории для данных

mkdir -p /opt/immich-app/library

mkdir -p /opt/immich-app/postgres

# Проверьте создание

ls -la

Должны отобразиться: .env, docker-compose.yml, library/, postgres/

:wrench: Часть 4: Запуск Immich

4.1 Запуск контейнеров

Спойлер

bash

# Убедитесь, что вы в директории /opt/immich-app

cd /opt/immich-app

# Запустите контейнеры в фоновом режиме

docker compose up -d

4.2 Проверка запуска

bash

# Проверьте статус контейнеров

docker compose ps

Должны отобразиться 4 контейнера:

  1. immich_redis - статус Running
  2. immich_postgres - статус Running
  3. immich_machine_learning - статус Running
  4. immich_server - статус Running и порт 2283

4.3 Если контейнеры не запускаются

bash

# Просмотрите логи для диагностики

docker compose logs

# Если видите ошибку прав, перезапустите контейнеры

docker compose down

docker compose up -d

:globe_with_meridians: Часть 5: Доступ к веб-интерфейсу

Спойлер

5.1 Определение IP-адреса

bash

# Узнайте IP-адрес контейнера

ip addr show eth0

Пример вывода:

text

inet 192.168.1.100/24

Ваш IP-адрес: 192.168.1.100

5.2 Проверка работы веб-сервера

bash

# Проверьте, отвечает ли веб-сервер

curl -I http://localhost:2283

Должен быть ответ:

text

HTTP/1.1 200 OK

5.3 Открытие Immich в браузере

  1. На вашем компьютере откройте браузер (Chrome, Firefox и т.д.)
  2. В адресной строке введите:

text

http://ВАШ-IP-АДРЕС:2283

Замените ВАШ-IP-АДРЕС на IP из шага 5.1

Пример : http://192.168.1.100:2283

  1. Нажмите Enter

5.4 Первый запуск Immich

  1. Вы увидите стартовую страницу Immich
  2. Нажмите кнопку “Getting Started”
  3. Зарегистрируйте первого пользователя - он автоматически станет администратором
  4. Войдите в систему используя созданные учетные данные

:white_check_mark: Часть 6: Проверка работы

6.1 Загрузка тестового фото

Спойлер
  1. После входа нажмите кнопку загрузки (иконка облака)
  2. Выберите несколько тестовых фотографий с вашего компьютера
  3. Дождитесь завершения загрузки

6.2 Проверка всех функций

Спойлер

bash

# На сервере проверьте, что все контейнеры работают

docker compose ps

# Все 4 контейнера должны быть в статусе “healthy”

:gear: Часть 7: Настройка автозапуска (рекомендуется)

7.1 Создание systemd сервиса

Спойлер

bash

# Создайте файл сервиса

nano /etc/systemd/system/immich.service

7.2 Добавьте содержимое:

ini

[Unit]

Description=Immich Photo Service

Requires=docker.service

After=docker.service

[Service]

Type=oneshot

RemainAfterExit=yes

WorkingDirectory=/opt/immich-app

ExecStart=/usr/bin/docker compose up -d

ExecStop=/usr/bin/docker compose down

TimeoutStartSec=0

[Install]

WantedBy=multi-user.target

7.3 Активация сервиса

bash

# Перезагрузите systemd

systemctl daemon-reload

# Включите автозапуск

systemctl enable immich.service

# Запустите сервис

systemctl start immich.service

# Проверьте статус

systemctl status immich.service

:sos_button: Часть 8: Решение проблем

Проблема: Страница не открывается в браузере

Спойлер
  1. Проверьте IP-адрес :

bash

ip addr show eth0

  1. Проверьте фаервол :

bash

# В контейнере

iptables -L -n

  1. Проверьте изнутри контейнера :

bash

curl http://localhost:2283

Проблема: Контейнеры не запускаются

bash

# Просмотрите подробные логи

docker compose logs -f

# Пересоздайте контейнеры

docker compose down

docker compose up -d

Проблема: Не хватает памяти

  • Увеличьте RAM контейнера в настройках Proxmox
  • Перезапустите контейнер в Proxmox

:mobile_phone: Часть 9: Дальнейшие шаги

9.1 Мобильное приложение

Спойлер
  1. Установите Immich из Google Play или App Store
  2. В приложении укажите адрес: http://ВАШ-IP:2283
  3. Войдите под учетной записью администратора

9.2 Резервное копирование

bash

# Создайте задание для бэкапа (в контейнере)

crontab -e

# Добавьте строку для ежедневного бэкапа в 2:00

0 2 * * * tar -czf /backup/immich-$(date +%Y%m%d).tar.gz /opt/immich-app/library

:bullseye: Краткий чеклист успешной установки

  • Контейнер Proxmox создан с ID 200
  • В конфигурацию добавлено lxc.apparmor.profile: unconfined
  • Docker установлен и работает
  • Файлы Immich загружены в /opt/immich-app
  • В файле .env изменен пароль DB_PASSWORD
  • 4 контейнера Immich запущены (docker compose ps)
  • Веб-интерфейс открывается по http://IP:2283
  • Первый пользователь зарегистрирован

Готово! Ваш персональный фотохостинг Immich полностью настроен и готов к использованию.

4 лайка

Добро пожаловать на форум и спасибо за вклад в общее развитие сообщества
PS

  1. Я не знаю корректная ли инструкция, но рад что Вы поделились своим опытом
  2. Хорошим тоном форума - считается оформление материалов внутри форума, без ссылок на файлы. Чуть поправил первый пост.

А чем обусловлен выбор именно 12-го дебиана ?

Ошибки лезут, немогли бы помочь

Хорошим тоном считается прикладывать текст логов\ошибок
Форум позволяет вставлять и как текст и как код

log error... / злая ошибка

Ну и хотя бы картинку, на которой читаемое разрешение.
У Вас не видно букв на картинке.

Судя по мылу ошибка в этом

1 лайк

прошу прощения:

Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: open sysctl net.ipv4.ip_unprivileged_port_start file: reopen fd 8: permission denied

а чем это отличается от этого?
очень много полезных скриптов можно найти на этом ресурсе.

в любом случае, спасибо, что поделились практическим опытом)

ну я ссылку скинул выше, проблема с актуальными версия docker, решается или обновлением PVE или отключением механизмов безопасности

  1. Helper Scripts используют нативную установку в debian без docker, а тут практически официальная установка внутри docker
  2. Helper Scripts поддерживается и обновляется сообществом, а тут еще одна установка, мои замечания так и остались комментариями в телеге, на данную инструкцию не повлияли (ряд замечаний довольно критичные)
  3. Helper scripts поддерживается сторонним сообществом, и предоставляет автоматизированный вариант установки. Тут же пошаговая инструкция от человека, который не особо разобрался для ребят, которые тоже не сильно то разбираются, но по сути, обертка над официальной докой
1 лайк

Роман,

спасибо за разъяснения)

а какие преимущества даёт нам в данном случае docker установка?

Позвольте немного повайбчатить

Установка MMICH (или любого другого ПО) через Docker имеет ряд преимуществ по сравнению с использованием helper scripts. Эти преимущества связаны с особенностями контейнеризации и стандартизацией среды выполнения.

Изоляция и безопасность

Docker упаковывает приложение и его зависимости в изолированный контейнер, который не влияет на хост-систему и другие контейнеры. Это снижает риск конфликтов между зависимостями и повышает безопасность, так как приложение работает в контролируемой среде. Helper scripts, напротив, обычно выполняют команды напрямую в хост-системе, что может привести к непреднамеренным изменениям или уязвимостям.

Портативность и воспроизводимость

Контейнеры Docker обеспечивают одинаковую работу приложения в любой среде — на локальной машине, в тестовой среде или в продакшене. Это достигается за счёт того, что образ контейнера включает все необходимые компоненты: код, библиотеки, настройки и т. д. Helper scripts часто зависят от конкретной конфигурации хост-системы, что может вызывать проблемы при переносе между окружениями.

Управление зависимостями

Docker позволяет чётко зафиксировать версии всех зависимостей в Dockerfile. Это гарантирует, что приложение будет работать одинаково на всех окружениях. Helper scripts иногда требуют ручной установки или настройки зависимостей, что увеличивает риск ошибок и несогласованности.

Простота масштабирования

С Docker легко масштабировать приложение — можно быстро запустить несколько экземпляров контейнера для распределения нагрузки. Helper scripts обычно не предоставляют встроенных механизмов для масштабирования, и для этого может потребоваться дополнительная настройка или использование внешних инструментов.

Версия и управление образами

Docker позволяет создавать и хранить образы с разными версиями приложения. Это упрощает откат к предыдущей версии при необходимости. Helper scripts чаще ориентированы на однократную установку, и управление версиями может быть менее гибким.

Стандартизация и экосистема

Docker — широко распространённый стандарт в IT-индустрии, вокруг него сформировалась развитая экосистема инструментов (например, Docker Compose для многоконтейнерных приложений, Docker Swarm для оркестрации). Это облегчает интеграцию с другими системами и использование лучших практик. Helper scripts часто являются узкоспециализированными решениями, которые могут не поддерживать такие интеграции.

Контроль ресурсов

Docker позволяет ограничивать доступ контейнера к ресурсам (CPU, память, дисковое пространство). Это полезно для предотвращения перегрузки системы. Helper scripts обычно не предоставляют таких возможностей управления ресурсами.

Автоматизация и оркестрация

Контейнеры Docker легко интегрируются с системами оркестрации (например, Kubernetes), которые автоматизируют развёртывание, масштабирование и мониторинг. Helper scripts требуют ручного выполнения или дополнительной настройки для автоматизации процессов.

Сравнение в таблице

Критерий Docker Helper scripts
Изоляция Да (контейнеры) Нет (работа в хост-среде)
Портативность Высокая (одинаково работает везде) Зависит от конфигурации хоста
Управление зависимостями Чёткое фиксирование в Dockerfile Часто требует ручной настройки
Масштабирование Простое (можно запускать несколько контейнеров) Требует дополнительных усилий
Версионирование Поддержка через образы Часто ограничено
Экосистема Развитая (Compose, Swarm, Kubernetes) Узкоспециализированные решения
Контроль ресурсов Да Обычно нет
Оркестрация Легко интегрируется Требует дополнительных инструментов

Вывод

Docker предоставляет более структурированный, безопасный и гибкий способ развёртывания приложений по сравнению с helper scripts. Он особенно полезен в производственных средах, где важны стабильность, масштабируемость и управление сложными инфраструктурами. Однако для простых задач или быстрого прототипирования helper scripts могут быть более удобными.

Спасибо за вайбчат, конечно, но скорее мой вопрос был про то, что это нам дает в этом конкретном случае)

Относительно установки через Helper Scripts:

  1. Мы экономим ресурсы?
  2. Мы увеличиваем быстродействие или что-то ещё?
  3. Мы повышаем безопасность?

Про безопасность: LXC контейнеры, в моем понимании, как раз таки обеспечивают изоляцию (если он unprivileged).

Все плюшки про масштабируемость, версионность, стандартизацию и прочее это, конечно, важно, но не очень критично для homelab.

Аргумент про недоступность некоторых ресурсов хороший, тут соглашусь.
У меня просто для этого есть КВН - я через него гоню установки, а то все проверять устанешь.

Мне кажется, что Вы уже начинаете искать то, чего нет.

  • По поводу ресурсов, ну сомнительно, docker в большинстве случаев не способствует этому, но… в ряде случаев действительно можно сэкономить пару гигов если ствить на Alpine и Alpine сборки контейнеров
  • Быстродействие и безопасность, ну тут опять же, многое зависит от конкретной конфигурации, по умолчанию docker за счет доп. уровня абстракции снижает производительность, но за счет более глубокой изоляции компонентов немного повышает безопасность - тут физику не обманешь.

Если стандартизируемость и версионируемость не важно, то

  1. Я помню, как сюда приходили с проблемами после обновления lxc контейнера с debian 12 на debian 13, с docker это вообще не важно
  2. Разработчик предоставляет compose файл с нужными компонентами и их версиями. Соответственно, если он решает, что надо сменить БД, то прописывает это в файле, случае с helper scripts надо надеяться на команду helper scripts, что они напишут соответствующий скрипт.
  3. Откат назад мне не приходилось делать, но в целом, управление версиями при помощи docker тегов имеет место быть и тут сложно спорить, что это проще делать именно с docker
  4. Стандартизируемость, ну может для кого-то это не важно, но у меня
    4.1. В телегу прилетают уведомления при наличии новых версий

    4.2. Централизованное управление и обновление по одной кнопке

    4.3. Централизованный сбор метрик и логов

    4.4. Хранение конфигурации в git

А так, нет идеального решения, которое будет и быстрое и безопасное и надежное, каждое решение имеет свои плюсы и недостатки, но лучшее решение, это то, которое именно Вы умеете использовать без разницы, это helper scripts, docker, ansible, runtipi или truenas

Единственное, что я не пользую runtipi и helper scripts, поэтому исхожу из того, что если вы используете это, а я нет, то у вас знаний больше и я помочь в случае проблем уже не могу

4 лайка

Роман, спасибо за развернутый ответ!

Как по мне, получилось неплохое обсуждение, которое может быть полезно другим форумчанам)

Вечер добрый.

В моем первом топике господин основатель сказал - мы рабы своих привычек.
Как же это верно.

Я вот до сих пор не могу себя переубедить перевести свои рабочие контейнеры с lxc\nginx\php-fpm\hodejs\mysql на docker. Ну вот неудобно мне. Понимаю что надо двигаться, но видимо стар я уже ) первые шаги в self-hostig были тогда, когда и понятия то такого не было, adsl\netware3.12.

C lxc - как то все понятно. А docker как бы это смешно не звучало в 21 веке - какой то “мутный” ). Сел конечно разбираться, и чисто домашние сервисы сейчас пытаюсь перенести из lxc в docker. С трудом но двигаюсь. Надеюсь что сообщество не бросит в беде :wink:

Спасибо, обновление PVE помогло