黑群的盡頭是白群
群晖這種家用 NAS 因為是 24 小時開啟,適合用來跑一些後台任務,例如api 監控幣價、定期資料處理、通知。
之前折騰了下群晖的定時任務和郵件、telegram 通知,也是踩了不少坑。最終實現了這樣的一個效果:
群晖的定時任務#
群晖的定時任務只支持有限的類型,惟「用戶定義的腳本」這個定時任務尤其雞肋,原因也和群晖的定制 Linux 有關:
- 「用戶定義的腳本」定時任務,填寫的腳本為 shell 直接解析的非交互式腳本,不能直接 su,進不了 docker,一些想動的文件、想搞的操作沒有權限
- 群晖的 Linux 後台沒有想過提供 CLI 方式的工具給用戶,例如直接就沒有證書,導致不能做出 TSL 和 HTTPS 的通信(雖然有很麻煩的方法可以解決),所以想直接在群晖的 Linux 內裸調接口、執行腳本是非常困難的
- 定時任務只能在異常退出的時候發出郵件通知,郵件通知的內容就是未重定向的 tty 輸出。所以想要實現定時任務觸發郵件通知,可以要將想發的內容 cat 出來再
exit -1
前面說了直接在群晖的 Linux 裸執行命令處處都束手束腳的,遂轉向 docker 內實現。
docker pt. 1#
直接拉了一個 ubuntu 的官方 docker 下來,沒想到這個 docker 鏡像也太寒酸了,什麼 CLI 工具都沒有。之前很多人推薦的直接拉帶 ssh 的 docker 鏡像,但是那個鏡像是 Ubuntu 14 並且是私人封裝的,還是不太想用。
- 首先要安裝軟體包就要先換成國內鏡像源,結果 vim nano 之類的都沒有,要安裝他們又要先換鏡像源,ubuntu 典中典。我反正是直接 echo 進去的
- 裝 ssh,配 ssh,裝 python, …
- 映射文件夾,讓 docker 內腳本執行輸出的文件能直接在群晖 Linux 下讀取
- 最後把編寫的腳本放進去執行,又發現了一個典中典,我想用的 api 是不能直接訪問的,需要科學上🕸…
docker pt. 2#
然後拉了一個cXXXh
(手動和諧)鏡像,添加7890
端口映射,docker 全部改成橋接,把 ubuntu 容器的 http/s proxy 設成 cXXXh 容器的地址 + 7890,再去 ubuntu 容器繼續調 api。此步帶來的額外 buff 是可以直接讓 NAS 變成旁路由。由於 cXXXh 容器是配置文件式的設置過程,又裝了個 web 前台來用 GUI 調整和觀察配置:
資源情況:
2G 的內存幹點這些事情還是綽綽有餘的。
腳本能跑之後,設置個 cron 定時運行,就可以實現一直監控 api、定時爬取數據、處理數據了,之後就可以考慮怎麼通知了。
通知#
我採用的通知觸發方式是非常原始的。ubuntu 容器內的定時腳本跑完後,會輸出結果到掛載在群晖 Linux 下的一個目錄內,如果達到觸發條件,就會在輸出文件添加特定字符。群晖的 DSM 設置添加一個「用戶定義的腳本」定時任務,每次執行時直接grep -q
輸出文件看有沒有特定字符,有就 exit -1,發郵件。
同時還玩了下 telegram 的 bot,可以直接從 ubuntu 容器內把通知發出去,參考
透過 Telegram Bot 發送 Synology 系統訊息
關於旁路由#
雖然沒有正經測試,但是 NAS 上的旁路由可以通過 uPnP 實現透明代理(主要看路由器),不想折騰也可以只配個代理伺服器,性能應該是比手機端側強的。家裡不怎麼挪動的設備如平板、主機之類的可以直接一次配好不要再動了。
另外本次操作違反了之前迈出白群第一步所相信的 all in one 也要數據和計算分離的理念,真的定時事務、運算事務還是應該交給一台專門的機器負責(下一步,N5105 萬兆走起?),群晖應該盡量關閉端口老老實實做 NAS。雖然從看板上看群晖搞三個 docker 再跑定時任務也沒啥負擔:
關於任務#
理論上可以直接在群晖的 Ubuntu docker(或者任意一個「不願意透露姓名」的遠端)上實現一個全功能的 telegram bot 而不暴露任何公網接口,對沒有公網 IP 資源的人來說非常友好。
群晖後台的裸 Linux 是非常難用的,很多工具都找不到或者用不了,拜它的魔改和特殊 CPU 架構所賜。
P.S. 有公網 IP 資源的還折騰個啥,直接搞個看板定時刷新數據就行了。