В этом цикле статей мы опробуем современные технологии разработки для создания компонента умного дома Home Assistant. Подробно и поэтапно рассмотрим процесс создания рабочего окружения, напишем примитивный компонент для умного дома, усложним его и сделаем полезным.
Это первая статья из запланированного цикла о создании собственного компонента для системы умного дома Home Assistant. Здесь мы настроим среду разработки VSCode и настроим подключение к серверу с использованием Remote-SSH.
Изначально я не хотел делить статью на части, но без этого она была бы огромной, поскольку весьма подробно описан процесс разработки компонента на всех этапах:
- Настройка среды разработки VScode;
- Подключение VSCode к серверу;
- Настройка Docker и Docker-compose;
- Изучения архитектуры системы Home Assistant;
- Анализ REST API внешнего сервиса;
- Создание собственного компонента;
- И, может даже, попробуем добавить его к основному коду Home Assistant.
Читая про современные технологии, безусловно, хочется познакомиться с ними, оценить эффективность и удобство их применения. Для создания собственного простого компонента будем использовать Docker. Это современно, удобно, интересно =) Для разработки я использую самодельный NAS (сетевое хранилище, сервер), на который установлен Docker Engine.
Потому рабочий процесс будет происходить так: запускаем VSCode на компьютере, подключаемся с помощью Remote-SSH к серверу, пишем код компонента, запускаем docker-контейнер, тестируем. Повторяем до получения желаемого результата.
Ремарка: не являюсь профессиональным разработчиком, интерес к технологиям это хобби, потому любой может повторить и расширить мой опыт.
Постановка задачи: настроить современное окружение для разработки простого компонента Home Assistant.
Это статья будет проста и понятна для тех, кто:
- Имеет небольшой опыт с OS Linux;
- Представляет, что такое docker-контейнеры;
- Может по образцу написать команды языка программирования Python.
Что потребуется:
- Компьютер для разработки. У меня это обычный десктоп с Windows 10;
- Сервер с установленным Docker ( Ubuntu 18.04.03 LTS, Docker Engine CE 19.03.4, Docker-compose 1.17.1 );
- Локальная сеть, объединяющая эти два устройства.
1. Подключение VSCode к удалённому серверу используя расширение Remote-SSH
Установим среду разработки VSCode, скачать по ссылке. Я использую версию без инсталлятора (вариант *.zip для windows 10).
Для начала необходимо подключиться к удалённому серверу с Docker. Для этого установим расширение Remote-SSH. Для поиска расширения в Marketplace используем сочетание клавиш Ctrl+Shift+X (или на вкладке слева иконка Extensions – рис. 1a). Вводим в поисковую строку (рис. 1b) название расширения, находим Remote-SSH (рис. 1c) и устанавливаем.
Обратим внимание на область, выделенную красной рамкой в левом нижнем углу экрана. После установки (Рис.2a) появится иконка «><» и надпись, что расширение включено (Рис.2b).
Кликнем на иконку «><» (Рис. 3a) и в строке команд появятся команды расширения Remote-SSH. Выбираем «Open configuration file…» (Рис. 3б). Из появившегося списка выбираем конфиг, который хранится в папке пользователя (Рис. 4).
Начальное состояние конфигурационного файла показано на рис.5 и листинге 1.
Теперь необходимо настроить параметры SSH-подключения к своему серверу. Поскольку мой сервер настроен на авторизацию только по ключам (это правильно, с точки зрения безопасности, да и удобнее), то при настройке соединения необходимо указать соответствующий параметр IdentityFile. Список параметров конфигурационного файла:
- Host – псевдоним (пишем удобное для себя название);
- Hostname – домен или IP-адрес сервера;
- User – имя пользователя, под которым будет происходить аутентификация;
- IdentityFile – путь к приватному ключу.
Мой конфиг выглядит так (Рис. 6, Листинг 2):
Пробуем подключиться: нажимаем на иконку “><” и в строке команд (вверху экрана) выбираем «Remote-SSH: Подключиться к хосту…» и выбираем сконфигурированное подключение (в моём случае – «NAS» ) - Рис. 7 . Соглашаемся сделать отпечаток ключа (Рис. 8).
И-и-и здесь появляется ошибка (рис.9). Закрываем окно ошибки, нажав на крестик в правом верхнем углу окна диалога. Листаем в окошке «OUTPUT» вверх (рис.10, область в красной рамке) и находим причину ошибки (рис.10):
Ошибка говорит о том, что приватный ключ слишком «открытый», а необходимо, чтобы он был недоступен другим – этакий приватный ключ лёгкого поведения =). Чтобы обезопасить ключ и продолжить настройку расширения необходимо дать права чтения только владельцу файла ключа. Для этого: кликаем правой кнопкой мыши на файл приватного ключа, выбираем пункт «свойства», вкладка «Безопасность», кнопка «Дополнительно». Удаляем всех, кроме владельца, отключаем наследование (Рис. 11).
Пробуем подключиться к серверу по SSH (по инструкции ниже Рис. 6). Ну… как так-то? Опять ошибка, но уже другая. На Рис.12 красной рамкой выделана область, где показано что права на чтение и выполнение файла приватного ключа есть только у владельца файла. На этом же рисунке стрелкой показана новая ошибка:
Ошибка означает неверный формат приватного ключа. Это возникает в том случае, когда ключ генерируется в Windows использованием PuttyGen. Чтобы устранить ошибку, достаточно сконвертировать приватный ключ в формат OpenSSH. Для этого открываем PuttyGen (где и создавалась пара ключей), в меню сверху выбираем «File» -> «Load private key» и выбираем файл ключа, который используем для SSH-подключения. В меню сверху выбираем «Conversions» -> «Export OpenSSH key» и сохраняем приватный ключ в формате SSH.
Открываем конфигурационный файл SSH-подключения (инструкция ниже Рис. 1) и указываем путь до файла приватного ключа в формате OpenSSH (Рис.14):
ВНИМАНИЕ: для нового файла ключа необходимо повторить предыдущий пункт с правами доступа: дать права на чтение и выполнение только владельцу, остальных пользователей удалить. Теперь пробуем подключиться к SSH-серверу (по инструкции ниже Рис. 6 ).
Ура! Подключение прошло успешно! На стороне сервера установился сервер VSCode и был успешно инициализирован. В левом нижнем углу видим статус успешного подключения к серверу по SSH (Рис. 15).
В следующей статье рассмотрим настройку Docker и Docker-compose.
Для опытных пользователей
Здесь я немного напишу про то как вижу концепцию и разработки, и с какими сложностями пришлось столкнуться. Не обязательно к прочтению. Изначально я рассчитывал, что расширение Remote-Containers позволит подключиться к Docker Engine на NAS и уже в контейнере на удалённом Docker Engine ведём разработку. Но оказалось, что Remote-Containers подразумевает наличие Docker Engine на десктопе. Окей, расширение Remote-SSH (о чём кратко рассказано выше) позволяет нам подключиться к NAS по SSH и взаимодействовать с файловой системой NAS. Пытаюсь настроить Remote-Containers при установленном с помощью Remote-SSH подключении к NAS. Не получается, поскольку функционал Remote-Containers недоступен при активном подключении Remote-SSH.
Поиск информации для понимания и способов решения проблемы дали один вариант: SSH-туннель между десктопом и NAS. Этот вариант тоже довольно неудобен (на мой взгляд), поскольку это не выглядит естественным и автоматизированным (не обеспечивает достойный пользовательский опыт от workflow, ага). Гуглю ещё варианты, нахожу костыли и ожидания сообщества, когда VSCode сможет работать с удалённым Docker Engine без локального экземпляра DockerEngine.
Если вам интересны следующие статьи по этой и смежным темам - подписывайтесь на мой канал!