在物聯網(IoT)與資料流自動化日益普及的今天,Node-RED 成為眾多開發者與工程師的首選利器。它是一款基於 Node.js 的開源流程式開發工具,透過圖形化介面,使用者可以輕鬆拖拉節點(nodes)來串接資料來源、處理邏輯與輸出結果。無論是感測器數據的收集、系統之間的整合,還是複雜流程的自動化,Node-RED 都能快速部署且高度擴充。這種低程式碼(low-code)開發模式大幅降低門檻,使得非專業開發者也能靈活建構出穩健的自動化解決方案。
為了讓使用者能更快速、穩定地部署 Node-RED,本文提供一套基於 Docker Compose 的安裝流程,適用於希望快速建立測試環境或正式專案的開發者。整個專案環境包含自動化生成 .env
檔案、初始化與編輯腳本、持久化儲存設定,以及容器化配置。只需透過幾個指令,即可建立一個可重複部署且易於維護的 Node-RED 容器環境,免除繁瑣的手動安裝與權限調整過程。這樣的設計不僅強化部署效率,更符合現代 DevOps 自動化的實務需求。
🔗 GitHub 儲存庫:https://github.com/qwe987299/nodered-docker
📝 docker-compose.yml
services:
node-red:
image: nodered/node-red:latest
container_name: ${NODE_RED_CONTAINER_NAME}
restart: always
network_mode: bridge
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- TZ=Asia/Taipei
ports:
- "${NODE_RED_PORT}:1880"
volumes:
- ./node_red_data:/data
這份 docker-compose.yml
檔案定義了一個名為 node-red
的服務,使用最新版的 Node-RED 映像檔,容器名稱與對外埠號由 .env
檔案中的變數指定。該容器採用 bridge 網路模式,並透過 extra_hosts
將主機名稱 host.docker.internal
映射至 gateway,時區設定為台北時間,掛載本地的 node_red_data
資料夾作為容器內的 /data
目錄,以確保資料持久化,並設定當容器異常停止時自動重啟。
📝 .env.sample
# .env.sample
NODE_RED_CONTAINER_NAME=nodered
NODE_RED_PORT=1880
這份 .env.sample 檔案提供了 Node-RED 容器的預設環境變數,設定容器名稱為 nodered,對外映射的服務埠為 1880,可供使用者參考或複製編輯成正式的 .env 檔案使用。
📝 chown.sh
sudo chown -R 1000:1000 node_red_data
這支 chown.sh
腳本的內容非常簡潔,主要是透過 sudo chown -R 1000:1000 node_red_data
指令,將 node_red_data
資料夾及其底下所有檔案的擁有者與群組權限遞迴設定為 UID 及 GID 為 1000 的使用者,以確保 Node-RED 容器在運行時能正確讀寫該資料夾。
📝 init-env.sh
#!/bin/bash
# Function for countdown timer
countdown() {
local seconds=$1
local message=$2
echo "$message"
while [ $seconds -gt 0 ]; do
echo -ne "⏳ Waiting for $seconds seconds...\r"
sleep 1
((seconds--))
done
echo -e "\n✅ Done!"
}
# Check if .env file already exists
if [ -f .env ]; then
echo ".env file already exists."
read -p "Do you want to overwrite it? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "Operation canceled."
exit 0
fi
fi
# Interactive input for environment variables
read -p "Enter the container name (default: nodered): " container_name
read -p "Enter the Node-RED external port (default: 1880): " node_red_port
# Set default values if no input provided
container_name=${container_name:-nodered}
node_red_port=${node_red_port:-1880}
# Generate the .env file
cat <<EOF > .env
NODE_RED_CONTAINER_NAME=$container_name
NODE_RED_PORT=$node_red_port
EOF
echo ".env file has been created successfully!"
# Ask if the user wants to start the environment
read -p "Do you want to start the environment now? (y/N): " start_env
if [[ "$start_env" =~ ^[Yy]$ ]]; then
docker compose up -d
# Check if docker compose executed successfully
if [ $? -eq 0 ]; then
echo "✅ Environment started successfully!"
# Countdown for 3 seconds before running chown.sh
countdown 3 "Preparing to run chown.sh..."
if [ -f chown.sh ]; then
echo "▶️ Running chown.sh..."
bash chown.sh
# Check if chown.sh executed successfully
if [ $? -eq 0 ]; then
echo "✅ chown.sh executed successfully!"
else
echo "❌ Failed to execute chown.sh."
exit 1
fi
else
echo "❌ chown.sh not found. Please ensure the file exists."
exit 1
fi
else
echo "❌ Failed to start the environment. Please check the Docker Compose configuration."
exit 1
fi
else
echo "ℹ️ You can start the environment later using 'docker compose up -d'."
fi
這支 init-env.sh
是一個互動式初始化腳本,用來建立 .env
環境變數檔。使用者可透過終端機輸入容器名稱與對外埠號,若未輸入則使用預設值,接著自動產生 .env
檔案。腳本會詢問是否立即啟動 Docker 環境,若選擇啟動,會執行 docker compose up -d
並在短暫倒數後執行 chown.sh
,以設定資料夾權限,確保 Node-RED 容器能順利運作。
📝 edit-env.sh
#!/bin/bash
# Check if .env file exists
if [ ! -f .env ]; then
echo "⚠️ .env file not found. Creating a new one."
touch .env
fi
# Load current .env values if available
if [ -f .env ]; then
source .env
fi
# Function to update or add environment variable
update_env_var() {
local var_name=$1
local new_value=$2
if grep -q "^$var_name=" .env; then
sed -i "s/^$var_name=.*/$var_name=$new_value/" .env
else
echo "$var_name=$new_value" >> .env
fi
}
# Prompt user for new values (default to current values if available)
read -p "Enter the container name (current: ${NODE_RED_CONTAINER_NAME:-nodered}): " container_name
read -p "Enter the Node-RED external port (current: ${NODE_RED_PORT:-1880}): " node_red_port
# Set default values if no input is provided
container_name=${container_name:-${NODE_RED_CONTAINER_NAME:-nodered}}
node_red_port=${node_red_port:-${NODE_RED_PORT:-1880}}
# Update .env file
update_env_var "NODE_RED_CONTAINER_NAME" "$container_name"
update_env_var "NODE_RED_PORT" "$node_red_port"
echo "✅ .env file has been updated successfully!"
echo "🔄 Restarting Docker Compose to apply changes..."
docker compose down && docker compose up -d
echo "✅ Docker Compose restarted successfully!"
這支 edit-env.sh
腳本提供互動式方式修改 .env
檔案中的環境變數,使用者可依提示更新容器名稱與對外埠號,若未輸入則保留原值或使用預設值。修改完成後,腳本會自動重新啟動 Docker Compose 環境,以套用新的設定,確保 Node-RED 容器即時反映變更。
▲ 從 GitHub 下載範例專案後 cd nodered-docker/
進入專案目錄,接著下指令 bash init-env.sh
,依提示輸入容器名稱與埠號(可留空代表使用預設值),並選擇是否立即啟動環境,系統會自動拉取映像、啟動服務並執行權限設定。
▲ 打開瀏覽器進入 Node-RED 預設介面(預設連線網址為 localhost:1880
),即可看到歡迎畫面,代表服務已成功啟動並可開始流程設計。
透過本專案提供的 Docker Compose 環境,使用者能夠在數分鐘內快速部署 Node-RED,免去繁瑣的手動安裝與設定過程。不論是 IoT 開發者、資料流程設計者,或初學者,只需執行簡單的初始化腳本,即可自動建立環境變數、啟動容器,並完成資料夾權限設定。整體架構模組化、可維護性高。搭配 Node-RED 直覺的圖形化介面,能迅速進入開發階段,是一套實用又易於上手的解決方案。
留言區 / Comments
萌芽論壇