群晖docker后台任务:api请求和通知

黑群的尽头是白群

群晖这种家用NAS因为是24小时开启,适合用来跑一些后台任务,例如api监控币价、定期数据处理、通知。

之前折腾了下群晖的定时任务和邮件、telegram通知,也是踩了不少坑。最终实现了这样的一个效果:

IMG_52B774277E2B-1

截屏2022-09-24 23.28.34

群晖的定时任务

群晖的定时任务只支持有限的类型,惟「用户定义的脚本」这个定时任务尤其鸡肋,原因也和群晖的定制Linux有关:

  • 「用户定义的脚本」定时任务,填写的脚本为shell直接解析的非交互式脚本,不能直接su,进不了docker,一些想动的文件、想搞的操作没有权限
  • 群晖的Linux后台没有想过提供CLI方式的工具给用户,例如直接就没有证书,导致不能做出TSL和HTTPS的通信(虽然有很麻烦的方法可以解决),所以想直接在群晖的Linux内裸调接口、执行脚本是非常困难的
  • 定时任务只能在异常退出的时候发出邮件通知,邮件通知的内容就是未重定向的tty输出。所以想要实现定时任务触发邮件通知,可以要将想发的内容cat出来在exit -1

截屏2022-09-24 23.43.11

前面说了直接在群晖的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调整和观察配置:

image-20220925001421178

资源情况:

image-20220925001449567

2G的内存干点这些事情还是绰绰有余的。

脚本能跑之后,设置个cron定时运行,就可以实现一直监控api、定时爬取数据、处理数据了,之后就可以考虑怎么通知了。

通知

我采用的通知触发方式是非常原始的。ubuntu容器内的定时脚本跑完后,会输出结果到挂载在群晖Linux下的一个目录内,如果达到触发条件,就会在输出文件添加特定字符。群晖的DSM设置添加一个「用户定义的脚本」定时任务,每次执行时直接grep -q输出文件看有没有特定字符,有就exit -1,发邮件。

同时还玩了下telegram的bot,可以直接从ubuntu容器内把通知发出去,参考

透過Telegram Bot發送Synology系統訊息

Telegram Bot API

关于旁路由

虽然没有正经测试,但是NAS上的旁路由可以通过uPnP实现透明代理(主要看路由器),不想折腾也可以只配个代理服务器,性能应该是比手机端侧强的。家里不怎么挪动的设备如平板、主机之类的可以直接一次配好不要再动了。

另外本次操作违反了之前迈出白群第一步所相信的all in one也要数据和计算分离的理念,真的定时事务、运算事务还是应该交给一台专门的机器负责(下一步,N5105万兆走起?),群晖应该尽量关闭端口老老实实做NAS。虽然从看板上看群晖搞三个docker再跑定时任务也没啥负担:

image-20220925002120169

关于任务

理论上可以直接在群晖的Ubuntu docker(或者任意一个「不愿意透露姓名」的远端)上实现一个全功能的telegram bot而不暴露任何公网接口,对没有公网IP资源的人来说非常友好。

群晖后台的裸Linux是非常难用的,很多工具都找不到或者用不了,拜它的魔改和特殊CPU架构所赐。

P.S. 有公网IP资源的还折腾个啥,直接搞个看板定时刷新数据就行了。