В этой статье я хочу разобрать один из самых популярных опенсорс-инструментов, Node-RED, с точки зрения создания простых прототипов приложений с минимумом программирования. Проверим гипотезу о простоте и удобстве таких средств, а также рассмотрим взаимодействие Node-RED с облачной платформой на примере Yandex.Cloud.
Написано уже немало статей на тему того, как средства визуального программирования помогают строить приложения интернета вещей, управлять устройствами и автоматизировать дом (управление освещением, автоматизация квартиры часть 1 и часть 2). Но мало кто упоминает о другом полезном свойстве подобных иструментов. Это быстрое прототипирование, то есть эмуляция самих устройств без использования микроконтроллеров и визуализация результатов их работы без глубоких познаний в программировании или веб-дизайне.
Есть ряд ограничений, связанных с хранением данных клиентов в облачных дата-центрах других государств. Поэтому у пользователей зарубежных ресурсов все чаще появляется устойчивое желание использовать гибридные подходы, применять локализованные облачные сервисы, расположенные на территории России. В таких случаях для реализации сценариев интернета вещей вполне оправдано объединение открытых технологий IBM с готовым облачным сервисом Яндекса.
Как гласит первоисточник, Node-RED это инструмент потокового программирования, первоначально разработанный командой IBM Emerging Technology Services и в настоящее время являющийся частью JS Foundation.
В качестве ключевой составляющей Node-RED выступает парадигма потокового программирования, которое было изобретено в 70-х Джеем Полом Моррисоном. Потоковое программирование это способ описания поведения приложения в виде сети черных ящиков или узлов, как они называются в Node-RED. Каждый узел имеет четкую цель к нему поступают некоторые данные, он что-то делает с этими данными, а затем передает их на следующий узел. Сеть отвечает за поток данных между узлами.
Эта модель отлично подходит для того, чтобы представить ее визуально: так она становится более доступной для широкого круга пользователей. Если кто-то пытается разобраться в проблеме, он может разбить задачу на отдельные шаги, взглянуть на поток и понять, что он делает, без необходимости разбираться в отдельных строках кода в каждом узле.
Node-RED работает в среде исполнения Node.js, а для создания или редактирования потока (Flow) используется браузер. В браузере вы можете создавать свое приложение путем перетаскивания необходимых узлов (Node) из палитры в рабочую область и соединять их вместе. Одним кликом по кнопке Deploy приложение разворачивается в среде исполнения и запускается.
Палитра узлов может быть легко расширена путем установки новых узлов, созданных сообществом, а созданные вами потоки могут быть легко переданы в виде файлов JSON.
Node-RED начал свою жизнь в начале 2013 года как совместный проект Ника О'Лири и Дэйва Конвея-Джонса из группы IBM Emerging Technology Services.
Проект стартовал как подтверждение концепции визуализации и манипулирования мэппингами между топиками сообщений в протоколе Message Queuing Telemetry Transport (MQTT). Node-RED быстро стал более универсальным инструментом, который можно было легко расширять в любом направлении.
Исходный код проекта был открыт в сентябре 2013 года. С тех пор он разрабатывался в открытом виде, кульминацией развития стало признание Node-RED одним из фундаментальных проектов JS Foundation в октябре 2016 года.
Со слов авторов:
Название было веселой игрой слов, звучащих как Code Red.
Это название приклеилось к проекту и стало существенным шагом вперед по сравнению с тем, как он назывался в первые несколько дней.
Часть Node отражает суть модели потокового программирования (поток/узел) и основную среду выполнения Node.JS.
Окончательного решения о том, что же означает часть RED, принято так и не было.
Одно из предложений Rapid Event Developer (быстрый разработчик событий), но мы никогда не чувствовали себя обязанными что-либо формализовать.
Мы придерживаемся названия Node-RED."
Node-RED предоставляется по лицензии Apache 2.0. Важно понимать и осознавать условия лицензии по этой ссылке есть краткая выдержка с основными свойствами.
Лицензия разрешает коммерческое использование, но при этом накладывает и ряд ограничений. Вот основные из них: при использовании торговой марки Node-RED (принадлежащей OpenJS Foundation) нельзя ее искажать; кроме того, есть ограничение ответственности (Liability/Warranty) участники проекта не могут быть привлечены к ответственности в случае причинения убытков в процессе некорректного использования их продукта.
Сначала хочу отметить: вся эта затея сугубо самообразовательная и подкреплена только непреодолимой тягой энтузиастов к познанинию нового. Например, хотелось изучить возможности облачных сред и сервисов Яндекса, которые могут быть безвозмездно получены для тестирования своих гениальных идей. Ну а чтобы была польза для дела, было решено посмотреть, насколько совместимы реализованные в проекте Node-RED узлы (из коробки на уровне MQTT) с интерфейсами сервиса IoT Core.
Задача выглядит просто:
Чтобы было повеселее, предположим, есть гениальная идея создать уникальное приложение Подключаемых автомобилей, которое требует быстрой апробации некоторых концепций. Пусть создание прототипа будет первым шагом на этом пути.
Для создания виртуальной машины, на которой мы далее запустим Node-RED, зайдем в Yandex.Cloud и перейдем в Консоль. В сервисе Compute Cloud нажимаем Создать ВМ.
Задаем машине любое разрешенное имя и в качестве операционной системы выбираем CentOS. Для запуска Node-RED подходит любая из приведенных ОС, но в статье мы рассмотрим порядок работы только с CentOS.
Выполнение тестового сценария не требует больших ресурсов, поэтому выставляем все на минимум. Этот ход также позволит сэкономить ресурсы пробного периода, если вы решили развернуть Node-RED только для ознакомления.
Работа с ВМ будет осуществляться через SSH, поэтому пусть у машины будет автоматически выделенный публичный адрес.
Для подключения к машине по SSH необходимо указать публичный
ключ. Сгенерируем SSH-ключи командой ssh-keygen -t rsa -b
2048
в терминале, потребуется придумать ключевую фразу.
Теперь требуемый ключ хранится в ~/.ssh/is_rsa.pub
,
копируем его в поле SSH-ключ и нажимаем Создать
ВМ.
После завершения подготовки ВМ в сервисе Compute Cloud появится наша машина с заполненным полем Публичный IPv4.
Также нам необходим логин, который мы указывали на предыдущем
шаге в разделе Доступ. Выполним подключение к машине по
SSH командой $ ssh <login>@<IPv4>
. При
подключении потребуется ввести ключевую фразу, которую мы указали
на этапе генерации ключей.
$ ssh <login>@<IPv4>Enter passphrase for key '/Users/<user>/.ssh/id_rsa': Last login: Wed Jul 15 08:42:53 2020 from <your host ip>[<login>@node-red ~]$
Теперь мы можем установить Node-RED. Самый удобный способ для новой, пустой системы Linux installers for Node-RED из репозитория проекта. Так как мы используем CentOS 8, нам необходима вторая команда для ОС, основанных на RPM:
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/rpm/update-nodejs-and-nodered)... Stop Node-RED Install Node.js LTS Node v10.19.0 Npm 6.13.4 Install Node-RED core 1.1.2 Add shortcut commands Update systemd script Update public zone firewall rule Any errors will be logged to /var/log/nodered-install.logAll done. You can now start Node-RED with the command node-red-start Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880...
Скрипт установит LTS-версию Node.js, базовую версию Node-RED, создаст скрипт автозапуска для systemd и по желанию создаст правила для порта 1880 в файрволе. Для проверки успешности установки можно запустить команду:
$ node-red-start
Примечание: для выхода из Node-RED нажмите Ctrl+C.
Как активировать автозапуск и старт службы с помощью systemctl:
$ sudo systemctl enable --now nodered.service
После этого по адресу http://{ip вашей машины}:1880
в браузере будет доступен Node-RED.
Возвращаемся в Консоль, выбираем IoT Core и нажимаем Создать реестр. Указываем любое подходящее имя. Далее определимся со способом авторизации.
IoT Core поддерживает два способа: с помощью сертификатов и по логину-паролю. Для нашего тестового сценария намного быстрее использовать последний, поэтому заполним поле Пароль. Длина пароля минимум 14 символов.
После создания переходим в реестр во вкладку Устройства слева и нажимаем Добавить устройство.
Аналогично реестру задаем имя и пароль.
Теперь в пункте Обзор реестра появился его ID и пароль (в скрытом виде), которые мы указали при создании реестра. То же самое с устройством: на странице устройства есть его ID.
Перейдем в http://{ip вашей машины}:1880
.
Импортируем готовый пример, где нам потребуется лишь указать данные
реестра и устройства.
В меню в правом верхнем углу Node-RED нажмем Import. Flow в формате .json берем отсюда и либо копируем содержимое в поле, либо скачиваем файл и нажимаем select a file to import.
В новой вкладке появится flow testing connection.
Рассмотрим добавленные узлы. Send data узел типа Inject, предназначен для ручного или автоматического запуска flow.
Device payload узел-функция, позволяет выполнять JavaScript для обработки данных, проходящих через этот узел.
device mqtt-out-узел с настраиваемым MQTT-подключением, предназначен для публикации данных в топик.
Два раза кликаем по узлу device.
Нам необходимо заменить <id_реестра> на ID нашего реестра в IoT Core. Далее редактируем данные в Server. Во вкладке Security указываем username это ID созданного нами устройства, а password пароль, придуманный на этапе создания устройства. Затем нажимаем Update, далее Done.
Протестируем соединение: в правом верхнем углу нажмем Deploy. Под узлом device появится подпись connected.
Импортируем
flow с dashboard таким же образом. После импорта будет показано
сообщение о недостающих компонентах, загрузим их. В меню в правом
верхнем углу перейдем в Manage palette. В появившемся окне
во вкладке Install в поисковом поле напишем
node-red-dashboard
и установим самый первый из
найденных пакетов. Таким же образом установим
node-red-contrib-web-worldmap
.
Flow получился намного интереснее предыдущего, видны новые узлы.
Так, registry mqtt-in-узел, принимает сообщения из указанного в настройках топика и передает их следующим узлам.
Измеряемые данные приходят в строке, поэтому применяется узел разбора сообщений json. Он может конвертировать JSON-объект в его JS-представление и обратно.
Parsing JSON и JSON возвращают полученные измерения уже в виде отдельных объектов, которые далее передаются узлам, отвечающим за элементы Dashboard.
Теперь необходимо настроить узел registry. Аналогично первому flow записываем наш ID реестра и переходим в настройки сервера iot-core-subscription.
Во вкладке Security добавляем данные реестра, сохраняем изменения и нажимаем Deploy.
Если все поля заполнены верно, то после развертывания под узлом registry тоже появится подпись connected.
Последння вкладка в окне справа (с иконкой столбчатой диаграммы) отвечает за Dashboard. Перейти в Dashboard можно по кнопке:
Каждые три секунды устройство из flow testing connection генерирует данные, отправляет их в топик нашего реестра, а flow Smart Utilities, в свою очередь, подписывается на этот топик и обновляет Dashboard в соответствии с данными, приходящими из IoT Core.
Node-RED действительно может скачать любой желающий, безвозмездно. При первом знакомстве он вызывает вопросы в плане логики работы и прививает свою непередаваемую любовь к узлу "debug" и вкладке "debug messages". Но когда осмотришься и разберешься, то все встает на свои места и становится очень просто выполнять любые действия. Совсем без познаний в программировании обойтись не получится требуется хоть какое-то представление о том, что такое переменные, условия, циклы, массивы, JSON сообщения и как осуществлять их разбор. Однако узлы из раздела "Network", такие как "mqtt in/out", заработали с сервисом Yandex IoT Core вообще без проблем при условии правильной конфигурации.
Я умышленно не стал слишком детально описывать, как создается само приложение, поскольку есть исходник потока в JSON. Да и сама идея проекта Node-RED предполагает, что любой желающий может взглянуть на поток и понять, что он делает, без необходимости разбираться в отдельных строках кода на каждом узле. Но в код лучше заглянуть.
Отдельное спасибо за помощь при создании статьи:
В этой статье, я расскажу как легко и просто разместить статический сайт с помощью технологий Яндекса, а именно Object Storage.
В конце у вас будет размещенный в сети сайт, который будет доступен по внешней ссылке.
Недавно, я разрабатывал SaaS сервис, подобие маркетплейса, где люди находят спортивных тренеров для персональных тренировок. Использовал стек Amazon Web Services (далее AWS). Но чем глубже погружался в проект тем больше нюансов узнавал о разных процессах организации стартапа.
Я столкнулся с следующими проблемами:
Вдохновленный статьей о мигрировании инфраструктуры из Amazon Web Services в Яндекс.Облако, я решил изучить стек Яндекса подробнее.
Для меня ключевыми особенностями Яндекс.Облака было следующее:
Я изучал других конкурентов этого сервиса, но на тот момент Яндекс выигрывал.
О себе рассказал, можно и перейти к делу.
Для начала нам понадобится сайт, который мы хотим разместить в интернете. Так как я Angular разработчик, я сделаю простой шаблон SPA приложения, который далее размещу в интернете.
P.S. Кто разбирается в Angular или знает про его документацию https://angular.io/guide/setup-local, переходите к Шагу 1.
Установим Angular-CLI чтобы создавать SPA-сайты на Ангуляре:
npm install -g @angular/cli
Создадим Angular приложение с помощью следующей команды:
ng new angular-habr-object-storage
Далее переходим в папку приложения и запускаем его, чтобы проверить работоспособность:
cd angular-habr-object-storageng serve --open
Приложение создано, но пока не готово к размещению на хостинге.
Соберем приложение в небольшой билд (Production), чтобы убрать все
лишнее и оставить только необходимые файлы.
В ангуляре это можно сделать следующей командой:
ng build --prod
В результате этой команды в корне приложения появилась папочка
dist
с нашим сайтом.
Работает. Теперь переходим к хостингу.
Переходим на сайт https://console.cloud.yandex.ru/ и жмем на кнопку "Подключиться".
Примечание:
После успешной регистрации и авторизации, мы в личном кабинете.
Далее слева в меню нужно найти сервис "Object Storage", который мы как раз будем использовать для хостинга сайта.
Коротко по терминам:
Создадим один из них. Для этого в консоли сервиса жмем на кнопку "Создать бакет".
В форме создания бакета есть следующие поля, пробежимся по ним:
angular-habr-object-storage
Жмем "Создать бакет" и бакет создан.
Теперь нужно загрузить наш сайт в бакет. Самый простой способ
открыть рядом папочку dist
нашего сайта и ручками
перетащить прямо на страницу. Это удобнее, чем жать на кнопку
"Загрузить объекты", потому что в таком случае папки не переносятся
и их придется создавать ручками в правильной
последовательности.
Итак, сайт загружен в хранилище, тем можем предоставить
пользователям возможность обращаться к хранилищу, как к сайту.
Для этого слева в меню жмем на вкладку "Веб-сайт".
На странице настройки бакета как сайта, выбираем таб "Хостинг". Здесь указываем главную страницу сайта, обычно это index.html. Если у вас SPA приложение, то вероятно все ошибки обрабатываются также на главной странице, поэтому укажем на странице ошибки также index.html.
Мы сразу видим, по какой ссылке будет доступен наш сайт. Жмем сохранить.
Через минут 5, перейдя по ссылке мы видим что теперь наш сайт доступен всем желающим.
Спасибо всем кто дочитал до конца! Это моя первая статья, планирую дальше описать другие сервисы Яндекса и их интеграцию с frontend и backend технологиями.
Напишите в комментариях насколько интересно вам узнать про другие сервисы Яндекса или про использование Angular в современной разработке.
addr = flag.String("addr", ":8080", "TCP address to listen to")kafka = flag.String("kafka", "127.0.0.1:9092", "Kafka endpoints)
config := sarama.NewConfig()config.Producer.RequiredAcks = sarama.WaitForLocalconfig.Producer.Compression = sarama.CompressionSnappyconfig.Producer.Return.Successes = true
curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
yc init
, чтобы полностью ее
настроить:
vozerov@mba:~ $ yc initWelcome! This command will take you through the configuration process.Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.Please enter OAuth token:Please select cloud to use: [1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q) [2] fevlake-cloud (id = b1g6bvup3toribomnh30)Please enter your numeric choice: 2Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).Please choose folder to use: [1] default (id = b1g5r6h11knotfr8vjp7) [2] Create a new folderPlease enter your numeric choice: 1Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).Do you want to configure a default Compute zone? [Y/n]Which zone do you want to use as a profile default? [1] ru-central1-a [2] ru-central1-b [3] ru-central1-c [4] Don't set default zonePlease enter your numeric choice: 1Your profile default Compute zone has been set to 'ru-central1-a'.vozerov@mba:~ $
vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ eventsCloning into 'events'...remote: Enumerating objects: 100, done.remote: Counting objects: 100% (100/100), done.remote: Compressing objects: 100% (68/68), done.remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.Resolving deltas: 100% (37/37), done.vozerov@mba:~ $ cd events/terraform/
# Yandex Cloud Oauth tokenyc_token = ""# Yandex Cloud IDyc_cloud_id = ""# Yandex Cloud folder IDyc_folder_id = ""# Default Yandex Cloud Regionyc_region = "ru-central1-a"# Cloudflare emailcf_email = ""# Cloudflare tokencf_token = ""# Cloudflare zone idcf_zone_id = ""
vozerov@mba:~/events/terraform (master) $ terraform init... skipped ..vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c... skipped ...Plan: 4 to add, 0 to change, 0 to destroy.Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yesyandex_vpc_network.internal: Creating...yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]yandex_vpc_subnet.internal-a: Creating...yandex_vpc_subnet.internal-b: Creating...yandex_vpc_subnet.internal-c: Creating...yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
vozerov@mba:~/events/terraform (master) $ cd ../ansible/vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml- cloudalchemy-prometheus (master) is already installed, skipping.- cloudalchemy-grafana (master) is already installed, skipping.- sansible.kafka (master) is already installed, skipping.- sansible.zookeeper (master) is already installed, skipping.- geerlingguy.docker (master) is already installed, skipping.vozerov@mba:~/events/ansible (master) $
vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafkayandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]data.yandex_compute_image.ubuntu_image: Refreshing state...yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]An execution plan has been generated and is shown below.Resource actions are indicated with the following symbols: + create... skipped ...Plan: 3 to add, 0 to change, 0 to destroy.... skipped ...
vozerov@mba:~/events (master) $ yc compute instance list+----------------------+------------+---------------+---------+---------------+-------------+| ID | NAME | ZONE ID | STATUS | EXTERNAL IP | INTERNAL IP |+----------------------+------------+---------------+---------+---------------+-------------+| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 || fhmf37k03oobgu9jmd7p | kafka | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 || fhmt9pl1i8sf7ga6flgp | build | ru-central1-a | RUNNING | 84.201.132.3 | 172.16.1.26 |+----------------------+------------+---------------+---------+---------------+-------------+
ubuntu@build:~$ ping kafka.ru-central1.internalPING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms^C--- kafka.ru-central1.internal ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1001msrtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 ms
vozerov@mba:~/events/terraform (master) $ cd ..vozerov@mba:~/events (master) $ rsync -av app/ ubuntu@84.201.132.3:app/... skipped ...sent 3849 bytes received 70 bytes 7838.00 bytes/sectotal size is 3644 speedup is 0.93vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntuubuntu@build:~$ cd appubuntu@build:~/app$ sudo docker build -t app .Sending build context to Docker daemon 6.144kBStep 1/9 : FROM golang:latest AS build... skipped ...Successfully built 9760afd8ef65Successfully tagged app:latest
ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>С локальной машинки можно отправить тестовый event и посмотреть на ответ:<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/postHTTP/1.1 200 OKContent-Type: application/jsonDate: Mon, 13 Apr 2020 13:53:54 GMTContent-Length: 41{"status":"ok","partition":0,"Offset":0}vozerov@mba:~/events (master) $
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events... skipped ...Plan: 1 to add, 0 to change, 0 to destroy.... skipped ...Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher... skipped ...Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.jsonid: ajej8a06kdfbehbrh91pservice_account_id: ajep6d38k895srp9osijcreated_at: "2020-04-13T14:00:30Z"key_algorithm: RSA_2048
vozerov@mba:~/events/terraform (master) $ scp key.json ubuntu@84.201.132.3:key.json 100% 2392 215.1KB/s 00:00vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntuubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandexWARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeededubuntu@build:~$
vozerov@mba:~ $ yc container registry get eventsid: crpdgj6c9umdhgaqjfmmfolder_id:name: eventsstatus: ACTIVEcreated_at: "2020-04-13T13:56:41.914Z"
ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]8c286e154c6e: Pushed477c318b05cb: Pushedbeee9f30bc1f: Pushedv1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946
vozerov@mba:~/events/terraform (master) $ yc container repository list+----------------------+-----------------------------+| ID | NAME |+----------------------+-----------------------------+| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |+----------------------+-----------------------------+
yc container registry configure-docker
для настройки докера.Модель обслуживания Infrastructure-as-a-Service (IaaS), как описано в стандарте NIST, это возможность предоставить клиенту вычислительные, сетевые ресурсы и ресурсы хранения данных, на базе которых клиент сам размещает и управляет операционными системами и приложениями. Современная IaaS платформа включает в себя гипервизор, предоставляющий вычислительные ресурсы, программно-определяемую систему хранения данных software-defined storage (SDS) для размещения данных и программно-определяемую сеть software-defined networking (SDN) как средство организации сетевого доступа к ресурсам IaaS.
fdisk /dev/vdb`
lsblk
mkfs.ext4 /dev/vdb1mkfs.ext4 /dev/vdb2mkfs.ext4 /dev/vdb3mkfs.ext4 /dev/vdb4
mkdir /usr/sapmkdir /hanamkdir /hana/sharedmkdir /hana/shared/datamkdir /hana/shared/logmount /dev/vdb1 /usr/sapmount /dev/vdb2 /hana/shared/datamount /dev/vdb3 /hana/shared/logmount /dev/vdb4 /hana/sharedmkdir /usr/sap/distrvi /etc/fstab
chmod -R 777 /usr/sap/distr
cd /usr/sap/distr tar -xvzf hxe.tgztar -xvzf hxexsa.tgztar -xvzf shine.tgz
sudo zypper ar -c https://download.opensuse.org/tumbleweed/repo/oss/ openSUSE-Tumbleweed-Oss-HTTPS
zypper install libstdc++6zypper install libatomic1zypper install libgcc_s1zypper install libnuma1
cd /usr/sap/distr ./setup_hxe.sh
su hxeadmHDB info
xs-admin-login
xs -v
xs app xsa-cockpit --urlsxs app webide --urlsxs app cockpit-web-app --urls
su hxeadm/usr/sap/distr/HANA_EXPRESS_20/register_cockpit.sh
xs target -o HANAExpress -s development
xs apps