Замена облакам в нашем кружке «oч.умелые ручки»

Последнее время доверие к облакам как-то резко упало, и пока кончалась годовая подписка на 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 раз в час происходит следующее

  1. Rclone с сервера Photoprism синкает локальную директорию с Nexcloud (с удалением удаленного в Nexcloud)

  2. Посинканное разбирается по датам и копируется в директорию с фотками в директорию содержащую дату

  3. Photoprism пинается на предмет индексации директории с фото в процессе чего он находит новое, его индексирует и оно появляется в интерфейсе

  4. Если удалить фото на телефоне оно удалится и в Nexcloud и во временной директории на Photoprism, но при этом останется в той папке что индексирует Photoprism

В результате всего этого

  1. Полная и актуальная копия фото/видео с телефона хранится в Nextcloud и одной временной директории на сервере Photoprism

  2. Все новое, что появляется автоматом разбирается по датам и копируется в папку с датой внутри папки которую индексирует Photoprism, удаление фоток на телефоне на это никак не сказывается.

  3. Враги, взломав Nexcloud снаружи получат доступ максимум к тому что хранится на нем, установление соединений из DMZ в LAN запрещены.

Железо

  1. Nexcloud — Raspberry PI 4 Model B + внешний USB SSD

  2. 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

  3. NAS — старенький, но живой qnap с 1 гигом памяти (распаяна, расширить нельзя)

  4. 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/.

И вот он очень понравился

  1. Один бинарник на go (а не эта возня с ruby и gem как у jekyll)

  2. Автосборка отлично работает в github на github pages

  3. Если завтра не будет доступа к github / github pages то собрать сайт локально и выложить куда-то вообще не проблема, требования минимальны

  4. Есть поддержка google analytics из коробки

  5. Куча тем

  6. Удалось выложить даже видео в посте

  7. Он нереально быстр

e3d92554b11b0488449de5eaae42824b.png

всем добра и автоматизации

© Habrahabr.ru