Thứ sáu, 23/09/2016 | 00:00 GMT+7

Cách kết nối Internet of Things của bạn với Node-RED trên Ubuntu 16.04

Node-RED là một tổng đài cho Internet of Things, một công cụ trực quan giúp bạn kết nối các ứng dụng, trang web và phần cứng yêu thích của bạn với nhau để làm những việc mới và hữu ích. Thông thường so với IFTTT hoặc Yahoo Pipes muộn, Node-RED có giao diện linh hoạt và mạnh mẽ hơn nhiều, và một cộng đồng nguồn mở lớn tạo ra các node để tương tác với nhiều ứng dụng và dịch vụ.

Trong hướng dẫn này, ta sẽ cài đặt Node.js và Node-RED, lấy certificate SSL từ Let's Encrypt và sử dụng Nginx để xử lý các kết nối an toàn cho Node-RED.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

  • Một server Ubuntu 16.04 với user sudo không phải root và firewall cơ bản được cài đặt theo hướng dẫn cài đặt server Ubuntu 16.04 này . Đối với hướng dẫn này, ta sẽ sử dụng một user có tên là sammy , nhưng tất nhiên bạn có thể chọn bất kỳ thứ gì bạn thích và thay thế nếu cần.

  • Web server đã cài đặt Nginx, với firewall được cập nhật để cho phép lưu lượng truy cập trên các cổng 80 và 443 ( Nginx Full ), như được giải thích trong Cách cài đặt Nginx trên Ubuntu 16.04

  • Tên domain đã trỏ đến server của bạn, như được mô tả trong Cách cài đặt tên server với DigitalOcean . Hướng dẫn này sẽ sử dụng node-red.example.com xuyên suốt.

  • Đã cài đặt Let's Encrypt và certificate được tạo cho domain bạn đã cấu hình ở trên. Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 16.04 sẽ hướng dẫn bạn các bước cần thiết. Bạn có thể bỏ qua các bước liên quan đến cấu hình Nginx (bước 3–5), vì ta sẽ trình bày ở đây. Chỉ cần đảm bảo bạn nhận được certificate được cấp thành công và cài đặt cron việc cron để xử lý việc gia hạn tự động.

Bước 1 - Cài đặt Node.js và npm

Ubuntu 16.04 giúp dễ dàng cài đặt bản phát hành hỗ trợ dài hạn (LTS) mới nhất của Node.js vì nó có trong repository lưu trữ mặc định.

  • sudo apt-get install nodejs-legacy

Lệnh cài đặt Node.js v4.2.x LTS (hỗ trợ lâu dài), nghĩa là Node.js Foundation sẽ tiếp tục hỗ trợ version này trong 30 tháng kể từ ngày phát hành 12 tháng 10 năm 2015.

Lưu ý : Điều quan trọng là phải cài đặt version -legacy của gói vì các tập lệnh khởi động của Node-RED mong đợi file binary Node.js của bạn được đặt tên là node , nhưng gói tiêu chuẩn sử dụng nodejs để thay thế. Điều này là do xung đột đặt tên với một gói có sẵn.

Xác minh cài đặt thành công bằng cách kiểm tra version .

  • node -v

Bạn sẽ thấy Node.js xuất ra số version của nó:

Output
v4.2.6

Node Package Manager ( npm ) giúp bạn cài đặt và quản lý các gói phần mềm Node.js và ta sẽ sử dụng nó để cài đặt Node-RED. Cài đặt npm bằng apt-get .

  • sudo apt-get install npm

Để xác minh cài đặt thành công, hãy yêu cầu npm in thông tin version của nó:

  • npm -v
Output
3.5.2

Nếu nó in số version mà không bị lỗi, ta có thể tiếp tục bước tiếp theo, nơi ta sẽ sử dụng npm để cài đặt chính Node-RED.

Bước 2 - Cài đặt Node-RED

