Chạy tự động NodeJs App với Systemd trên Raspberry Pi

Systemd là một hệ thống khởi động được tích hợp trong nhiều bản phân phối Linux khác nhau. Hướng dẫn này sẽ chỉ cho bạn cách sử dụng systemd để khởi động ứng dụng của bạn một cách tự động khi máy tính nhúng như Raspberry Pi được khởi động.

1. Thiết lập user và thư mục chứa app

Bạn có thể bỏ qua bước này nếu bạn đã có NodeJs app chạy trên hệ thống. Tuy nhiên, vẫn cần xác định xem thư mục chứa app được sở hữu bởi user nào, group nào. Trong ví dụ dưới, bạn sẽ cần thay /PATH/TO/YOUR/APP/ thành đường dẫn đến thư mục chứa app của bạn. Ví dụ cũng add user được tạo vào group có phân quyền cao nhất thuộc hệ thống là sudo.

# Tạo user mới với tên: node
adduser node

# Thêm user này vào group: sudo
usermod -aG sudo node

# Tạo thư mục chứa app được sở hữu bởi user trên tại đường dẫn bạn muốn
mkdir -p /PATH/TO/YOUR/APP/
chown -R node:node /PATH/TO/YOUR/APP/
63.0US $ 48% OFF|Raspberry Pi 4 Official Original Model B Dev Board Kit RAM 2G 4G 8G 4 Core CPU 1.5Ghz 3 Faster Than Pi 3B+| | - AliExpress
Smarter Shopping, Better Living! Aliexpress.com

2. Tạo tệp .service

Để sử dụng systemd, bạn cần tạo một tệp mới trong thư mục /etc/systemd/system với với đuôi .service ví dụ yourapp.service. Bên trong tệp đó, bạn có thể sử dụng mẫu bên dưới.
Bạn nên thay thế mọi thứ được viết bằng chữ hoa như YOUR_SERVICE_DESC, YOUR_SERVICE_DOC, /PATH/TO/YOUR/NODE/, /PATH/TO/YOUR/APP/, YOUR_OPEN_PORT, YOUR_SYSTEM_USER, YOUR_SYSTEM_USER_GROUP hay YOUR_APP bằng các giá trị của riêng bạn, ngoại trừ NODE_PORT. Để tìm chính xác /PATH/TO/YOUR/NODE/, bạn có thể dùng lệnh which node trong Terminal. Nếu bạn không chắc mình đã cài NodeJs hay chưa thì có thể kiểm tra lại bằng lệnh node --version. YOUR_SYSTEM_USER, YOUR_SYSTEM_USER_GROUP là user và group tồn tại sẵn trên máy của bạn. Hoặc bạn có thể tạo user và group mới trước với lệnh

YourService.service Template

[Unit]
Description=YOUR_SERVICE_DESC
Documentation=YOUR_SERVICE_DOC
After=network.target

[Service]
ExecStart=/PATH/TO/YOUR/NODE/ --use_strict /PATH/TO/YOUR/APP/
Restart=always
Environment=NODE_PORT=YOUR_OPEN_PORT
User=YOUR_SYSTEM_USER
Group=YOUR_SYSTEM_USER_GROUP
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=YOUR_APP

[Install]
WantedBy=multi-user.target

Ví dụ

[Unit]
Description=express.js
Documentation=https://makexyz.ddns.net
After=network.target

[Service]
ExecStart=/usr/local/bin/node /home/dietpi/Desktop/Projects/MyNodeLibs/packages/h5p-examples/build/express.js
Restart=always
Environment=NODE_PORT=8080
Type=simple
User=node
Group=node
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp

[Install]
WantedBy=multi-user.target

3. Chạy tệp .service với systemctl

Khi bạn đã tạo xong tập lệnh systemd, giờ đây bạn có thể sử dụng lệnh systemctl để start, stop hoặc restart ứng dụng của mình.

systemctl start yourapp.service
systemctl stop yourapp.service
systemctl restart yourapp.service

Khi bạn đã chạy lệnh start, ứng dụng của bạn sẽ tiếp tục reboot nếu có tiến trình bị lỗi cho đến khi bạn chạy lệnh stop.

Nếu muốn ứng dụng tự động được khởi chạy mỗi khi máy tính khởi động, bạn có thể sử dụng lệnh dưới.

systemctl enable yourapp.service

Nếu bạn vừa cập nhật lại một file .service thì nhớ dùng lệnh dưới để restart lại daemon, nó giúp daemon biết được đã có sự thay đổi.

sudo systemctl daemon-reload

Chúc bạn thành công với hướng dẫn trên. Mình hy vọng hướng dẫn này hữu ích với bạn, nhất là các bạn đang muốn chạy NodeJs App trên máy tính nhúng như Raspberry Pi và cần nó luôn được khởi động bất kỳ khi nào máy tính khởi động lại.

Máy tính nhúng chạy Linux Raspberry Pi

63.0US $ 48% OFF|Raspberry Pi 4 Official Original Model B Dev Board Kit RAM 2G 4G 8G 4 Core CPU 1.5Ghz 3 Faster Than Pi 3B+| | - AliExpress
Smarter Shopping, Better Living! Aliexpress.com

Tài liệu tham khảo

Running Node.Js as a systemd service
I had a Node.js app that I wanted to run when my Raspberry Pi Zero started up in a minimal manor.Here’s how I created a systemd service to do it.
Running Your Node.js App With Systemd - Part 1
There’s a lot of different ways to run a Node.js app in production. In this post, we cover running a Node app on a “standard” Linux server using systemd.