Вступление
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] доступно гораздо больше информации и идей.