Если вы когда-нибудь задумывались как хранить личные медифайлы которых становится все больше, у вас телефон на Android и вы не очень доверяете облакам, то эта статья, возможно, для вас.

Моё медиа хранилище в 948,4 GiB выглядит сейчас вот так (фото начинаются с 2001 года)

А сам Pipeline нарисован на схеме. Пояснения - после картинки.

Появление файлов

В 97% случаев файлы появляются на телефоне. Или прямо при съемке камерой самого телефона (фото в HEIF, видео в HEVC) или через импорт со всяких экшен камер.

Со сделанным камерой телефона все просто, фотки просматриваются и неудачные удаляются, видео обрезается в родном редакторе Samsung или редактируются в CapCut

С импортированным из экшн камер - сложнее. Сначала они импортируются в телефон, потом редактируются, потом полученное выливаются в папку которая участвует в общем pipeline, а исходники безжалостно удаляются. C GoPro и DJI Action 2 этот процесс был не очень спешным, в силу того что файлы были не очень большие, а родные редакторы не очень удобные. C Insta360 X4 весь этот процесс гораздо динамичнее. Во-первых потому что исходники просто огромные (1 минута 8 секунд в 8K 30fps это 1.4Gb), а во-вторых приложение очень удобное, на Samsung S24 Ultra работает очень быстро, как на редактировании, так и на импорте в плоские видео и поэтому прохождение этого этапа не откладывается и идёт быстро и по фану.

Еще есть фотки которые присылают в мессенджерах. Нужные тупо перекладываются в особую папку на которую настроена синхронизация.

В итоге, в некий момент времени есть фото и видео которые хочется сохранить где-то еще.

Google Photo

Гугл фото в моем pipeline является тупиковой веткой. Он используется в основном для мгновенного сохранения медиафайлов. Пока его получается проплатить - он там и останется, если не получится в очередной раз его проплатить или его заблочат то он будет запросто заменен на syncthing как средство мгновенного бекапа. В 22 году, когда были проблемы с его продлением я его почистил, удалив все видео, и оставив по паре фоток от каждого события что бы осталась карта и напоминания о событиях. В 23 году проблема была решена, но надежды на него никакой.

Синхронизация в Nexcloud

Nexcloud - это сервер на Raspberry Pi 4 c SSD диском подключенным через USB на Ubuntu и стоящий дома. Для пущей секурности он живет в отдельной подсети DMZ в которую есть доступ с интернета. Когда на телефоне все ненужные фотки и видео удалены в программе Google Photo, а нужные из мессенджеров переложены в правильную папку, то на телефоне вручную запускается джобка в бесплатной версии foldersync. Ее вполне хватает для синка новых файлов в Nexcloud.

Nexcloud -> Immich

Сервер с Immich это машинка на ASRock J5040-ITX в корпусе Thermaltake Suppressor F1 с двумя дисками на 3Tb WD42PURZ в RIAD1 в 8G RAM. Все это работает на Ubuntu. Immich поднят через docker compose и так как проект 'The project is under very active development' то обновляется в ручную через `docker compose pull`. И web ui и нативное приложение уведомляют о том что вышла новая версия и с этим проблем нет

Раз в два часа на этом сервере запускается rsync который ходит на Nexcloud и забирает новые файлы, не удаляя локальные файлы даже если в Nexcloud они были удалены.

Так же на сервере есть Photoprism. Поднимался тоже через docker compose. Вообще я с него начинал, он хороший, но web ui на телефоне - ужасен. То искал фотки за 2005 год, и вместо закрытия фотки нажал назад и улетел в начало списка, в 2024, то при скроллинге web ui посчитал что ты не только поскролил, но и выбрал часть фоток и ты смотришь, а у тебя не одна фотка выбрана а 15, и непонятно где их искать что бы убрать из выделения, это могло незаметно произойти 10 экранов назад. У Immich есть свое приложение почти лишенное этих недостатков. Так как призма хлеба на просит, а обновляется автоматом через watchtower то я его оставил, но перевел в read only режим, что бы иногда заглядывать и сравнивать.

После того как rsync забирает файлы то Immich сам это видит, начинает их сканировать и добавляет в медиатеку, а Photoprism делает это по пинку по таймеру.

Immich работает в RW режиме с файлами, поэтому через него можно удалять файлы.

Вспоминается только один минус Immich - он не умеет raw. Но таких фоток у меня минимум.

Бекапы

