今天继续折腾了一会儿 NUC 8,处理了网络问题,增加了一个观察机器状态的面板,部署了一个 RSS 阅读器。
网络和代理
NUC 放在家里局域网里,访问国内网站当然没什么问题,但一碰到 Google、Docker Hub 这类国外资源,就开始不稳定。之前为了解决 Docker Hub 慢的问题,我配置过国内 Docker 镜像源,但实际用下来也不省心:配置的镜像源不稳定,经常遇到下载镜像资源的时候慢的怀疑人生。
所以我开始考虑给 NUC 配一套更通用的代理方案。期望的是整台 NUC 可以科学上网。
调研后选装了 v2rayA。目前只启用了基础功能,给 NUC 提供几个代理端口,比如 HTTP / SOCKS5 代理,设置在环境变量中。也就是说,应用如果知道去用这些端口,就能走代理;如果应用不知道,默认还是直连。
这次折腾也验证了一个点:NUC 主机能访问外网资源,不代表 Docker daemon 能顺利拉镜像,也不代表容器里的程序能正常出网。主机、Docker、容器内部、应用自己的 HTTP 客户端,其实是几条不同的链路。
Glances 监控面板

8080 这个端口之前是一个 nginx demo 页面,没什么意义。部署个 Glances,没事的时候可以看看机器状态,也挺有意思的。
小插曲:之前为了加速 Docker 配的 registry mirror,在这次拉 Glances 镜像时反而成了阻碍。后来把 Docker 的 registry mirror 配置删掉,再拉 nicolargo/glances:latest,速度飞快。
RSS 阅读器

为了验证我的 NUC 服务器网络环境是否能订阅国外的资源,我有了部署一个 RSS 阅读器的想法。
最初我找了一个老牌的 RSS Reader 软件:FreshRSS。部署很顺利,但 RSS 订阅链接在 FreshRSS 里一直失败。日志里出现的是 cURL error 28: Connection timed out。FreshRSS 还有一个问题:界面确实比较老旧。我想找一个更现代一点的 RSS 阅读器,就懒得折腾了,于是尝试换成 Fusion。
然而 Fusion 能顺利订阅国内或者没被墙的资源,但继续添加 Hacker News RSS 时又失败了。排查后发现,网络链路其实是通的:在同一个 Docker 网络里,用 curl 手动指定 v2rayA 代理可以访问 Hacker News。真正的问题是 Fusion 自己报了 private host is not allowed。也就是说,Fusion 为了安全,阻止 RSS 抓取逻辑访问 Docker 内网里的代理地址。v2raya:20171 对它来说是 private host,即使是我自己的代理服务,它也不让用。
后面又换成 CommaFeed。它有一个明确的配置项可以允许 local/private host,但一开始用的 athou/commafeed:latest-h2 是 native 版。这个版本配置 JAVA_TOOL_OPTIONS 代理参数不生效,CommaFeed 自己抓 Hacker News 时还是直连,继续失败。最后换成 athou/commafeed:latest-h2-jvm 才成功。JVM 版会读取 Java 的代理参数,于是请求路径变成:
CommaFeed JVM 版 -> v2rayA HTTP 代理 -> Hacker News RSS
这次 RSS 折腾到最后,结论是:现在这种代理方式,每个 app 都要单独配置代理,否则它就是直连。 后面应该找个时间专门鼓捣一下透明代理、TUN 模式或者更接近系统全局代理的方案,最终期望效果是,全局流量默认都被接管,自动分流。
小结
重点其实就几件事:
- 部署了 v2rayA,但目前还是每个应用单独配置代理,不是全局代理。
- 部署了一个能查看 NUC 状态的服务:Glances。
- RSS 阅读器从 FreshRSS、Fusion 折腾到 CommaFeed,最后 JVM 版配代理成功。
- 后面需要找时间研究透明代理、TUN 或全局代理方案。