Sử dụng npm để cài đặt node-red và một tiện ích trợ giúp được gọi là node-red-admin .

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

npm thường cài đặt các gói của nó vào folder hiện tại của bạn. Ở đây, ta sử dụng cờ -g để cài đặt các gói ' global ' để chúng được đặt ở các vị trí hệ thống tiêu chuẩn như /usr/local/bin . Cờ --unsafe-perm giúp ta tránh một số lỗi có thể bật lên khi npm cố gắng biên dịch các module root (các module được viết bằng ngôn ngữ biên dịch như C hoặc C ++ so với JavaScript).

Sau một chút download và xáo trộn file , bạn sẽ được quay lại dấu nhắc dòng lệnh bình thường. Hãy kiểm tra cài đặt của ta .

Đầu tiên, ta cần mở một cổng trên firewall của bạn . Node-RED mặc định sử dụng cổng 1880 , vì vậy hãy cho phép điều đó.

  • sudo ufw allow 1880

Và bây giờ chạy chính Node-RED. Không cần sudo , vì cổng 1880 đủ cao để không yêu cầu quyền root.

  • node-red

Một số thông báo “Chào mừng bạn đến với Node-RED” sẽ in ra terminal . Trên máy tính của bạn, trỏ trình duyệt web đến cổng 1880 của server . Trong ví dụ của ta , đó là http:// node-red.example.com :1880 . Giao diện quản trị chính của Node-RED sẽ tải.

Giao diện chỉnh sửa chính của Node-RED

Nếu nó hoạt động, bạn có thể nhập CTRL+C trong terminal của bạn để tắt Node-RED và quay lại dấu nhắc lệnh. Ta đã cài đặt Node-RED thành công và đã thử nghiệm nó, vì vậy tiếp theo, ta sẽ cài đặt nó để chạy trong quá trình khởi động hệ thống.

Bước 3 - Chạy Node-RED khi khởi động

Để khởi động Node-RED tự động khi khởi động, ta cần cài đặt file node-red.service thay vì tập lệnh init truyền thống hơn. Điều này là do Ubuntu 16.04 là bản phát hành LTS đầu tiên sử dụng systemd cho hệ thống init của nó. Bạn có thể tìm thấy bản tóm tắt về điều này và các thay đổi khác của Ubuntu 16.04 trong Có gì mới trong Ubuntu 16.04 .

Mở file dịch vụ trống có tên node-red.service .

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

Copy paste nội dung sau, sau đó lưu file .

/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 

Giải thích đầy đủ về các file dịch vụ systemd nằm ngoài hướng dẫn này, nhưng bạn có thể tìm hiểu thêm bằng cách đọc Thông tin cơ bản về Systemd: Làm việc với Dịch vụ, Đơn vị và Tạp chí .

Điều đó nói rằng, hãy chia nhỏ một số phần trong file dịch vụ của ta :

/etc/systemd/system/node-red.service
[Unit] Description=Node-RED After=syslog.target network.target 

Điều này mô tả dịch vụ của ta và cho biết nó phải được khởi động sau khi mạng và log hệ thống hoạt động.

/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 là lệnh cần thiết để bắt đầu dịch vụ của ta . Ta gọi node-red-pi thay vì node-red đơn thuần để ta có thể chuyển một số tùy chọn tiết kiệm bộ nhớ cho Node.js. Điều này sẽ cho phép nó chạy tốt trên bất kỳ server nào có kích thước hợp lý, tất nhiên tùy thuộc vào số lượng stream bạn tạo trong Node-RED (và mức độ phức tạp của chúng). Restart=on-failure fail nghĩa là systemd sẽ cố gắng khởi động lại Node-RED nếu nó bị lỗi và KillSignal cho systemd biết cách tốt nhất để thoát khỏi Node-RED khi nó cần tắt hoặc khởi động lại quá trình.