Фото и видеофайлы которые затаскивает rsync на сервер с Immich раз в сутки бекапятся с помощью restic. Restic поддерживает те же протоколы что и rclone, поэтому отлично заливает бекапы как в яндекс диск так и в домашний NAS через подмонтированную samba шару. Все это легко меняется на любое нужное и используемое в это части pipeline.

Пока в pipeline отсутствуют средства бекапа разметки файлов в Immich, что не очень хорошо, потому что информация о альбомах и именах найденных лиц хранится именно там. В распознанных у меня 709 лиц, и некоторые имена приходилось прям тяжело вспоминать через соцсети и телефонную книгу, жалко будет их потерять. Но этот пункт пока в TODO.

Удаление файлов.

Весь pipeline защищён от удаления в нескольких местах, и поэтому удаление файлов имеет некоторые особенности.

  1. Удалять фотки при первоначальной чистке лучше всего в Google Photo, тогда они попадут в корзину и их можно будет достать какое то время, ну и мест на гугловом хранилище очистится, чего не произойдёт если удалять фотки в родной галерее.

  2. После этапа Nexcloud -> Immich уже все равно что происходит в google photo, на телефоне или nexcloud. Файлы все равно останутся на сервере с Immich.

  3. Если удалить фотки в Immich, то они все равно останутся в бэкапах restics и для полного исчезновения файла надо проводит операцию удаления старых снапшотов.

Автоматизация разворачивания

Вся описанная история довольно просто автоматизируется в Ansible. У меня именно так это и сделано. Есть только одна ручная операция - выдача доступа restic в Яндекс диск при деплое всего этого барахлишка.

