Вступление
Immich — это самохостинговое решение для управления фотографиями и видео. Оно позволяет создавать резервные копии, организовывать и управлять медиафайлами на собственном сервере.
Основные возможности
- Автоматическое резервное копирование фотографий и видео с мобильных устройств при открытии приложения.
- Поддержка различных форматов — загрузка и просмотр фотографий и видео, включая RAW.
- Многопользовательская поддержка — возможность создавать и делиться альбомами с другими пользователями.
- Расширенные возможности поиска — поиск по метаданным, объектам, лицам, а также использование модели CLIP для улучшения результатов.
- Кроссплатформенность — доступ к медиафайлам с мобильных устройств и веб-интерфейса.
Требования
- ОЗУ не менее 4ГБ, предпочтительно 6ГБ
- Процессор х86 с минимум 2 ядра, предпочтительно 4
- Минимальная установка Debian 12
Установка
Далее нам потребуется установить менеджер пакетов snap
sudo apt install snapd
Затем устанвливаем сам Immich
sudo snap install immich-distribution
По завершении переходим в браузер и набираем http://IP-ADDRESS
Заполняем поля и собственно все.
По неообходимости добавляем пользователей
В телефоне устанавливаем приложение immich, и вводим данные в настройках, теперь все фото с телефона будут синхронизироваться на сервер.
Для дальнейшего администрирования есть набор утилит:
- immich-distribution.backup
- immich-distribution.immich-admin
- immich-distribution.psql
- immich-distribution.debug
- immich-distribution.lets-encrypt
- immich-distribution.restore
По умолчанию для запуска команд просто sudo будет недостаточно, придется перейти в root-а
sudo -i
Fail2Ban защита от перебора паролей
Итак сервер изображений установлен на домашнем компе, просто дать доступ из вне не очень хорошая идея.
В общем путь такой:
- Выбираем облачную платформу, например Seletel.
- Поднимаем там выртуальную машину под управление ОС Debian.
- Устанавливаем Sudo, Nginx, Wireguard сервер и Sertbot для организации HTTPS шифрования (статьи есть на https://wiki.cyberpav.com)
- Подключаем к ней нашу машину с IMMICH
- Создаём конфиг для Nginx
sudo nano /etc/nginx/sites-enabled/immich.conf
наполняем файл содержимым:
server {
server_name domain.server.name; # надо поменять на правильное имя
listen 80;
# Allow large file uploads
client_max_body_size 50000M;
# Set headers
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Enable WebSockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
# Set timeout
proxy_read_timeout 600s;
proxy_send_timeout 600s;
send_timeout 600s;
location / {
proxy_pass http://IP ADDRESS; # Вместо "IP ADDRESS" ввести арес присвоенный в Wireguard
access_log /var/log/nginx/immich_access.log; # Логирование Nginx
error_log /var/log/nginx/immich_error.log; # Логирование Nginx
}
}
На этом этапе используем 80-й порт, далее Sertbot его перепишет с учетом выпущенных сертификатов
6. Устанавливаем Fail2Ban
sudo apt update
sudo apt install fail2ban -y
Убедись, что сервис запущен:
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
- Настраиваем Fail2Ban
Создаём файл /etc/fail2ban/filter.d/nginx-immich.conf
sudo nano /etc/fail2ban/filter.d/nginx-immich.conf
Наполняем его содержимым
[Definition]
failregex = <HOST> -.*"(POST|GET).*\/api\/auth\/login.*" 401
ignoreregex =
Этот филтр будет отслеживать неудачные попытки входа в Immich
Далее создадим jail для Immich
sudo nano /etc/fail2ban/jail.local
Добавляем:
[nginx-immich]
enabled = true
port = http,https
filter = nginx-immich
logpath = /var/log/nginx/immich_access.log
maxretry = 5
findtime = 600
bantime = 3600
Можно изменить maxretry, findtime, bantime по желанию
maxretry - количество попыток ввода пароля.
findtime - время, в течении которого будет вестись подсчет попыток.
bantime - время на которое будет заблокирован IP адрес, с которого пытались подобрать пароль.
В нашем примере:
Fail2Ban заблокирует IP, если за 10 минут было 5 неудачных попыток
IP останется в бане 1 час, после чего будет разблокирован автоматически
Перезапустим и проверим Fail2Ban
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status nginx-immich
Теперь сделаем несколько неверных логинов и проверим результат
sudo fail2ban-client status nginx-immich
Результат должен быть таким:
3 - попытки
Status for the jail: nginx-immich
|- Filter
| |- Currently failed: 1
| |- Total failed: 3
| `- File list: /var/log/nginx/immich_access.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
ещё 5 попыток
Status for the jail: nginx-immich
|- Filter
| |- Currently failed: 1
| |- Total failed: 8
| `- File list: /var/log/nginx/immich_access.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 1.2.3.4
В место 1.2.3.4 - будет заблокированный IP адрес
Уведомления на Telgram
Открываем Телеграм и в поиске контактов пишем @BotFather
Затем в командной строке бота пишем
/newbot
Нам предложат выбрать имя нашего бота, важно - имя должно заканчиваться на bot, например myimmichbot
Бот выдст инфу по Нашему новому боту, выглядит вот так
Done! Congratulations on your new bot. You will find it at t.me/myimmichbot. You can now add a description, about section and profile > picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support > if you want a better username for it. Just make sure the bot is fully operational before you do this.
Use this token to access the HTTP API:
821235548325492:AAFWCqq2JKuiIM7WnWasfedfR_bEKGwjhbkhjgjnkdA ## ЭТО ТОКЕН БОТА
Keep your token secure and store it safely, it can be used by anyone to control your bot.For a description of the Bot API, see this page: https://core.telegram.org/bots/api
Записываем инфу туда, где её никто не найдет, кроме Вас конечно ) (EnPass в помощь)
Переходим в созданный бот по ссылке в сообщении t.me/myimmichbot
Затем надо получить chat_id, открываем браузер и вводим в адресной строке
https://api.telegram.org/bot<BOT_TOKEN>/getUpdates
Вместо <BOT_TOKEN> вводим тот который получили и в ответ получаем что то типа:
{
"ok": true,
"result": [
{
"update_id": ...,
"message": {
"chat": {
"id": 123456789,
...
},
...
}
}
]
}
это может отобразится и одной строкой, важно найти "chat: {"id": 123456789
этот ID и буде ID чата уведомлений
Далее возвращаемся на сервер и создаём файл:
sudo nano /etc/fail2ban/action.d/telegram.conf
Заполняем содержимым:
[Definition]
actionstart = curl -s -X POST https://api.telegram.org/bot<token>/sendMessage -d chat_id=<chat_id> -d text="Fail2Ban started watching <name>"
actionban = curl -s -X POST https://api.telegram.org/bot<token>/sendMessage -d chat_id=<chat_id> -d text="IP <ip> banned by Fail2Ban in <name>"
actionunban = curl -s -X POST https://api.telegram.org/bot<token>/sendMessage -d chat_id=<chat_id> -d text="IP <ip> unbanned in <name>"
Естесствунно заменяем на правильные TOKEN и CHAT_ID
Теперь включим это все в jail
sudo nano /etc/fail2ban/jail.local
и в конце добавляем action = telegram, должно получиться так:
[nginx-immich]
enabled = true
filter = nginx-immich
logpath = /var/log/nginx/immich_access.log
maxretry = 5
findtime = 600
bantime = 3600
action = telegram
Это все, в Telegram длжны будут прилететь нашы тестовые события
Fail2Ban started watching nginx-immich
IP 1.2.3.4 banned by Fail2Ban in nginx-immich
IP 1.2.3.4 unbanned in nginx-immich