/etc/systemd/system/node-red.service
# log output to syslog as 'node-red' SyslogIdentifier=node-red StandardOutput=syslog 

Điều này đặt nhãn được sử dụng khi ghi log và ghi lại tất cả kết quả vào dịch vụ log hệ thống.

/etc/systemd/system/node-red.service
# non-root user to run as WorkingDirectory=/home/sammy/ User=sammy Group=sammy 

Ta muốn chạy Node-RED với quyền là user không phải root của ta . Các dòng trên cho biết systemd chạy Node-RED bằng cách sử dụng user và group của ta và từ trong folder chính của ta .

/etc/systemd/system/node-red.service
[Install] WantedBy=multi-user.target 

WantedBy chỉ ra các mục tiêu mà dịch vụ của ta sẽ chạy theo. Trong trường hợp này, khi Ubuntu khởi động vào chế độ nhiều user , nó sẽ biết cách chạy dịch vụ Node-RED của ta . Chế độ Muti-user là mục tiêu khởi động mặc định.

Bây giờ file dịch vụ của ta đã được cài đặt và hiểu rõ, ta cần kích hoạt nó. Điều này sẽ cho phép nó thực thi khi khởi động.

  • sudo systemctl enable node-red

Hãy bắt đầu dịch vụ theo cách thủ công ngay bây giờ để kiểm tra xem nó vẫn hoạt động.

  • sudo systemctl start node-red

Hướng trình duyệt trở lại cổng 1880 của server và xác minh Node-RED đã được backup . Nếu có, hãy tắt nó lại cho đến khi ta đảm bảo cài đặt ở bước tiếp theo.

  • sudo systemctl stop node-red

Bước 4 - Cài đặt Nginx

Ta sẽ sử dụng Nginx để ủy quyền cho dịch vụ Node-RED. Điều này nghĩa là Nginx sẽ xử lý tất cả các kết nối SSL trên cổng 443 (sử dụng certificate Let's Encrypt mà bạn đã cài đặt trước đó), sau đó chuyển lưu lượng truy cập tới Node-RED.

Mở cấu hình Nginx mới cho trang web.

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

Copy paste nội dung sau, thay đổi tên server và đường dẫn certificate :

/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;     } } 

Lưu và đóng file . Hãy giải thích những gì file này làm.

Ba dòng đầu tiên cho Nginx biết cổng nào cần lắng nghe và domain nào sẽ phản hồi. Các ssl_certificatessl_certificate_key trỏ đến các certificate mà ta đã lấy từ Let's Encrypt. Các dòng ssl_ còn lại chọn giao thức, mật mã và các tùy chọn an toàn hơn so với giá trị mặc định.

location / bắt đầu khối nơi ta thực sự xác định proxy Node-RED của bạn .

