前言
自從 RouterOS 在 v7.13 引入 container 功能後,這為我們這些 Homelab 愛好者開啟了一扇新的大門。我們終於可以在路由器上原生執行 container,這意味著一些網路相關的基礎設施服務(Infrastructure Services)可以從原本的伺服器中遷移出來。
以我為例,過去我的 Adguard Home 是 deploy 在我的 Homelab 伺服器群中。然而,作為一個喜歡「折騰」的工程師,Homelab 難免會因為硬體更換、系統升級或是實驗新架構而需要重啟。每當這時候,家裡的網路 DNS 解析就會中斷,隨之而來的就是家人的抱怨。
為了解決這個單點故障(SPOF)的問題,我決定將 Adguard Home 改為 deploy 在 Router (RB5009UG) 上。這樣做不僅減少了物理上的 latency,更重要的是將「網路服務」與「應用服務」解耦,避免因為 Homelab 的維護而導致全家斷網。
這是遷移後的狀態:
[user@RB5009UG] > container print
Flags: R - RUNNING
Columns: NAME, ROOT-DIR, INTERFACE, MOUNTLISTS, ENTRYPOINT
# NAME ROOT-DIR INTERFACE MOUNTLISTS ENTRYPOINT
0 R b51e0424-8fce-4c3d-b4bb-6493f76aa24b /usb1/container/adguardhome adguardhome adguardhomeConfig /opt/adguardhome/AdGuardHome
RouterOS v7.21 的新變革:App

而在最近發布的 RouterOS v7.21 中,Mikrotik 給我們帶來了更方便的 container 部署方式,他們稱呼為 App。
老實說,不得不吐槽一下這個命名實在有點 naive,聽起來像是某種手機應用程式商店,但實際上它是一個簡化版的 container 部署清單。
以下是 v7.21 release note 中關於 container 的重點更新:
- container: added “/app” menu for simple containerized app installation
- container: added CPU usage and limit options
- container: added kill, run, update commands (CLI only)
- container: allow to configure extra ENV variables directly in container
- container: general container service stability fixes and improvements
在這次更新中,最引人注目的就是我們可以透過 /app 選單快速檢視並部署一些預定義好的服務:
[user@RB5009UG] > app print
Flags: X - DISABLED
Columns: NAME, CATEGORY, DESCRIPTION
# NAME CATEGORY DESCRIPTION
0 X adventurelog productivity AdventureLog is a travel blog and photo journal web application
1 X babybuddy productivity A buddy for babies! Helps caregivers track sleep, feedings, diaper changes, and tummy time to learn about and predict baby's needs without (as much) guess w
ork
2 X backrest storage Web-based backup solution with support for local and cloud storage backends
3 X caddy networking Caddy 2 is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go.
4 X calibre-web productivity a clean interface for browsing, reading and downloading eBooks using an existing Calibre database
5 X chr networking Cloud Hosted Router - RouterOS Virtual Machine
6 X cinny communication Matrix client focusing primarily on simple, elegant and secure interface
7 X cloudflared networking Client for Cloudflare Tunnel, a daemon that exposes private services through the Cloudflare edge.
8 X code-server development Code-server is VS Code running on a remote server, accessible through the browser.
9 X conduit communication Conduit is a simple, fast and reliable chat server powered by [matrix]
...
看著這個列表,想像空間確實很大。我們甚至可以在 Router 上直接跑 code-server 進行開發,或是跑 gitea 這種輕量級的 git server,甚至是用 caddy 來做 reverse proxy。對於預算有限或是想要極致精簡設備的玩家來說,這台 Router 確實有潛力成為一台 All In One 的 Homelab 主機。
反思:Router 還是該回歸 Router
雖然功能強大,但冷靜下來思考,我的考量點仍是在:這台設備的首要任務是什麼?
Router 的核心職責是負責封包轉發、防火牆規則處理以及維持網路連線的穩定。如果在 Router 上部署了過多吃資源的 App(例如 code-server 或資料庫相關應用),很容易面臨以下風險:
- 資源競爭:吃滿記憶體或 CPU,導致 routing 效能下降,甚至觸發 OOM (Out of Memory) 導致系統不穩。
- 儲存壽命:Router 通常使用的是 NAND Flash,這類儲存介質(在沒有備援的情況)並不適合頻繁的寫入操作(Log、Database IO)。
- 維護複雜度:RouterOS 的 container 實作畢竟不是標準的 Docker/Kubernetes 環境,除錯和管理上還是有其侷限性。
因此,我的結論是:Router 還是該負責好 Router 的事情就好。其他的 Service 還是部署在專門的 Homelab Server 上比較好維護,避免吃滿記憶體或是寫爆 Disk。
怎樣可以更好:硬體層面的保護
雖然決定不在 Router 上跑重型應用,但像 Adguard Home 這種輕量且關鍵的 DNS 服務,我還是堅持留在 Router 上。為了克服上述提到的「儲存壽命」問題,我做了一些硬體上的調整。
我的 RB5009UG 上有一個 USB 3.0 的插槽。我沒有直接使用內建的 NAND Flash 來存放 container data,而是插上了一隻高品質的 MLC USB 隨身碟。
我將 Adguard Home 的 Root Dir 以及 mount point 全部指向這個 USB 儲存裝置:
/usb1/container/adguardhome
這樣做的最大好處是,Adguard Home 產生的大量 query log 和統計數據,只會寫入到這隻 USB 隨身碟上,完全避免了對 RB5009UG 內建 NAND Flash 的高頻率擦寫。如果不幸 USB 隨身碟寫壞了,換一隻就好,Router 本體毫髮無傷。
結語
RouterOS v7.21 的 App 功能無疑降低了在路由器上玩 container 的門檻,讓 All In One 的夢想更近了一步。但作為工程師,我們在享受技術便利的同時,也要評估架構的合理性與風險。適度的分離職責,善用外部儲存保護硬體,才能讓我們的 Homelab 之路走得更長久、更穩定。
以及… hAP be3 Media 什麼時候才要出… 等好久…
