Последнее время доверие к облакам как-то резко упало, и пока кончалась годовая подписка на Google One на 2Т было время подумать, что делать дальше. В итоге родилась старая концепция - 'храним данные дома'. И вот что их этого получилось.

Google Photos

Облакам доверия нет, но старое желание синкать фото и видео с телефона не пропало. При этом не хотелось бы вручную разбирать накопленный в google photo архив размером в 255G, а хотелось некоторой автоматизации в виде разбора фоток по лицам, местам, датам и возможности поиска по ключевым словам типа ‘море’ или ‘пятигорск’.

Опыт был против высовывания всего подряд в интернет поэтому была задумана и запилена классическая схема с DMZ. Ну не совсем сейчас а она была сделана давно. Если вы не в курсе что такое DMZ то это просто. Просто подсеть в которой живут сервисы доступны с интернета (у нас же типа клауд) но которая не может ходить на сервисы в LAN сама.

Секурная классика
Секурная классика

Софт того что притворяется Google Photos

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 раз в час происходит следующее:

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

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

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

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

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

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

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

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

Железо

  1. Nextcloud - 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. Он нереально быстр.

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

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


  1. Javian
    15.11.2022 06:00

    офф Удивил зоопарк железа. Загнать это в одну ASRock J5040-ITX нельзя?


    1. sergeygals Автор
      15.11.2022 08:08
      +1

      ну это не весь зоопарк, есть еще octoprint и homeassistant. ну и на серваке что пожирнее еще всякое кроме перечисленного живет, не хотелось бы что бы онo в интернет торчалo


  1. ivanstor
    15.11.2022 06:05

    Вопрос. Photoprism AI сортировки делает локально или картинки куда-то посылает? И какой вариант Вы у себя установили — платный или бесплатный?


    1. O_Nayre
      15.11.2022 07:22
      +2

      Все локально, скорость зависит от размеров библиотеки. Поигрался с пару недель в бесплатной версии и снес докер-контейнер, так как на J5040-ITX прекрасно ставится последний DMS7 с photos (а у меня необходимость раздельных библиотек на каждого пользователя, можно конечно несколько контейнеров было поднять, но...)


      1. sergeygals Автор
        15.11.2022 08:13

        мне специализированного NAS на QNAP хватает, какой то мильен процессов на слабом железе которые фик отключишь. одна из целей всего этого как раз получение домашнего сервера на полноценной OS которую можно целиком контролировать.


    1. sergeygals Автор
      15.11.2022 08:10

      все локально, и бесплатная версия, мне вполне хватает ее функционала на самом деле, главное что бы она со временем рекламу не стала в медиатеку добавлять :)


  1. aik
    15.11.2022 09:02
    +1

    Photoprism интересный, но мне не нравится то, что у него слишком большая база — или же хреновое качество превьюшек. На моих двух терабайтах превьюшки изначально 800 гигов составляли, смог ужать только до пятисот при сохранении более-менее пристойного качества (2000px по длинной стороне).

    Плюс мне не нравится то, что там структура практически плоская, нет подпапок. У меня фото по годам/дням разложены, а мне выводятся только папки дней.

    Ну и для нескольких пользователей вроде как нельзя настроить.


    1. sergeygals Автор
      15.11.2022 09:55

      мне кажется призма как раз для того и сделана что бы папки были не важны :) у меня, кстати, в календаре разложено по Месяц Год, типа 'Март 2016'


      1. aik
        15.11.2022 10:02

        У меня даже на один день может быть пара тысяч фото. Потому календарь тут не спасёт.
        В папках оно у меня живёт как год/месяц/день_название_фотосессии

        И призма папки выводит. Но плоским списком, который задолбаешься проматывать.
        И альбомы вложенные не умеет.


        1. sergeygals Автор
          15.11.2022 10:14

          по моему это уже профессиональный кейс который требует профессиональных инструментов. у меня так, 'для дома, для семьи' и за 21 год всего 28000 фото, призма для моего кейса практически идеальна :)


          1. aik
            15.11.2022 10:20

            Так для вполне для дома — фото из поездок.


  1. amkartashov
    15.11.2022 09:02
    +2

    Статья хорошая, но есть недочёты.

    • правописание хромает

    • кода нет (ансибл, конфиги)

    • часть про блог лишняя


    1. sergeygals Автор
      15.11.2022 10:08

      • все мы не идеальны :)

      • роли в ансибле не стал выкладывать потому что

        • захордкожены под меня

        • содержат настройки удаленных vpn сервисов

        • тупы до невозможности. Ну например роль призмы это .timer и .service для systemd в user space для переодического запуска переиндексации + docker-compose.yaml.j2 с очень минимальным количеством измененный по сравнению с https://docs.photoprism.app/getting-started/docker-compose/, + плейбук которые это все копирует и запускает. А конфиг в виде файла есть только у caddy2 в котором тоже все очень просто и еще у zabbox агентов. Нудная скукота которую каждый может сделать себе сам под свои нужды :)

      • да, возможно зря я ее приклеил, ну пусть будет как будет :) все таки в заголовке об облаках во множественном числе. первый пост, по традиции, должен быть с косяками :)


  1. kulhaker478
    15.11.2022 11:09

    Спасибо, про призму не знал до этого момента, буду теперь домашних спрашивать, а надо ли оно им) Есть идея поднять подобный конфиг, но на одной машине:

    Отсюда вопрос - А чем такое чревато? Уменьшаются возможные точки отказа, но оно ведь и в обратную сторону работает, отказывает хост машина - отказывает всё..


    1. sergeygals Автор
      15.11.2022 14:56
      +1

      лично мне не нравятся в ней накладные расходы на виртуализацию :) ну и производные в виде шума вентиляторов для охлаждения. но для build системы это наверное неизбежное зло


  1. Didimus
    15.11.2022 12:07

    Почему фотопризм развернут не в дмз?


    1. sergeygals Автор
      15.11.2022 14:49

      ставить его на малинку с одним usb ssd так себе идея, а переносить сервак целиком в дмз вообще не хочется. пусть на дом работает. доступ через vpn в домашнюю сеть стопудово надежнее чем торчание наружу целого сервера с кучей разных сервисов


      1. Didimus
        15.11.2022 15:42

        Сервер приложений в дмз, сервер бд в глубоком тылу. Стандартная схема


        1. sergeygals Автор
          15.11.2022 15:52

          ну для меня она не настолько очевидна, она мне кажется даже не очень безопасной. вот сломал враг сервер приложений и получил доступ к сервере баз данных, сломал еще и его (сервер же приложений к базе коннектится да ?) и получил доступ в глубокий тыл. для меня дмз это та зона их которой коннектится в глубокий тыл вообще никак нельзя, только из глубокого тыла в сервисы в дмз


          1. Didimus
            15.11.2022 16:01

            Дмз могут сломать саму ОС, например. Тогда доступа к бд не получат.


  1. b00
    15.11.2022 12:13

    Подскажите, а не сравнивали перед установкой Phtoprism с immich, librephoto?
    И чем посты с WP на статику переносили - вручную?


    1. sergeygals Автор
      15.11.2022 15:32
      +1

      1. не, не пробовал, прогнал призму на 50 гигах, мне все понравилось, автоматизировал установку через ansible + подкрутил некоторые настройки и моменты и счас оно работает ровно так как мне хотелось

      2. Я начал с jekylly поэтому сначала перегнал через https://import.jekyllrb.com/docs/wordpress/ (тулза правда гавно, куча html кода оставляет, картинки надо вручную докачивать), а потом бабахнул https://github.com/SchumacherFM/wordpress-to-hugo-exporter, он поприятнее но тоже не идеален


  1. garwall
    15.11.2022 18:26

    Хаха, это поветрие, похоже. только сегодня сообразил бложик на хуго с автосборкой в дженкинсе по пушу и проксированием вебхуков (так как дженкинс на моем локальном ноуте вертится)


    1. sergeygals Автор
      15.11.2022 19:18


  1. kt97679
    16.11.2022 04:54

    Можно попросить вас подробнее рассказать как вы используете телеграм для уведомлений мониторинга?


    1. sergeygals Автор
      16.11.2022 06:46

      В 6.2 версии это есть из коробки https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/media/telegram?at=release/6.2 выглядит примерно вот так


      1. kt97679
        16.11.2022 08:16

        Все понял, спасибо!


  1. Disamas
    17.11.2022 22:20

    По сравнению с Sinology Photos есть ли преимущества?


    1. sergeygals Автор
      17.11.2022 22:21

      Не знаю, читать надо, не пробовал :)