Как подключить свой интернет вещей с помощью Node-RED в Ubuntu 16.04

Вступление

Node-RED - это коммутатор для Интернета вещей, визуальный инструмент, который помогает вам соединять ваши любимые приложения, веб-сайты и оборудование вместе, чтобы делать новые и полезные вещи. Чаще всего по сравнению с IFTTT или поздними Yahoo Pipes, Node-RED имеет гораздо более мощный и гибкий интерфейс, а также большое сообщество разработчиков с открытым исходным кодом, создающее nodes для взаимодействия с широким спектром приложений и Сервисы.

В этом руководстве мы установим Node.js и Node-RED, получим SSL-сертификат от Let’s Encrypt и будем использовать Nginx для обработки защищенных соединений для Node-RED.

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

  • Один сервер Ubuntu 16.04 с некорневым пользователем sudo и базовым брандмауэром, настроенным по адресу https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04[this сервер Ubuntu 16.04 Руководство по настройке. Для этого урока мы будем использовать пользователя с именем * sammy *, но, конечно, вы можете выбрать все, что захотите, и заменить его, если потребуется.

  • Установлен веб-сервер Nginx с обновленным брандмауэром для разрешения трафика через порты 80 и 443 (* Nginx Full *), как описано в https://www.digitalocean.com/community/tutorials/how-to-install-nginx- on-ubuntu-16-04 [Как установить Nginx в Ubuntu 16.04]

  • Доменное имя указывало на ваш сервер, как описано в Как настроить имя хоста с DigitalOcean. В этом руководстве будет использоваться + node-red.example.com +.

  • Давайте установим Encrypt и сгенерируем сертификат для домена, который вы настроили выше. Как обезопасить Nginx с помощью Let’s Encrypt в Ubuntu 16.04 будет проведу вас через необходимые шаги. Вы можете игнорировать шаги, касающиеся настройки Nginx (шаги 3–5), о чем мы расскажем здесь. Просто убедитесь, что вы успешно получили сертификат, и настройте задание + cron + для обработки автоматических продлений.

Шаг 1 - Установка Node.js и npm

Ubuntu 16.04 упрощает установку последней версии Node.js для долгосрочной поддержки (LTS), поскольку она включена в репозиторий по умолчанию.

sudo apt-get install nodejs-legacy

Команда устанавливает Node.js v4.2.x LTS (долгосрочная поддержка), что означает, что Node.js Foundation будет продолжать поддерживать эту версию в течение 30 месяцев с даты ее выпуска 12 октября 2015 года.

Убедитесь, что установка прошла успешно, проверив версию.

node -v

Вы увидите, что Node.js выводит номер своей версии:

Outputv4.2.6

Диспетчер пакетов Node (+ npm +) помогает вам устанавливать и управлять программными пакетами Node.js. Мы будем использовать его для установки Node-RED. Установите + npm используя` + apt-get`.

sudo apt-get install npm

Чтобы убедиться, что установка прошла успешно, попросите + npm + напечатать информацию о ее версии:

npm -v
Output3.5.2

Если он печатает номер версии без ошибок, мы можем перейти к следующему шагу, где мы будем использовать + npm + для установки самого Node-RED.

Шаг 2 - Установка Node-RED

Используйте + npm для установки` + node-red + и вспомогательную утилиту под названием + node-red-admin`.

sudo npm install -g --unsafe-perm node-red node-red-admin

+ npm + обычно устанавливает свои пакеты в ваш текущий каталог. Здесь мы используем флаг «+ -g » для установки пакетов «глобально», чтобы они помещались в стандартные системные расположения, такие как « / usr / local / bin ». Флаг ` - unsafe-perm ` помогает нам избежать некоторых ошибок, которые могут появиться, когда ` npm ` пытается скомпилировать собственные модули (модули, написанные на скомпилированном языке, таком как C или C +, против JavaScript).

После небольшой загрузки и перетасовки файлов вы вернетесь к обычной командной строке. Давайте проверим нашу установку.

Во-первых, нам нужно открыть порт на нашем брандмауэре. По умолчанию Node-RED использует порт + 1880 +, так что давайте позволим это.

sudo ufw allow 1880

А теперь запусти сам Node-RED. + Sudo + не требуется, поскольку порт + 1880 + достаточно высок, чтобы не требовать привилегий root.

node-red

Некоторые сообщения «Welcome to Node-RED» будут распечатаны на терминале. На вашем компьютере укажите в веб-браузере порт «+ 1880 » сервера. В нашем примере это ` http: //: 1880 +`. Будет загружен основной интерфейс администратора Node-RED.

изображение: https: //assets.digitalocean.com/articles/node-red/jpWUEbI.png [основной интерфейс редактирования Node-RED]

Если это сработало, вы можете набрать + CTRL + C + в своем терминале, чтобы выключить Node-RED и вернуться в командную строку. Мы успешно установили Node-RED и протестировали его, поэтому далее мы настроим его для запуска во время запуска системы.

Шаг 3 - Запуск Node-RED при запуске

Чтобы запустить Node-RED автоматически при запуске, нам нужно установить файл + node-red.service + вместо более традиционного сценария инициализации. Это связано с тем, что Ubuntu 16.04 является первым выпуском LTS, который использует + systemd + для своей системы инициализации. Вы можете найти сводку этого и других изменений в Ubuntu 16.04 в What’s New в Ubuntu 16.04.

Откройте пустой файл сервиса с именем + node-red.service +.

sudo nano /etc/systemd/system/node-red.service

Скопируйте и вставьте следующее, затем сохраните и закройте файл.

/etc/systemd/system/node-red.service

[Unit]
Description=Node-RED
After=syslog.target network.target

[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT

# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog

# non-root user to run as
WorkingDirectory=/home//
User=
Group=

[Install]
WantedBy=multi-user.target

Полное описание файлов службы systemd выходит за рамки данного руководства, но вы можете узнать больше, прочитав https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal Systemd Essentials: работа со службами, подразделениями и журналом.

Тем не менее, давайте разберем некоторые разделы в нашем сервисном файле:

/etc/systemd/system/node-red.service

[Unit]
Description=Node-RED
After=syslog.target network.target

Это описывает наш сервис и указывает, что он должен быть запущен после функционирования сети и системного журнала.

/etc/systemd/system/node-red.service

[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT

+ ExecStart + - команда, необходимая для запуска нашего сервиса. Мы вызываем + node-red-pi + вместо простого + node-red +, чтобы мы могли передать некоторые параметры сохранения памяти в Node.js. Это должно позволить ему хорошо работать на любом сервере разумного размера, в зависимости от того, сколько потоков вы создаете в Node-RED (и насколько они сложны). + Restart = on-fail означает, что systemd попытается перезапустить Node-RED в случае сбоя, а` + KillS signal` сообщает systemd лучший способ выйти из Node-RED, когда ему необходимо завершить или перезапустить процесс.

/etc/systemd/system/node-red.service

# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog

Это устанавливает метку, используемую при ведении журнала, и записывает все выходные данные в службу syslog.

/etc/systemd/system/node-red.service

# non-root user to run as
WorkingDirectory=/home//
User=
Group=

Мы хотим запустить Node-RED как наш пользователь без полномочий root. Строки выше указывают systemd запустить Node-RED, используя нашего пользователя и группу, а также из нашего домашнего каталога.

/etc/systemd/system/node-red.service

[Install]
WantedBy=multi-user.target

+ WantedBy + указывает цели, под которыми должен работать наш сервис. В этом случае, когда Ubuntu загружается в многопользовательском режиме, он также будет знать, чтобы запустить наш сервис Node-RED. Многопользовательский режим является целью запуска по умолчанию.

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

sudo systemctl enable node-red

Давайте теперь вручную запустим сервис, чтобы проверить, что он все еще работает.

sudo systemctl start node-red

Направьте браузер обратно на порт сервера «+ 1880 +» и убедитесь, что Node-RED выполняет резервное копирование. Если это так, выключите его, пока мы не обеспечим установку на следующем шаге.

sudo systemctl stop node-red

Шаг 4 - Настройка Nginx

Мы собираемся использовать Nginx для прокси службы Node-RED. Это означает, что Nginx будет обрабатывать все SSL-соединения через порт + 443 + (используя ранее настроенные сертификаты Let Encrypt), а затем передавать трафик в Node-RED.

Откройте новую конфигурацию Nginx для сайта.

sudo nano /etc/nginx/sites-enabled/

Скопируйте и вставьте следующее, изменив имя сервера и пути к сертификатам:

/etc/nginx/sites-enabled/node-red.example.com

server {
   listen 80;
   listen 443 ssl http2;
   server_name ;
   ssl_certificate /etc/letsencrypt/live//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
   ssl_prefer_server_ciphers On;
   ssl_session_cache shared:SSL:128m;
   ssl_stapling on;
   ssl_stapling_verify on;
   resolver 8.8.8.8;

   location / {
       if ($scheme = http) {
           return 301 https://$server_name$request_uri;
       }
       proxy_pass http://localhost:1880;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
   }

   location '/.well-known/acme-challenge' {
       root /var/www/html;
   }
}

Сохраните и закройте файл. Давайте объясним, что делает этот файл.

Первые три строки сообщают Nginx, какие порты прослушивать и на какое доменное имя отвечать. Строки + ssl_certificate + и + ssl_certificate_key + указывают на сертификаты, которые мы получили от Let’s Encrypt. Оставшиеся строки + ssl_ + выбирают протоколы, шифры и параметры, которые являются более безопасными, чем значения по умолчанию.

+ location / + запускает блок, где мы на самом деле определяем наш прокси Node-RED.

/etc/nginx/sites-enabled/node-red.example.com

if ($scheme = http) {
   return 301 https://$server_name$request_uri;
}

Этот блок будет соответствовать любым обычным незащищенным http-соединениям и перенаправлять их на https-версию сайта.

/etc/nginx/sites-enabled/node-red.example.com

proxy_pass http://localhost:1880;

Мы указываем на наш сервис Node-RED здесь. Он доступен на + localhost +, на порту + 1880 +, поэтому мы передаем туда соединения. Остальная часть этого блока конфигурации устанавливает некоторые заголовки, которые важны для правильной работы прокси. Заголовки + Upgrade + и + Connection + особенно важны для обработки соединений веб-сокетов Node-RED.

Наконец, у нас есть блок, чтобы убедиться, что ответы на вызов Let Encrypt продолжают извлекаться из стандартного веб-корня Nginx:

/etc/nginx/sites-enabled/node-red.example.com

location '/.well-known/acme-challenge' {
   root /var/www/html;
}

Перезагрузите Nginx, чтобы подобрать новую конфигурацию.

sudo systemctl reload nginx

Наконец, снова запустите Node-RED.

sudo systemctl start node-red

Еще раз, перейдите к вашему серверу: + http: // +. Вы должны быть перенаправлены на + https: // + (обратите внимание на + https +) и увидите интерфейс администратора Node-RED. Это означает, что теперь мы проксируем Node-RED через Nginx. У нас есть еще несколько настроек, чтобы заблокировать Node-RED, и тогда мы закончим.

Шаг 5 - Защита Node-RED и Завершение

Теперь, когда наше соединение безопасно, давайте добавим пароль к администратору Node-RED. Вместо того, чтобы вводить пустой пароль прямо в наш файл настроек, мы сначала создаем односторонний криптографический хеш-код и используем его вместо этого. Мы будем использовать + node-red-admin для создания хеша:

node-red-admin hash-pw

Вам будет предложено ввести пароль. Введите его, нажмите + ENTER +, и хеш будет напечатан на экране. Скопируйте его в буфер обмена и откройте файл настроек Node-RED.

nano ~/.node-red/settings.js

Прокрутите вниз и раскомментируйте блок + adminAuth + (удаляя символ «//» перед каждой строкой). Измените + username on на то, что вам нравится, и вставьте хеш в поле` + password`.

settings.js

adminAuth: {
   type: "credentials",
   users: [{
       username: "",
       password: "",
       permissions: "*"
   }]
},

Пока мы открываем файл, также раскомментируйте строку + uihost +, удалив + // + в начале строки.

settings.js

uiHost: "127.0.0.1",

Это означает, что Node-RED будет прослушивать только локальный интерфейс и не будет доступен напрямую для внешнего мира (доступ к нему будет осуществляться только через прокси-сервер Nginx). Теперь вы можете сохранить и закрыть файл.

Обновите брандмауэр в последний раз, просто чтобы убедиться, что Node-RED никогда не будет доступен напрямую.

sudo ufw deny 1880

Наконец, перезапустите Node-RED.

sudo systemctl restart node-red

Перейдите к + https: // +, и вы увидите экран входа в систему вместо основного интерфейса редактирования.

изображение: https: //assets.digitalocean.com/articles/node-red/W10ckeg.png [экран входа Node-RED]

Если на вашем сайте отображается экран входа в систему и соединение + https +, все настроено правильно.

Заключение

Теперь у нас есть достаточно безопасная установка Node-RED, которая проксируется Nginx с использованием Let Encrypt для его SSL-сертификатов. Войдите и получите проводку! На сайте http://nodered.org [веб-сайт Node-RED] доступно гораздо больше информации и идей.

Related