Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Последнее время доверие к облакам как-то резко упало, и пока кончалась годовая подписка на Google One на 2Т было время подумать, что делать дальше. В итоге родилась старая концепция - 'храним данные дома'. И вот что их этого получилось
Google Photos
Облакам доверия нет, но старое желание синкать фото и видео с телефона не пропало. При этом не хотелось бы вручную разбирать накопленный в google photo архив размером в 255G, а хотелось некоторой автоматизации в виде разбора фоток по лицам, местам, датам и возможности поиска по ключевым словам типа ‘море’ или ‘пятигорск’.
Опыт был против высовывания всего подряд в интернет поэтому была задумана и запилена классическая схема с DMZ. Ну не совсем сейчас а она была сделана давно. Если вы не в курсе что такое DMZ то это просто. Просто подсеть в которой живут сервисы доступны с интернета (у нас же типа клауд) но которая не может ходить на сервисы в LAN сама.
Софт того что притворяется Google Photos
OS - Linux Ubuntu 22.04 и на nexcloud и на photoprism. Раньше на nexcloud жил Arch Linux, но, недавно воткнулся в то когда то давно поставил туда 34 разрядную систему на которой последние релизы Nexcloud отказываются работать. Ну и зоопарк из OS не очень удобен для автоматизации развертывания
Ansible - ввиду того что дома стало аж 2 сервера плюс еще есть VMки снаружи вся настройка обоих серверов была перенесена в ansible, и конфигурирование происходит только через плейбуки и хранится в гите
Nexcloud (с mysql) - ставился через snap, были перенесен дефолтный порт 80 был перенесен на другой
Caddy2 (на сервере с nexcloud). Вообще nexcloud поставленный из snap умеет let’s encrypt сертификаты, но мне не понравилось, что даже при обращении по IP он всем говорит что он nexcloud, просто домен не правильный. Поэтом в качестве реверс прокси был установлен caddy2, который при 12 строчка[ конфига делает все что нужно: и обратно проксирует, и let’s encrypt сертификат генерит и обновляет без всяких cron джоб. При обращении по IP или неверному DNS имени он шлет нафик с ssl error, что гораздо правильнее на мой взгляд
Photoprism - запускается через docker-compose вместе с нужным mysql, индексация 225GB в виде 26134 фоток и 1461 видео забранных через Google Takeout заняло примерно 32 часа, при этом процы были сожраны целиком, а памяти максимально скушало на старте, в районе 3,5 гигов, потом потребление памяти упало до 2х гигов и больше не росло. Нагенерил для себя данных на 38G + 547M базу mysql. База и данные живут на ssd, фотки на md raid1 на двух 4х террабайтных дисках. Живет на отдельном tcp порту, доступен только локально дома или через vpn.
Из плюсов:
Очень удобная штука даже при работе с телефона
Работает шустро.
Работает поиск по словам типа ‘jeep’ (выдает фотки и уазиков в том числе), ‘cat’ и прочее похожее . Правда, несмотря на наличие русскоязычного интерфейса поиск ‘кот’ ничего не вернет.
Работает поиск по географическим наименованиям, названия в РФ парсятся на русском, и, поэтому, например ’Пятигорск’ работает, а вот Прагу надо искать уже как Praha
При индексировании распознал примерно 55 лиц, притом детей распознал в диапазоне от 5 до 18 лет вполне верно. Некоторые люди, правда, распались на два лица, но это не проблема, после распознания им можно дать одно и тоже имя и они склеются в одного человека. Правда с этим надо аккуратнее, Если двух разных Максимов назвать Максим они склеются в одного человека и как расклеить я не нашел (кроме полного удаления всех данных и рескана)
На отдельно вкладке доступны распознанные теги и фотки по ним, у меня их распознало 150. Примеры тегов - Aircraft, Alpine, Boat, Car, Document, и прочее, даже есть Throne, Wok и Tripod. Распознание достаточно точное, но не без приколов, в тот же Tripod попала крупная фотка центра ветряка с лопастями.
Есть карта, достаточно примитивная, без названий, с грубыми очертаниями границ и морей, без каких либо названий кроме двухбуквенных обозначений стран. Обещают это исправить в след релизах
Есть так называемые Моменты по названию которых примерно понятно что там скорее всего будет, как пример - Bays, Capes & Beaches, Festivals & Entertainment, Nature & Landscape и Water, Ships & Boats
Есть встроенный WebDAV для добавления фоток через интерфейса
Можно создавать свои альбомы
Можно шарить альбомы и фотки через urlы без логина в систему, а можно прям из интерфейса отсылать на сторонний WebDAV сервер. Ролей нет, но, по большому счету, логин там нужен только для управления, дома можно пошарить альбомы в виде url и все показывать.
Можно удалять фотки (или отключить такую возможность в интерфейсе)
Есть раздел Папки, в нем такие же папки как на диске
Есть раздел Календарь, там все по датам
Есть раздел Приватные, туда попадают фотки которые призма распознала как взрослые, туда часто попадает что не попадя, например люди в водолазных костюмах :)
Дубликаты распознает, и в показе их нет, но, удалять сам пока не умеет, обещают это со временем запилить
Zabbix (стоит на сервере Photoprism) - мониторинг обоих серверов + nas, роутера и принтера через SNMP + мониторинг внешних VMок с алертами на почту и в телегу. Да, не модно, но с прометусом возится не хотелось
Rclone - синкает Nexcloud по webdav на временную папку на сервере Photoprism
Bash - тупой скрипт который разбирает то что прилетело с Nexcloud по датам и копирует в папку с фотками на md raid, а так же дергает Photoprism на тему индексации новых фоток
Алгоритм работы всего этого чудо облака
На телефон был установлен http://www.tacit.dk/foldersync который сникает фото в Nexcloud с удалением (то есть если удалил фотки в телефоне, то они удаляются и в Nextcloud). Притом вручную, сейчас нет полной обратной синхронизации как в Google Photos, то есть удаление фотки в Photoprism не приведет к удалению ее на телефоне, а удалять в нескольких местах никакого желания. Поэтому сейчас фоткаю - снимаю видео, потом в свободное время удаляю лишнее в виде дублей и неудачного. И запускаю ручной синк через foldersync.
В это время на сервере Photoprism раз в час происходит следующее
Rclone с сервера Photoprism синкает локальную директорию с Nexcloud (с удалением удаленного в Nexcloud)
Посинканное разбирается по датам и копируется в директорию с фотками в директорию содержащую дату
Photoprism пинается на предмет индексации директории с фото в процессе чего он находит новое, его индексирует и оно появляется в интерфейсе
Если удалить фото на телефоне оно удалится и в Nexcloud и во временной директории на Photoprism, но при этом останется в той папке что индексирует Photoprism
В результате всего этого
Полная и актуальная копия фото/видео с телефона хранится в Nextcloud и одной временной директории на сервере Photoprism
Все новое, что появляется автоматом разбирается по датам и копируется в папку с датой внутри папки которую индексирует Photoprism, удаление фоток на телефоне на это никак не сказывается.
Враги, взломав Nexcloud снаружи получат доступ максимум к тому что хранится на нем, установление соединений из DMZ в LAN запрещены.
Железо
Nexcloud - Raspberry PI 4 Model B + внешний USB SSD
Photoprism / Zabbix: Мать/проц/память - ASRock J5040-ITX / интегрированный Intel Pentium J5040 / 8G, HDD - 4 ТБ WD Purple [WD42PURZ] x 2 (в виде md raid1), SSD - 250 ГБ 2.5" SATA Samsung 870 EVO [MZ-77E250BW] (на нем живет временная папка. с фотками, mysql для photoprism, а так же его данные типа превьюшек), корпус - Thermaltake Suppressor F1
NAS - старенький но живой qnap с 1 гигом памяти (распаяна, расширить нельзя)
Router - Mikrotik hAP ac (RB962UiGS-5HacT2HnT)
Это все что хотелось рассказать о замене Google Photos :) и немного о другом.
Замена WordPress для мини бложека
Раньше держал для бложика в который пишу раз в 2 - 3 месяца всякую техно ботву, WP с mysql на VM зачем то. Было это на очень недорогом Digital Ocean, счас с оплатой надо исхитряться, перешел на другого провайдера с оплатой тут и VMками в Германии, недавно подумал - "а зачем ?". И ответ сначала заставил себя ждать, а потом вообще отказался приходить. И пошел искать всякое без этих всех php и прочих mysql.
И нашел систему сборки статичекских файликов сайта. То что нужно для моих примитивных хотелок. Сначала наткнулся на https://jekyllrb.com/, повозился с установкой всех этих ruby и gem пактетов, разобрался как запинать автосборку на github pages, перенес пару постов, и даже вроде понравилось, но пришел бывший коллега и сказал что у него на 80 постах сборка уже тормозит и посоветовал посмотреть в сторону https://gohugo.io/.
И вот он очень понравился
Один бинарник на go (а не эта возня с ruby и gem как у jekyll)
Автосборка отлично работает в github на github pages
Если завтра не будет доступа к github / github pages то собрать сайт локально и выложить куда-то вообще не проблема, требования минимальны
Есть поддержка google analytics из коробки
Куча тем
Удалось выложить даже видео в посте
Он нереально быстр
всем добра и автоматизации