Поиск по сайту:

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


Введение

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

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

Предпосылки

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

  • Один сервер Ubuntu 16.04 с пользователем sudo без полномочий root и базовым брандмауэром, настроенным в соответствии с этим руководством по настройке сервера Ubuntu 16.04. В этом уроке мы будем использовать пользователя с именем sammy, но, конечно, вы можете выбрать все, что вам нравится, и заменить его по мере необходимости.
  • Установлен веб-сервер Nginx с обновленным брандмауэром, чтобы разрешить трафик через порты 80 и 443 (Nginx Full), как описано в разделе «Как установить Nginx в Ubuntu 16.04».
  • Доменное имя, указывающее на ваш сервер, как описано в разделе «Как настроить имя хоста с помощью DigitalOcean». В этом руководстве будет использоваться node-red.example.com.
  • Let’s Encrypt установлен, и сертификат создан для домена, который вы настроили выше. Как защитить Nginx с помощью Let’s Encrypt в Ubuntu 16.04 поможет вам выполнить необходимые шаги. Вы можете игнорировать шаги, касающиеся настройки Nginx (шаги 3–5), так как мы рассмотрим это здесь. Просто убедитесь, что вы успешно выдали сертификат, и настройте задание cron для обработки автоматического продления.

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

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

  1. sudo apt-get install nodejs-legacy

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

Примечание. Важно установить версию пакета -legacy, поскольку сценарии запуска Node-RED ожидают, что ваш двоичный файл Node.js будет называться node, но в стандартном пакете используется nodejs вместо этого. Это связано с конфликтом имен с ранее существовавшим пакетом.

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

  1. node -v

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

Output
v4.2.6

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

  1. sudo apt-get install npm

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

  1. npm -v
Output
3.5.2

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

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

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

  1. 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, так что давайте разрешим это.

  1. sudo ufw allow 1880

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

  1. node-red

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

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

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

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

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

  1. sudo nano /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/sammy/
User=sammy
Group=sammy

[Install]
WantedBy=multi-user.target

Полное объяснение служебных файлов systemd выходит за рамки этого руководства, но вы можете узнать больше, прочитав Основы Systemd: работа со службами, модулями и журналом.

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

[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

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

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

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

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

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

[Install]
WantedBy=multi-user.target

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

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

  1. sudo systemctl enable node-red

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

  1. sudo systemctl start node-red

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

  1. sudo systemctl stop node-red

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

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

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

  1. sudo nano /etc/nginx/sites-enabled/node-red.example.com

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

server {
    listen 80;
    listen 443 ssl http2;
    server_name node-red.example.com;
    ssl_certificate /etc/letsencrypt/live/node-red.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/node-red.example.com/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.

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

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

proxy_pass http://localhost:1880;

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

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

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

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

  1. sudo systemctl reload nginx

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

  1. sudo systemctl start node-red

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

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

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

  1. node-red-admin hash-pw

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

  1. nano ~/.node-red/settings.js

Прокрутите вниз и раскомментируйте блок adminAuth (удалив «//» перед каждой строкой). Измените username на любое другое и вставьте хэш в поле password.

adminAuth: {
    type: "credentials",
    users: [{
        username: "admin",
        password: "$2a$08$Ab9prIr1M8a5a1/Zx8.B9.uIOCPe.v90ZGuZc2kAATp6BHJ/WV5KS",
        permissions: "*"
    }]
},

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

uiHost: "127.0.0.1",

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

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

  1. sudo ufw deny 1880

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

  1. sudo systemctl restart node-red

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

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

Заключение

Теперь у нас есть достаточно безопасная установка Node-RED, которую Nginx проксирует с помощью Let’s Encrypt для своих SSL-сертификатов. Войдите и получите проводку! На веб-сайте Node-RED доступно гораздо больше информации и вдохновения для проектов.