Docker Compose 快速安裝 Node-RED

2025/04/25 25 1 網站技術 , 伺服器 , 物聯網 , Node.js , Node-RED

在物聯網(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 直覺的圖形化介面,能迅速進入開發階段,是一套實用又易於上手的解決方案。

贊助廣告 ‧ Sponsor advertisements

留言區 / Comments

萌芽論壇