Если вы когда-нибудь задумывались как хранить личные медифайлы которых становится все больше, у вас телефон на 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 в Яндекс диск при деплое всего этого барахлишка.

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


  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

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