安裝 Add-on 22.0.1 與安全設定
依 Add-on 22.0.1 官方文件完成安裝、啟動、日誌檢查與開啟 Web UI,並在動手公開 direct port 前,分清 Ingress、TLS、editor 認證、HTTP endpoint 認證與 static content 認證。
為何需要本章
Add-on 開箱即預先設定 Home Assistant server connection;安裝第一天最安全的做法不是貼上網路文章的長篇 YAML,而是先以預設 Ingress 路徑確認服務正常,再逐項評估是否真的需要 direct access、自訂套件或 shell command。家庭自動化通常握有燈光、門窗狀態與通知能力;錯誤公開 editor 或 flow endpoint 的影響不只是「網頁被看到」。
本章只處理 Add-on 管理層。你不需要自行輸入 Home Assistant token,也不應把 Supervisor token、憑證私鑰、真實 URL 或 entity ID 放入設定範例。修改 Add-on 設定後,固定版本官方文件要求重新啟動 Add-on;在家中重要自動化已依賴 Node-RED 時,先安排維護時段並評估中斷。
leave_front_door_open。固定版本官方文件即使對內網也強烈反對。內網不等於受信任邊界。核心觀念:入口、傳輸與認證要分開
| 層 | 用途 | 22.0.1 可驗證行為 |
|---|---|---|
| Home Assistant Ingress | 從 Home Assistant UI 開啟 editor | manifest 為 ingress: true、動態 ingress_port: 0、ingress_stream: true;NGINX ingress listener 限制 Supervisor ingress 位址 |
| Direct access | 把容器 Web interface 映射到 host | manifest 提供容器 80/tcp,建議 host 1880;是否啟用取決於 Network port 設定 |
| Direct TLS | 加密 direct listener 傳輸 | ssl、certfile、keyfile只套用 direct access,對 Ingress 無效 |
| Editor direct auth | 保護 direct 的 editor 路徑 | wrapper/NGINX 預設透過 Supervisor auth;不可用 leave_front_door_open 繞過 |
| Flow HTTP auth | 保護 flow 建立的 /endpoint/ | 由 http_node username/password 管理;不是 editor 登入 |
| Static auth | 保護 Node-RED static content | 由 http_static 管理,與上述兩者獨立 |
Add-on runtime 將 Node-RED backend 固定在 loopback 127.0.0.1:46836,使用 /config/ 作 userDir、/config/nodes 作 nodesDir、flows.json 作 flowFile,並把 httpNodeRoot 固定為 /endpoint。Node-RED 自身設定中的 adminAuth 與 https 為 null,是因為認證與 TLS 委派給外層 NGINX/wrapper;這絕不表示公開是安全的。
官方安裝、啟動與驗證順序
- 從 Home Assistant 開啟 Add-on 頁。
依固定 Add-on DOCS 的 My Home Assistant 按鈕前往此 App;確認頁面顯示的是 Community App: Node-RED。若你的平台或管理介面名稱略有不同,以 Add-on 詳細頁為定位,不要使用來路不明的容器映像。
- 按下 Install。
等待安裝完成,不要同時加入
npm_packages、system_packages或init_commands。本版只宣告aarch64與amd64;不相符的硬體不要用非官方方式繞過架構檢查。 - Start「Node-RED」App。
首次啟動會建立
/config所需內容;固定初始化程式也包含舊資料與 theme 遷移處理。若/config/package.json已存在,初始化還會嘗試移除衝突的舊套件node-red-contrib-home-assistant、node-red-contrib-home-assistant-llat與node-red-contrib-home-assistant-ws;解除安裝失敗時會記錄 warning。讓初始化完成,不要在啟動中途手動改檔。 - 先檢查 Node-RED logs。
官方順序明確要求先看 logs 是否一切正常。尋找啟動完成或清楚錯誤;分享畫面前遮蔽 token、主機名稱、URL、路徑中的個資與訊息 payload。不要因 editor 暫時未開就反覆按 Start。
- 按「OPEN WEB UI」。
從 Add-on 頁使用按鈕進入預先設定好的 editor。固定文件說不需要新增、變更或更新 server connection;不要為了「完成安裝」自行貼入 token。
- 保持預設入口,建立驗收紀錄。
先不公開 direct port。記錄 Add-on 22.0.1、啟動結果與 Ingress 是否可開啟;接著閱讀第 3 章,再以第 4 章的無副作用 Flow 驗證 runtime。
安裝前提、架構與權限能力
Add-on manifest 的 Home Assistant 安裝門檻是 2023.3.0,但 HA WebSocket 0.80.3 對使用者列出的 prerequisite 是 Home Assistant 2024.3+;要使用本指南整合功能,應滿足後者。Add-on 22.0.1 只宣告 aarch64、amd64,並設 init: false。這個 init manifest flag 不是 Node-RED Safe Mode。
Manifest 授予的能力
| 宣告 | 精確值 | 你應如何判讀 |
|---|---|---|
| Supervisor API | hassio_api: true、hassio_role: manager | 容器取得高權限 Supervisor manager 能力;不得輸出 token |
| Home Assistant API | homeassistant_api: true | 可連 Home Assistant Core API;不代表 flow 應硬編碼 token |
| Authentication API | auth_api: true | wrapper 可使用 Supervisor auth API;不能外推到所有 endpoint |
| Network | host_network: true | 擴大本機網路可達面;每個 HTTP、MQTT、TCP/UDP 與 discovery 用途仍須最小化 |
| Serial | uart: true | 有 UART 能力;只有明確需求與裝置控制計畫時才使用相關節點 |
這些是容器層 grants,不代表每條 flow 都會使用。安裝第三方節點後,該程式碼在 Node-RED process 權限下執行;因此「Add-on 已核准」也不等於任意 npm package 都可信。
固定 node-red/package.json 也直接鎖定 bcryptjs 3.0.3 與 js-yaml 5.2.2。前者供 wrapper 的 HTTP Basic Auth hash,後者是 wrapper/runtime 支援依賴;它們不是你需要拖到 Palette 的節點,也不能據此推論所有 routes 共用同一認證。不要自行替換這些映像內依賴。
資料 maps 與備份界線
| Map | 模式 | 安全意義 |
|---|---|---|
addon_config | rw | /config 可持久化 flows、settings、nodes 與 credentials;限制檔案存取 |
homeassistant_config | rw | 可讀寫 Home Assistant configuration;不要讓一般 flow 任意操作 |
media | rw | 驗證檔名、路徑與不可信內容,避免覆寫或 path traversal |
share | rw | 可能被其他 Add-ons 存取,不要存明文 secrets |
ssl | manifest 未標 rw | 供 direct TLS 讀取憑證與私鑰;絕不把私鑰內容放進 flow 或 log |
manifest 的 backup_exclude 排除 node_modules。因此備份不是逐 byte 的完整容器副本;還原後自訂 dependency tree 必須能重建。這也是固定第三方 package 版本、保留設定清單與在還原後重新驗證的理由。
每一個 Add-on 選項
下表以 22.0.1 的 config.yaml 為準。問號代表 schema 可省略;「預設」只在 manifest 的 options 明列時填入。不要直接複製官方 DOCS 的示範帳密或命令;該段原文也明確提醒只是範例。
| 選項 | 預設/schema | 用途與安全操作 |
|---|---|---|
log_level | 未顯式預設;trace|debug|info|notice|warning|error|fatal,可省略 | 控制 Add-on log 詳細度;官方 DOCS 說預設為 info。排障才短暫提高,完成後調回必要程度,因 log 可能含訊息內容 |
credential_secret | 未顯式預設;password,可省略 | 加密 Node-RED 儲存 credentials。設定後安全備存且不要任意更改,否則既有 credentials 無法解密;Projects 手動啟用時行為另有邊界 |
theme | default;固定清單,可省略 | 只改 editor 外觀,不是資安控制;變更後重啟 Add-on |
http_node.username / password | 空字串;str/password | 保護 flow 建立的 /endpoint/;需 direct port 才能按 DOCS 所述方式存取。與 editor auth 分開,使用自訂強密碼 |
http_static.username / password | 空字串;str/password | 只保護 static content,不保護 editor 或其他 routes |
ssl | true;bool | direct listener TLS 開關,對 Ingress 無效;不要只看這個值就判定整體安全 |
certfile | fullchain.pem;str | /ssl/ 下 certificate filename;不會自動簽發或續期,需驗證來源、有效期與配對 |
keyfile | privkey.pem;str | /ssl/ 下 private-key filename;限制讀取,禁止匯出內容 |
system_packages | [];字串陣列 | 啟動時安裝額外 Alpine packages;增加供應鏈、原生程式與啟動時間風險 |
npm_packages | [];字串陣列 | 啟動時安裝額外 npm/Node-RED packages;固定版本、審查維護者與程式能力,最初保持空陣列 |
init_commands | [];字串陣列 | 每次啟動逐行以 shell eval 執行;具有任意命令能力,不放秘密,最初保持空陣列 |
leave_front_door_open | 未顯式預設;bool,可省略 | 繞過 direct editor 的 Supervisor auth。不要啟用;保持省略或 false,即使只有內網也一樣 |
safe_mode | 未顯式預設;bool,可省略 | true 會傳入 --safe,runtime 啟動但 flows 不啟動,僅供修復;不是認證或永久停用 |
max_old_space_size | 未顯式預設;int,可省略 | V8 old-space MB;不是 container 總 RAM 限制。不要在無量測下任意設高或設低 |
每次啟動的自訂初始化順序固定為 system_packages → npm_packages → init_commands。這是 fail-fast 流程:任何 package 安裝或 command 失敗,都會立即中止該初始化服務,後續階段不會繼續執行。
Theme 固定清單
查看 22.0.1 支援的 theme 名稱
schema 允許以下名稱:
defaultauroracobalt2darkdark-moderndraculaespresso-libregithub-darkgithub-dark-defaultgithub-dark-dimmedmidnight-redmonoindustrialmonokaimonokai-dimmednight-owlnoctisnoctis-azureusnoctis-bordonoctis-minimusnoctis-obscuronoctis-serenonoctis-uvanoctis-violaoceanic-nextoledone-dark-proone-dark-pro-darkerrailscasts-extendedselenized-darkselenized-lightsolarized-darksolarized-lighttokyo-nighttokyo-night-lighttokyo-night-stormtotallyinformationzenburnzendesk-garden
初始化程式會處理舊 dark 向 dark-modern 的遷移;新設定可直接選清單中的現行項目。
Ingress、direct port、TLS 與 HTTP routes
首選 Ingress
從 Home Assistant 的 OPEN WEB UI 進入,不需要先映射 host port。manifest 的動態 ingress port 不是你應手動打開的固定對外 port;ingress_stream: true 也不等於每個自建 endpoint 都自動受 Home Assistant 登入保護。
Direct access 是額外暴露面
manifest 宣告容器 80/tcp 可映射 host 1880,description 為 Web interface。只有明確需要直接存取 HTTP nodes 或 dashboard 等 route,且已完成網路分區、TLS、認證與來源限制評估時,才在 Add-on 的 Network 區設定 port。不要公開到網際網路,也不要假設路由器 NAT 或「只有家人知道位址」就是控制措施。
/endpoint/ 特別重要
固定 direct NGINX template 對 /endpoint/ 不套 editor 的 Supervisor auth;應由 http_node credentials 保護。Add-on DOCS 也指出 HTTP nodes 或 dashboard 要使用 direct access,URL 應以 /endpoint/ 開頭,否則 Home Assistant authentication 會介入。這不表示只要加 prefix 就安全:仍須 Basic Auth、TLS、輸入驗證與 rate/size 控制。
TLS 不是身份驗證
ssl: true 只讓 direct listener 使用 HTTPS;certfile 與 keyfile 從 /ssl/ 取得。憑證驗證伺服器及加密傳輸,不能取代 editor auth 或 endpoint credentials。Ingress TLS 由其外層路徑處理,不受此選項控制。
安全初始設定與變更清單
- 先保留
theme: default、ssl: true、預設憑證檔名,並讓system_packages、npm_packages、init_commands都是空陣列;不要加入未用功能。 - 保持 direct host port 未公開。若業務需求必須啟用,逐一驗證 direct TLS、editor auth、
http_node與http_static,並限制網路來源。 - 絕不啟用
leave_front_door_open。safe_mode只在排障時暫用,修復後先審視有副作用節點,再按計畫恢復。 - 為
credential_secret建立受控備存,不把值放在 flow、公開截圖或版本庫。設定後不要任意更改。 - 每次設定變更前記錄目的與回復值;變更後依官方文件 restart Add-on,先讀 logs,再 OPEN WEB UI。重要家庭自動化要安排可接受的中斷時段。
- 備份策略要考慮
node_modules被排除;保留固定版本的自訂套件清單,並實際演練還原後重建與 flow 驗證。 - 日誌提高至 trace/debug 前先縮小重現範圍;完成後降低層級,分享時清除秘密、環境 ID、內部 endpoint 與私人事件內容。
故障排除
- 安裝按鈕不可用:先核對 Home Assistant 與硬體。22.0.1 manifest floor 為 2023.3.0,architecture 只有 aarch64/amd64;不要用手動改 manifest 的方式繞過。
- Start 後 OPEN WEB UI 無法使用:按照官方順序先看 Add-on logs。等待首次初始化完成,確認沒有自訂 package 或 command 失敗;不要先新增 direct port。
- Ingress 可開 editor,但 HTTP In endpoint 不通:這是預期需要另行設計的邊界。DOCS 指出 HTTP nodes 需要 Network direct access,並使用
/endpoint/;啟用前先配置 TLS 與http_node強認證。 - Direct access 出現憑證錯誤:確認
ssl、/ssl/下的 certfile/keyfile 名稱、憑證有效期與配對;不要關閉認證或公開 HTTP 當作修復。 - 修改
credential_secret後 credentials 失效:停止反覆修改。固定 DOCS 明確說變更會使既有 credentials 無法解密;依受控備存與備份復原,不要把值貼到 issue。 - 加套件後啟動很慢或失敗:移除最近新增項目,一次只恢復一項。每次啟動依
system_packages→npm_packages→init_commands執行;任一 package 安裝或 command 失敗都會立即中止該初始化服務。 - Flow 啟動後立即造成問題:設定
safe_mode: true並 restart 以不啟動 flows 的方式修復;完成後先檢查 Action、HTTP、檔案與裝置節點,再移除 Safe Mode。
固定來源
- Add-on 22.0.1 固定提交:本章的 manifest、runtime、初始化與 NGINX 證據。
- 固定
config.yaml:options、schema、ports、grants、maps、architectures 與 backup exclusion。 - 固定版本官方 Add-on 文件:Install、Start、Logs、OPEN WEB UI、選項與已知限制。
- Home Assistant 官方 Apps 操作文件,用於管理介面的一般背景;22.0.1 精確值仍以固定提交為準。
常見問題
安裝後要自己新增 Home Assistant server 或 token 嗎?
ssl: true 是否代表 Ingress 與所有 endpoint 都安全?
可以只在家中內網啟用 leave_front_door_open 嗎?
為何 /endpoint/ 需要另外設定帳密?
http_node 保護。仍需 TLS、輸入驗證與網路限制。加入 npm package 後 App 反覆啟動失敗,先做什麼?
備份是否包含已安裝的全部 npm 檔案?
node_modules;還原後 dependency tree 必須可由受控清單重建並重新驗證。