/etc/nginx/sites-enabled/node-red.example.com
if ($scheme = http) {     return 301 https://$server_name$request_uri; } 

Khối này sẽ trùng với bất kỳ kết nối http đơn giản, không an toàn nào và chuyển hướng chúng đến version https của trang web.

/etc/nginx/sites-enabled/node-red.example.com
proxy_pass http://localhost:1880; 

Ta chỉ đến dịch vụ Node-RED của ta tại đây. Nó có sẵn trên localhost , tại cổng 1880 , vì vậy ta chuyển các kết nối đến nó ở đó. Phần còn lại của đoạn cấu hình này đặt một số tiêu đề quan trọng để proxy hoạt động đúng cách. Các tiêu đề UpgradeConnection đặc biệt quan trọng để xử lý các kết nối websocket của Node-RED.

Cuối cùng, ta có một khối đảm bảo các phản hồi thử thách Let's Encrypt tiếp tục được tìm nạp từ root web mặc định của Nginx:

/etc/nginx/sites-enabled/node-red.example.com
location '/.well-known/acme-challenge' {     root /var/www/html; } 

Reload Nginx để nhận cấu hình mới.

  • sudo systemctl reload nginx

Cuối cùng, khởi động lại Node-RED.

  • sudo systemctl start node-red

, chuyển đến server của bạn: http:// node-red.example.com . Bạn sẽ được chuyển hướng đến https:// node-red.example.com (lưu ý https ) và xem giao diện quản trị Node-RED. Điều này nghĩa là ta hiện đang ủy quyền Node-RED thông qua Nginx. Ta chỉ có một vài chỉnh sửa khác để khóa Node-RED, và sau đó ta sẽ hoàn thành.

Bước 5 - Bảo mật Node-RED và Kết thúc

Bây giờ kết nối của ta đã an toàn, hãy thêm password vào administrator Node-RED. Thay vì đặt một password trống ngay vào file cài đặt của ta , trước tiên ta tạo một hàm băm mật mã một chiều của nó và thay vào đó sử dụng password đó. Ta sẽ sử dụng node-red-admin để tạo hash:

  • node-red-admin hash-pw

Bạn sẽ được yêu cầu nhập password . Nhập nó vào, nhấn ENTER và một hàm băm sẽ được in trên màn hình. Sao chép nó vào clipboard của bạn và mở file cài đặt Node-RED.

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

Cuộn xuống và bỏ ghi chú khối adminAuth (bằng cách bỏ dấu “//” ở trước mỗi dòng). Thay đổi username thành bất kỳ username nào bạn thích và dán mã băm vào trường password .

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

Trong khi ta đã mở file , bỏ comment uihost bằng cách xóa // ở đầu dòng.

settings.js
uiHost: "127.0.0.1", 

Điều này nghĩa là Node-RED sẽ chỉ lắng nghe trên giao diện local và sẽ không thể truy cập trực tiếp bởi thế giới bên ngoài (nó sẽ chỉ được truy cập thông qua proxy Nginx). Đến đây bạn có thể lưu file .

Cập nhật firewall lần cuối, chỉ đảm bảo rằng Node-RED không bao giờ có thể truy cập trực tiếp.

  • sudo ufw deny 1880

Cuối cùng, khởi động lại Node-RED.

  • sudo systemctl restart node-red

Điều hướng đến https:// node-red.example.com và bạn sẽ thấy màn hình đăng nhập thay vì giao diện chỉnh sửa chính.

Màn hình đăng nhập của Node-RED

Nếu trang web hiển thị màn hình đăng nhập và kết nối https , bạn đã cài đặt mọi thứ chính xác.

Kết luận

Như vậy, ta đã có một bản cài đặt Node-RED an toàn hợp lý, đang được Nginx ủy quyền bằng cách sử dụng Let's Encrypt cho các certificate SSL của nó. Đăng nhập và lấy dây! Có rất nhiều thông tin và nguồn cảm hứng dự án có sẵn tại trang web của Node-RED .


Tags:

Các tin liên quan

Cách cài đặt R trên Ubuntu 16.04
2016-09-19
Cách cài đặt Gói R bằng cách sử dụng devtools trên Ubuntu 16.04
2016-09-17
Cách cài đặt Gói R bằng cách sử dụng devtools trên Ubuntu 16.04
2016-09-17
Cách sử dụng LVM để quản lý thiết bị lưu trữ trên Ubuntu 16.04
2016-09-14
Cách cài đặt và cấu hình PostGIS trên Ubuntu 14.04
2016-09-01
Cách thiết lập vsftpd cho Tải xuống ẩn danh trên Ubuntu 16.04
2016-08-25
Cách triển khai ứng dụng Node.js bằng Terraform trên Ubuntu 14.04
2016-08-25
Cách cấu hình Cụm Galera với MariaDB 10.1 trên server Ubuntu 16.04
2016-08-19
Cách tạo Mảng RAID với mdadm trên Ubuntu 16.04
2016-08-16
Cách quản lý mảng RAID với mdadm trên Ubuntu 16.04
2016-08-16