В этом посте я расскажу как работает моя домашняя инфраструктура, на чем крутятся сервисы, как они между собой связаны и зачем нужны
Предусловия
Я меняю дома и квартиры в среднем раз в два года и все они, разумеется, съемные
Поэтому у меня нет желания оборудовать полноценную серверную комнату, охлаждать ее отдельным кондиционером и связывать все девайсы стагигабитной оптикой
Вся моя домашняя экосистема сервисов и железяк должны
-
Умещаться в один небольшой чемодан в случае очередного переезда
-
Собираться на новом месте за вечер при помощи 5 метров Ethernet кабеля, скотча, WiFi на одном роутере и конфигания доступа методом "пробрось порты, дальше оно само"
-
Работать в любом месте независимо от наличия внешней сетки и при этом автоматически подключаться к сервисам снаружи
-
Не требовать от меня усилий по поддержанию сети. Я не хочу проводить больше времени за починкой инфры, чем за ее использованием
При этом, я хочу
-
Управлять домашней автоматизацией и отслеживать состояние дома в плане температуры, климат-контроля и прочих штук, которые попадают под понятие "умный дом"
-
Иметь локальную независимую медиа-библиотеку. Это музыка, фильмы и сериалы, облачное хранилище и прочий контент, который лежит на SSD и доступен из локалки и, если есть, внешнего Интернета
-
Хостить свои сайд-проекты, которым не нужен 99.9 uptime, вроде dev-окружений телеграм-ботов и графаны для собирания метрик
-
Иметь возможность менеджить учетные записи, чтобы все что описано выше работало для нескольких пользователей
Теперь я покажу, как всего этого достичь с помощью трех одноплатников, пяти метра провода и базового роутера от провайдера
Умный дом
Для того, чтобы автоматизировать домашние мелочи, вроде ежедневной уборки и нагревания воды, я использую Home Assistant
Это, в последние пять лет, самый популярный способ построить домашнюю автоматизацию, и я, откровенно говоря, горд тем, что успел поконтрибьюитить в развитие сервиса еще до того, как с ним случился успех
Выглядит мой "дом" как набор метрик и переключателей
Железки и датчики разделены по комнатам, чтобы удобно было понимать где что происходит. При этом все, чем я не пользуюсь (а это еще примерно два таких экрана) вынесено со стартового дашборда в автоматизации
Пример работы автоматизации можно посмотреть здесь
Этот выключатель управляет бойлером: он греет воду ночью и не греет днем. Это позволяет не перегревать квартиру паразитным теплом и чутка экономить на ночном тарифе
Поскольку, я говорил, что все устройства должны быть съемными и легкими, никакого полноценного умного выключателя, который устанавливается прямо в стену, я заводить не хочу. Вместо этого, я использую Switch Bot
Эта нашлепка умеет нажимать кнопку и отжимать ее обратно по команде через Bluetooth, а также поддерживает расписания
Особенно удобно, что такая имитация нажатия не влечет необходимости сертифицироваться по электробезопасности, что в большинстве мест где я жил обязательно при любых изменениях электрической разводки
Половина IoT-штук, которые у меня есть, работают через Bluetooth LE, как и SwitchBot выше, причем они от разных производителей. Это приводит меня к трем разным вариантам огранизации управления
-
Использовать кучу нативных приложений, которые устанавливаются на мобилку, и не использовать единый интерфейс вообще
-
Завести официальные гейтвеи, которые будут прокидывать трафик от IoT-штук в публичный интернет и настроить сбор данных через Google Home / Alexa / Yandex / Apple - не важно какой, они, как правило, все поддерживаются
-
Научиться перехватывать BLE трафик и уминать его сразу в Home Assistant без петли "до Сан-Франциско и обратно"
Очевидно, я выбираю третье, поскольку зависеть от серверов Яндекса или Google Home я не очень хочу, а терять возможность управлять чайником, потому что провайдер сломал мне оптику - это перебор
Поэтому на отдельной, собранной на коленочке ESP-32, у меня крутится ESPHome с настроенным BLE Proxy
Задача этого сервиса - собирать весь BLE трафик и, как есть, форвардить его в домашнюю LAN, чтобы Home Assistant мог получить данные и красиво их отобразить
Рядом, на той же задней дверце шкафа в спальне, у меня крутится Pi Zero, которая запитывает ESP32 и является хабом для CO2-датчика и дозиметра (не спрашивайте)
Сам же Home Assistant развернут на Rasbperry Pi 4, которая Ethernet-кабелем подключена к домашнему роутеру
И здесь же лежит Zigbee гейтвей для второй половины домашних датчиков, которые используют этот протокол вместо BLE для обмена данными
Кроме умного дома на этой Rasbperry крутится еще Grafana, с помощью которой я отслеживаю метрики своих проектов
Медиасервер
Для того, чтобы слушать музыку, смотреть фильмы и не зависеть от подписок на всякие спотифаи и тидалы, у меня развернута другая Rasbperry Pi 5, поскольку мощностей более старых поколений здесь уже не хватает
Она связана с тем же домашним роутером, и к ней же подключен SSD на два терабайта, который и является моим файлохранилищем
Причин, почему я взял дорогой SSD вместо обычного жесткого диска, три:
-
Он меньше шумит и не занимает много места
-
Его можно отцепить от малинки и взять с собой в поездку туда, где доступа к домашней сети не будет
-
Я не хочу решать вопросы бекапов и строить отказоустойчивые RAID-массивы. Топовые SSD работают настолько стабильно, что скорее со мной что-то случится, чем железка сломается
Так же к малинке по HDMI подключен домашний 4K TV и это ответ на вопрос, почему малинка не стоит в шкафу там же где и первая
Чтобы смотреть фильмы и слушать музыку локально, у меня поднят Kodi. Он работает изумительно для домашнего использования, и его не нужно пытаться использовать для чего-то еще
Для удаленного доступа к той же медиатеке из любой точки мира, где есть Интернет, у меня развернут Plex с вечной подпиской на Plex Pass, который заменяет мне стриминги, с которыми в последние пять лет больше проблем, чем пользы
При этом Plex достаточно умен, чтобы транскодировать поток из lossless FLAC в OPUS 256 в случае, если я подключен через LTE с низкой скоростью или ограничениями по трафику
Фильмы оно играет ничуть не хуже, чем музыку, при этом адаптивный транскодинг настолько незначительно нагружает 4 ядра малинки, что одновременное проигрывание трех 4К видео по сети и вывод другой картинки на экран через Kodi, суммарно, дает примерно 50% утилизации и позволяет нагрузить Rasbperry чем-нибудь еще
Файловое хранилище
Статистически, у меня получается что облако на 2 терабайта, которое я покупаю у Apple, переживает уже третье локальное хранилище. Поэтому все важные файлы я стараюсь хранить там, и просто держать локальные рабочие копии синхронизированными
Поэтому домашняя файлопомойка для меня, это или способ наполнять медиатеку, или хранить приватные файлы, которые никогда не должны попадать в Интернет
Так что я просто поднял Samba Server и в целом мне этого достаточно
Внешний доступ
Если с локальным доступом все понятно, и устройства просто доступны по адресу pi.local или pi5.local, а сервисы, в большинстве случаев, вообще умеют в auto-discovery, то с доступом к домашней инфраструктуре "извне" приходится заморачиваться отдельно
Мне уже 12 лет принадлежит домен grakovne.org, который сейчас используется, чтобы обеспечивать мне доступ к домашним серверам, где бы я ни был
Традиционно я арендую статичный IP адрес у провайдера, но в случае с текущим домом у меня такое не вышло
Поэтому я перенес DNS записи к Cloudflare и настроил Home Assistant обновлять A-записи раз в час так, чтобы они всегда указывали на адрес моего роутера
Иногда у меня бывают проблемы с доступом, но длятся они недолго и проходят самостоятельно. Это все еще хуже, чем нормальный постоянный IP, но лучше чем ничего
Так внешний трафик попадает ко мне домой. Дальше домашний роутер пробрасывает все с портов 80 и 443 на ту малинку, где развернут умный дом, а nginx на ней по поддомену определяет, куда я хотел попасть, и с помощью реверс-прокси роутит меня на сервис, который слушает нужный порт
Правильнее было бы сделать это прямо на роутере, но я не хочу зависеть от инфраструктуры провайдера и каждый раз настраивать маршрутизацию заново, да еще и разными способами
Чтобы достучаться до Plex и Samba, которые находятся на другом Rasbperry, я просто пробросил с роутера стандартные порты для этих сервисов напрямую и пользуюсь нативными клиентами MacOS / iOS, которые умеют к ним подключаться
Наличие собственного домена, кстати, еще и решает проблему с push-нотификациями от Дома, избавляя меня от необходимости арендовать платный сервис от NabuCasa, который мне не очень нравится
Что до адреса grakovne.org без поддоменов, то я попросил нейросетку написать для меня небольшую заглушку
Безопасность
В среде разработчиков интернета вещей есть шутка о том что в аббревиатуре IoT буква S обозначает "Secure"
За последние несколько лет ситуация с утечками несколько улучшилась и из абсурдной начала быть просто ужасной, так что поводов для беспокойства достаточно
SSL
Для доступа извне у меня, как я говорил, настроен Nginx. Это дает мне возможность получить SSL сертификат и настроить принудительный https для каждого поддомена в отдельности
Let's Encrypt это, конечно, не миллион евро в кармане, но по крайней мере он решает проблему перехвата пакета и успокаивает браузеры, которые в последние пять лет откровенно утомительны в своих требованиях к наличию валидного SSL чтобы отрисовать страничку за пределами .local доменной зоны
Доступы к IoT-вещам
Все мои домашние датчики и прочие пылесосы, так или иначе управляются из Home Assistant, который расположен в той же сети. Поэтому внешний Интернет им самим не нужен, даже если они не согласны
Каждому такому устройству я назначил статичный IP адрес и запретил доступ к WAN на стороне роутера, поэтому, если вдруг датчик влажности для комнатного цветка соберется обновить прошивку и, после этого, сломаться в три часа ночи, этого не произойдет
Исключение, к сожалению, составляют кондиционеры. Я не нашел готовой интеграции для локальной работы, и мне, откровенно говоря, лень написать свою, поэтому они торчат напрямую в Интернет и зарегистрированы в Hisence облаке
!
В остальном настройки безопасности базовые: сервисы закрыты аутентификацией, лишние порты роутера недоступны снаружи, на случай если нужно подключиться к чему-то напрямую из внешней сети, на одном из хабов Raspberry на нестандартном порту поднята SSH с авторизацией RSA-ключом
Производительность
Самая нагруженная часть всей домашней инфры - это роутер
После приблизительного подсчета выяснилось, что он собирает в сеть только из бытовой техники
-
Четыре Macbook (два комплекта из рабочего и личного ноута)
-
Два телефона
-
Две читалки Kindle, которые постоянно подключены к WiFi
-
Пятую PS и еще несколько мелких игровых гаджетов
-
Три кондиционера, которые развернуты в интернет
-
Дозиметр (не спрашивайте, читайте)
Кроме этого, роутер обслуживает три Rasbperry (четверка, пятерка и Zero), а так же все IoT-штуки, которые подключены по WiFi и является проксей для BLE-трафика, в который вкладываются не только термометры и наушники, но и всякие там стиральные машинки с чайниками
При этом, я не влияю на конфиг роутера и его модель
Пока что мне везет и коробочки от Huawei достаточно хороши, чтобы справляться этим технопокалипсисом, но в случае если мощности не хватит, я смогу поднять более быстрый и мощный Keenetic, а стоковый роутер от провайдера превратить в GPON терминал
Для отслеживания нагрузки на малинки у меня на каждой из них поднят rpimonitor, который показывает насколько железки готовы обслуживать мои запросы
Я считаю, что верхняя планка постоянной утилизации ресурсов не должна превышать 40%, а в пике использования - 80%
Именно поэтому я разнес медиацентр и сервер с IoT по разным железкам и больше не думаю о том, что если я вдруг решу посмотреть кино в поезде, то у меня может не сработать скрипт ежедневной уборки дома или отвалиться датчик протечки в ванной
Автономность
Будем честны, если Интернет пропадет совсем, то у меня будут другие задачи. Поэтому я хочу чтобы моя сеть могла переживать кратковременные перебои со внешней сеткой, которые связаны с инфраструктурой провайдера или перебитыми кабелями в парадной
За счет того, что все сервера и устройства находятся в одной подсети, Интернет им особо не нужен
Я старательно избегаю использовать интеграции с популярными сервисами вроде Alexa. Не хочу оказаться в ситуации, когда сервер шкафу не может отправить команду бойлеру в соседнем шкафу из-за того, что на другом конце мира порвалась оптическая линия
Сейчас, если я просто сижу в кресле с чашкой кофе и смотрю кино, после отключения внешней сети ничего не произойдет: мои устройства продолжат обмениваться данными друг с другом через роутер, а данные все еще будут храниться на SSD и моментально доступны
Разумеется, пропадет доступ к кондиционерам, которые не интегрированы в домашнюю сеть, и это проблема, которую я когда-нибудь решу, причем скорее всего, очередным переездом
Расширение
Когда я работал в Arrival (и это больше не под NDA), основная идея фабрики состояла в том, что всегда можно принести любой механизм в цех сборки, и он должен начать работать без донастройки и программирования
Этой же идеи я придерживаюсь у себя дома. Я хочу, чтобы любой гаджет, который я достал из коробки и подключил к интернету, требовал от меня скачать нужную интеграцию и после этого бы просто работал
Сначала это было сложно, но в последние три года стандартизация IoT работает так хорошо, что, например, датчики полива для растений я действительно просто забрал из доставки Amazon, вытащил из заводского блиcтера, создал новый дашбор в Home Assistant и, после этого, ни разу не вспоминал о них
И я очень горд тем, что это не заслуга Xiaomi, которые сделали эти датчики. Это моя персональная победа. Потому что датчик отправил BLE пакет, моя Bluetooth-proxy коробочка умяла его в Home Assistant, а тот распознал этот сигнал и предложил скачать нужную интеграцию в один клик
Что касается медиацентра, там то же самое: если файл с контентом попадет в нужную папку, то в течение пары минут Kodi и Plex проиндексируют файл независимо друг от друга, вытянут из Интернета недостающие обложки, описания и рейтинги, и предложат посмотреть мне фильм в отличном качестве безо всяких подписок
Итого
Я говорил, что хочу умный дом, который делает мою жизнь проще, не требует особой настройки, монтируется в мире физических вещей на полоски скотча и проволоку и не стоит для меня ежемесячных денег
Эту конфигурацию, не считая кондиционеров, которые всегда прикручены к своим стенам, я таскаю за собой уже довольно давно. Как минимум она пережила переезд из Питера на Кипр, и потом в Белграде приросла еще одним хабом на пятой малинке, потому что 4K видео сами себя на лету не транскодируют, знаете ли
И это, определенно успех
Теперь, когда вы прочитали этот пост, вы можете поднять у себя примерно то же самое с похожим результатом. Для этого вам нужно методично прокликать по ссылкам, которые я оставил по тексту на сервисы и платформы, или найти их же все в следующем абзаце
https://www.home-assistant.io/
https://www.mijia-shop.com/product/xiaomi-smart-home-gateway-3/
https://www.raspberrypi.com/products/raspberry-pi-zero/
https://esphome.io/components/bluetooth_proxy.html
https://www.home-assistant.io/integrations/cloudflare/
https://github.com/XavierBerger/RPi-Monitor
Я искренне считаю, что все что может быть упрощено автоматизацией, должно быть упрощено автоматизацией и я не думаю, что все, что я сделал - действительно сложно и требует какой-то специальной подготовки
Автор: Макс Граков