Shiny 容器化部署 – 从 Spider 开始

由于 Shiny 的部署越来越困难了,虽然经过了多年的解耦改造,还是出现了 Python 依赖版本地狱等问题,所以开始研究一下把 Shiny 整体容器化。

首先要选取一个 Python 版本基础,这里选了 Python 3.7,因为,我也不知道,反正有奇奇怪怪的兼容问题。然后这就是个标准的 Python 小项目,所以甚至直接用了 Python 镜像说明里的样例 Dockerfile 就能跑通了。

FROM python:3.7
WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "./Main.py", "ignite" ]

此外,还将 Shiny-Spider 项目原本的配置文件形式设置修改为了从环境变量读取,经过多年的解耦努力,Shiny-Spider 目前只需要 API Secret&Key 两个设置项就能工作了,优雅优雅。

于是这就完成了这个项目的 Docker 化,只需要用这个 Dockerfile build 一个 image 出来就能跑了,似乎比想象中简单。

那么怎么部署呢,由于这个程序需要 7×24 小时运行,所以需要一个监视它的东西,所以有人就要说该上 k8s 了,我一开始也是这么想的……但是,试了下发现我这破服务器,别说 k8s 了,连 k3s 和 minikube 都跑不起来。

所以找了个更更轻量的,只有管理容器功能的 Portainer ,发现基本满足需求。

在服务器 A 部署了 Portainer 管理端,然后在 Shiny-Main 上部署了 Portainer 的 Edge Agent。这里为什么选 Edge Agent 而不是一般的 Agent,原因是根据 Portainer 的文档,一般的 Agent 似乎没有鉴权,适合在内网使用或者需要额外的安全组规则,而 Edge Agent 是 Agent 去反连管理端,就没有这个问题。

此外还需要给 Shiny-Spider 配上 CI 自动构建镜像,这里也直接使用了 Github Actions+Github Packages 做 CI 和镜像托管。还能直接使用官方给的示例配置,基本没啥问题。

这里遇到一个问题,CI 一开始没有推镜像的权限,本来以为是 Token 的权限问题,但是根据文档,GITHUB_TOKEN 应该是默认有 package 的 write 权限的。

搜索一番,发现原因是组织里的包需要额外在 Packages 界面设置哪些 Repository 的 Actions 可以读/写这个包。

在这里设置一下就好了!

这样这个项目的一套流程就基本搞定了。后续打算继续改造 Shiny-Scripts 和 Shiny-Websocket-Relay,让他们也用上 Docker ~

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注