Последнее время доверие к облакам как-то резко упало, и пока кончалась годовая подписка на Google One на 2Т было время подумать, что делать дальше. В итоге родилась старая концепция - 'храним данные дома'. И вот что их этого получилось. Облакам доверия нет, но старое желание синкать фото и видео с телефона не пропало. При этом не хотелось бы вручную разбирать накопленный в google photo архив размером в 255G, а хотелось некоторой автоматизации в виде разбора фоток по лицам, местам, датам и возможности поиска по ключевым словам типа ‘море’ или ‘пятигорск’. Опыт был против высовывания всего подряд в интернет поэтому была задумана и запилена классическая схема с DMZ. Ну не совсем сейчас а она была сделана давно. Если вы не в курсе что такое DMZ то это просто. Просто подсеть в которой живут сервисы доступны с интернета (у нас же типа клауд) но которая не может ходить на сервисы в LAN сама.  OS - Linux Ubuntu 22.04 и на nextcloud и на photoprism. Раньше на nextcloud жил  Arch Linux,  но, недавно воткнулся в то когда то давно поставил туда 32 разрядную систему на которой последние релизы Nextcloud отказываются работать. Ну и зоопарк из OS не очень удобен для автоматизации развертывания. Ansible - ввиду того что дома стало аж 2 сервера плюс еще есть VMки снаружи вся настройка обоих серверов была перенесена в ansible, и конфигурирование происходит только через плейбуки и хранится в гите. Nextcloud (с mysql) - ставился через snap. Дефолтный, 80ый, порт был перенесен на другую чиселку. Caddy2  (на сервере с nextcloud). Вообще nextcloud поставленный из snap умеет let’s encrypt сертификаты, но мне не понравилось, что даже при обращении по IP он всем говорит что он nextcloud, просто домен не правильный. Поэтом в качестве реверс прокси был установлен 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х TB дисках. Живет на отдельном 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 - синкает Nextcloud по webdav на временную папку на сервере Photoprism. Bash - тупой скрипт который разбирает то что прилетело с Netxcloud по датам и копирует в папку с фотками на md raid,  а так же дергает Photoprism на тему индексации новых фоток. На телефон был установлен http://www.tacit.dk/foldersync который синкает фото в Nextcloud с удалением (то есть если удалил фотки в телефоне, то они удаляются и в Nextcloud). Притом вручную, сейчас нет полной обратной синхронизации как в Google Photos, то есть удаление фотки в Photoprism не приведет к удалению ее на телефоне, а удалять в нескольких местах никакого желания. Поэтому сейчас фоткаю - снимаю видео, потом в свободное время удаляю лишнее в виде дублей и неудачного. И запускаю ручной синк через foldersync.  В это время на сервере Photoprism раз в час происходит следующее: Rclone с сервера Photoprism синкает локальную директорию с Nextcloud (с удалением удаленного в Nextcloud). Посинканное разбирается по датам и копируется в директорию с фотками в директорию содержащую дату. Photoprism пинается на предмет индексации директории с фото в процессе чего он находит новое, его индексирует и оно появляется в интерфейсе. Если удалить фото на телефоне оно удалится и в Netxcloud и во временной директории на Photoprism, но при этом останется в той папке что индексирует Photoprism. В результате всего этого: Полная и актуальная копия фото/видео с телефона хранится в Nextcloud и одной временной директории на сервере Photoprism. Все новое, что появляется автоматом  разбирается по датам и копируется в папку с датой внутри папки которую индексирует Photoprism, удаление фоток на телефоне на это никак не сказывается. Враги, взломав Nextcloud снаружи получат доступ максимум к тому что хранится на нем, установление соединений из DMZ в LAN запрещены. Nextcloud - 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 :) и немного о другом. Раньше держал для бложика в который пишу раз в 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 из коробки. Куча тем. Удалось выложить даже видео в посте. Он нереально быстр. Всем добра и автоматизации.  DevOps/SRE