黑群的尽头是白群
群晖这种家用 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 资源的还折腾个啥,直接搞个看板定时刷新数据就行了。