DT Wiki

Вступление

Immich — это самохостинговое решение для управления фотографиями и видео. Оно позволяет создавать резервные копии, организовывать и управлять медиафайлами на собственном сервере.
Основные возможности

Требования

Установка

Далее нам потребуется установить менеджер пакетов snap

sudo apt install snapd

Затем устанвливаем сам Immich

sudo snap install immich-distribution

По завершении переходим в браузер и набираем http://IP-ADDRESS
Заполняем поля и собственно все.
По неообходимости добавляем пользователей
В телефоне устанавливаем приложение immich, и вводим данные в настройках, теперь все фото с телефона будут синхронизироваться на сервер.
Для дальнейшего администрирования есть набор утилит:

sudo -i

Fail2Ban защита от перебора паролей

Итак сервер изображений установлен на домашнем компе, просто дать доступ из вне не очень хорошая идея.
В общем путь такой:

  1. Выбираем облачную платформу, например Seletel.
  2. Поднимаем там выртуальную машину под управление ОС Debian.
  3. Устанавливаем Sudo, Nginx, Wireguard сервер и Sertbot для организации HTTPS шифрования (статьи есть на https://wiki.cyberpav.com)
  4. Подключаем к ней нашу машину с IMMICH
  5. Создаём конфиг для 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
  1. Настраиваем 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