Комментарии (28)


  1. Tirarex
    08.09.2024 13:50

    У меня на NAS ( https://habr.com/ru/companies/ruvds/articles/837642/ ) стоит truenas, в нем Immich как контейнер (все нативно настраивается через UI), папки загрузок одновременно доступны на SMB шаре. Там же подключена библиотека (1,5тб на текущий момент) с raw фото с камеры.

    Пайплайн прост, подключаем камеру в USB - Скриптик копирует все содержание камеры на NAS, где Immich Сканирует папку раз в день. Можно так же подключить туда загрузку из приложения на телефоне, благо у Immich Очень адекватный мобильный софт.

    А сам NAS бэкапить куда угодно, благо методов море.

    Вспоминается только один минус Immich - он не умеет raw. Но таких фоток у меня минимум.

    Умеет, в моем случае работает с Araw От сони.


    1. sergeygals Автор
      08.09.2024 13:50

      Ну значит проблема только с raw который делает samsung на телефоне :) ну и описанный вами простой пайплайн имеет ряд недостатков, главный из которых он даже из соседней комнаты не работает, не то что из другого города :)


      1. Tirarex
        08.09.2024 13:50

        главный из которых он даже из соседней комнаты не работает, не то что из другого города :)

        С чего бы? вы же на смартфон делаете фото, так просто поставьте на него https://play.google.com/store/apps/details?id=app.alextran.immich&hl=ru и приложение само синхронизирует фото напрямую в Immich без посредников. Приложение можно натравить как на фото с телефона так и на спец папки куда скидываются фото с камер (я могу с камеры сони по воздуху фото получать, а приложение иммич само уже их импортирует куда надо)

        Если говорить о синхронизации вне рамок одной сети с сервером, то можно поднять Tailscale до домашнего сервера (Можно только локальный траффик домой пускать https://tailscale.com/kb/1444/android-app-split-tunneling ), или wiregaurd+ddns если по старинке.


        1. sergeygals Автор
          08.09.2024 13:50

          Пайплайн прост, подключаем камеру в USB

          Вот по этому :) я так понял подключать к насу надо.

          Таки приложение immich у меня конечно стоит, и я в курсе что оно синхронизировать умеет, но мне не нравится такая синхронизация. Это надо постоянно включённым держать vpn домой, вычищать неудачные фото и из гугла и из immich.


  1. pes_loxmaty
    08.09.2024 13:50

    Не раскрыта тема для параноиков. Если <username> боится лить в гугл или яндекс свои сокровенные фотки в открытом виде?


    1. sergeygals Автор
      08.09.2024 13:50

      Тут все не просто, а очень просто, google photo из пайплайна выкидывается и меняется на Syncthing если нужен мгновенный бекап. С яндекс диском и делать ничего не надо, restic все бекапы шифрует. И кажется эта фича даже не отключается.


  1. UksusoFF
    08.09.2024 13:50

    https://www.photosync-app.com
    Это для тех кто не хочет лить в Google
    Ставиться на комп и при подключении к домашнему WiFi синкается


    1. sergeygals Автор
      08.09.2024 13:50

      Чем он лучше foldersync ?


      1. UksusoFF
        08.09.2024 13:50

        Не сравнивал, возможно и хуже)
        Просто у меня через него крутится


    1. event1
      08.09.2024 13:50

      То же можно и клиентом nextcloud делать. Пока вне сети не синкается, а как в сеть попадает, сразу синкается.


  1. Antra
    08.09.2024 13:50

    Насколько я понимаю, у вас основной фокус на реальных фотках людей, поэтому нужно распознавание лиц и т.п. И при этом у вас есть опыт с разными приложениям (Immich, Photoprism и т.п.). Можете подсказать, что лучше подойдет (стоит посмотреть) для несколько других задач, а именно ручного раскидывания по папкам (ну или тегирование)?

    Идея в том, что бы сфотканное на телефон легко помечать каким-то образом и сохранять либо в отдельную тематическую папку (и на смартфоне и в хранилище).

    Пример:

    • прокладывал в огороде водопровод, перед закапыванием траншей все отфоткать и поместить в папаку "Огород".

    • фотки экранов BIOS и т.п. в "Комп". Желательно еще и доп теги поставить потом на компе

    • В коробку что-то складывается, по слоям фоткается...

    Причем если со смартфона удалю, в хранилище должно остаться (незачем на смартфоне хранить водопровод). Однако же если что-то больше не нужно, желательно удалить отовсюду (и из хранилищ с компьютерным интерфейсом, и со смартфона) разом. Условно и из Immich, и из NextCloud, и со смартфона. Может с подтверждением каким (удалил из Immich, не сразу, но должна быть возможность, чтобы на NextCloud тоже исчезло со временем).

    Какие-то фотки из поездок, к примеру, тоже нужны. И тоже не "сплошным потоком", а с группировкой. Причем избирательно, что кешировать на смартфоне, а что "на лету" иметь возможность подкачать.

    И желательно туда же (в хранилища и на смартфон) скачиваемые картинки какие-то. К примеру, когда выбирал насос, скачивал множество графиков с их гидродинамическими характеристиками. Их тоже в кучку., которую потом можно грохнуть (а тот, что выбрал - в "Хозяйство"). Или "демотиваторы по темам". Причем скачать можно и с компа (на диск, потом смартфон это увидит), и со смартфона (и это пусть попадет в нужную папку на нем и в хранилище).

    В идеале, чтобы картинки хранились в виде файлов, чтобы и обычные синхронизовалки работали.

    Все сразу, наверное, маловероятноь. Но хоть более-менее похожие варианты есть (без фокуса на распознавание лиц и т.п.)?


    1. sergeygals Автор
      08.09.2024 13:50

      в Immich есть тэги, но создать и вешать на фотки их можно только в Web UI. PhotoPrism создаёт сам тэги, но принцип выбора не очень понятен, некоторые тэги весьма забавны, примеры под спойлером

      Скрытый текст

      так что я бы этой функции особо не доверял.

      Опять же и там и там фотки можно сортировать добавляя в альбомы. Но все это постфактом и через Web UI


      1. Antra
        08.09.2024 13:50

        Спасибо!

        Ну первая специально сделана по приколу, мне кажется Я бы и сам мог лажануться и принять за торт. А остальные да, забавно :)


  1. GrakovNe
    08.09.2024 13:50

    Недавно поднял примерно то же самое, только без второго бекапа

    Apple фотолента синкается с айфона в иммич, развернутый на проксмокс-виртуалке, к которой прикручен 8TB SSD и оттуда уже не исчезает. Раз в три месяца вычищаю из iCloud данные и параллельно руками копирую фотки с домашнего облака на оффлайновую Samsung T7 которая физически лежит в шкафу без питания большую часть времени

    То есть фотки живут всегда в двух местах: либо iCloud + Immich, особо холодное хранилище + Immich

    Автоматически бекапить думал, но не стал: еще одно облако мне не нужно, поднимать второй сетевой диск не с руки, а бесконечно складывать в iCloud довольно уныло и дорого


    1. sergeygals Автор
      08.09.2024 13:50
      +1

      я слишком ленив для втыкания диска в USB да ещё переодически :)


  1. buldo
    08.09.2024 13:50

    Synology + его же приложение на телефоне как будто бы покрывает весь этот пайплайн...


    1. sergeygals Автор
      08.09.2024 13:50
      +1

      так так, очень интересно, а как Synology высунута в интернет ? или все идёт таки через сервера Synology ? а как с шифрованием бекапа на другие ресурсы ? и, главное, как с восстановлением этих бекапов без Synology ?


      1. buldo
        08.09.2024 13:50
        +1

        Для доступа к NAS доступны следующие варианты:

        1. Синхронизация по локальной сети

        2. Синхронизация через проксирующие сервера Synology

        3. Выставить NAS в интернет

        Само приложение синхронизации умеет в два адреса - для локальной сети и "внешний".

        У меня телефон подключается к домашней сети подключается по VPN. У Synology есть пакет VPN сервера( правда у меня VPN сервер на mikrotik)

        Если выставлять NAS в интернет, то есть поддержка Let's Encript и DynDNS.

        Теперь про бэкап:

        1. Отдельное приложение для работы с Glacier

        2. HyperBackup, который умеет в dropbox, google диск, azure, S3, webDav, rsync, samba, usb устройства и тп

        3. Есть некий Archiware P5

        4. Можно купить второй Synology, поставить куда-нибудь подальше и сделать кластер

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

        Лично я раз в год-полгода с помощью другого компа и Veeam сливаю всё, что есть на касету и передаю родителям. Шифрованием не пользуюсь ибо надеюсь на физическую защиту.


        1. sergeygals Автор
          08.09.2024 13:50

          Я бы не рискнул его выставлять в инет https://www.cvedetails.com/vulnerability-list/vendor_id-11138/Synology.html?page=1&order=1. А с прокси серверами ровно та же проблема что с гулофото, завтра могут отрубить, и основанный на них пайплайн встанет + то что они делают с трафиком никто кроме них не знает. Постоянный vpn домой мне тоже не очень нравиться. Как и завязку на бекапы которые непонятно можно ли восстановить без synelogy. Restic все таки open-source.


          1. buldo
            08.09.2024 13:50
            +2

            Вот только по вашей ссылке каких-то настоящих проблем нет. Половина относится к камерам, а для второй половины пользователь должен быть аутентифицирован.

            Вам не нравится, а мне наоборот нравится постоянный vpn домой - и NAS под рукой, и Home Assistant, и rpd до компа.

            Бэкапы можно восстановит без NAS. Для этого отдельная утилита для компа.


            1. Antra
              08.09.2024 13:50

              И через какой-нибудь Cloudflare для доп защиты.


  1. Actor
    08.09.2024 13:50

    А зачем Nextcloud тут, внешний доступ без впн разве что?


    1. sergeygals Автор
      08.09.2024 13:50

      Nexcloud не только для медиа используется, он все равно есть. Ну и опять же да, с ним не надо vpn держать включённым, и он живёт в DMZ сети. Смысл такого сетевого разграничения именно в том что если взламывают сервис то дальше идти не могут, доступа в Lan подсеть с этой подсети нет.


      1. buldo
        08.09.2024 13:50

        Кстати, вот этого момента с DMZ я никогда не понимал. Если immich ходит в nextCloud, значит сетевая связность есть. То есть dmz - это просто отдельная подсесть между которой и LAN есть фаервол?


        1. sergeygals Автор
          08.09.2024 13:50

          все так, там фишка в том что из LAN в DMZ можно, а из DMZ в LAN - нельзя. Ну и на управляющие порты роутера тоже нельзя.


  1. StraNNicK
    08.09.2024 13:50

    Серьёзный подход.

    Я себе оставил immich и как бэкапилку фото (не использую для этого syncthing), и как собственно приложение для фото. Ну уверен, что вы подразумеваете под тэгами, но неонка нейронка в нём есть и неплохо работает.

    енот тоже кот!
    енот тоже кот!



    1. sergeygals Автор
      08.09.2024 13:50

      В призме тоже поиск по ключевым словам есть, но у него ещё есть страница в котором он собирает фотки по выбранным им ключевым словам. Алгоритм добавления туда не понятен, но вот, например есть подборка backpack. И там прям реально рюкзаки. Или wings. И там прям реально крылья самолётов. Но угадывает далеко не всегда.


      1. StraNNicK
        08.09.2024 13:50

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