Pipeline для личных фото и видео
Если вы когда-нибудь задумывались как хранить личные медифайлы которых становится все больше, у вас телефон на Android и вы не очень доверяете облакам, то эта статья, возможно, для вас.
Моё медиа хранилище в 948,4 GiB выглядит сейчас вот так (фото начинаются с 2001 года)
А сам Pipeline нарисован на схеме. Пояснения — после картинки.
Появление файлов
В 97% случаев файлы появляются на телефоне. Или прямо при съемке камерой самого телефона (фото в HEIF, видео в HEVC) или через импорт со всяких экшен камер.
Со сделанным камерой телефона все просто, фотки просматриваются и неудачные удаляются, видео обрезается в родном редакторе Samsung или редактируются в CapCut
С импортированным из экшн камер — сложнее. Сначала они импортируются в телефон, потом редактируются, потом полученное выливаются в папку которая участвует в общем pipeline, а исходники безжалостно удаляются. C GoPro и DJI Action 2 этот процесс был не очень спешным, в силу того что файлы были не очень большие, а родные редакторы не очень удобные. C Insta360×4 весь этот процесс гораздо динамичнее. Во-первых потому что исходники просто огромные (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 защищён от удаления в нескольких местах, и поэтому удаление файлов имеет некоторые особенности.
Удалять фотки при первоначальной чистке лучше всего в Google Photo, тогда они попадут в корзину и их можно будет достать какое то время, ну и мест на гугловом хранилище очистится, чего не произойдёт если удалять фотки в родной галерее.
После этапа Nexcloud → Immich уже все равно что происходит в google photo, на телефоне или nexcloud. Файлы все равно останутся на сервере с Immich.
Если удалить фотки в Immich, то они все равно останутся в бэкапах restics и для полного исчезновения файла надо проводит операцию удаления старых снапшотов.
Автоматизация разворачивания
Вся описанная история довольно просто автоматизируется в Ansible. У меня именно так это и сделано. Есть только одна ручная операция — выдача доступа restic в Яндекс диск при деплое всего этого барахлишка.