[转载] 使用 Docker 部署 openstf 平台

转载自简书,地址:https://www.jianshu.com/p/51ed344a7ba7

一、背景

笔者所处业务需要搭建一个云测平台,用于集中管理一批安卓系统板卡,经过方案选择,决定使用 openstf 进行搭建,一来 openstf 开源,二来大部分服务采用nodejs进行编写,方便笔者进行二次开发。

二、主要环境

本地环境为 mac,线上环境为 k8s(docker),连接板卡环境为deepin(linux)。

生产环境为 docker 和 linux,为了测试,会首先在 mac 上搭建,所以以下搭建过程会兼顾 mac 环境。

三、openstf 架构

官方文档上将一个个服务称为单元。在本次部署中,将 stf-provider 单元部署在直接连接设备的 linux 机器上,其他主单元部署在云端服务器上。具体单元分配如下:

  • 云服务器:
  • rethinkdb
  • stf-storage-temp
  • stf-storage-plugin-apk
  • stf-storage-plugin-image
  • stf-triproxy-app
  • stf-triproxy-dev
  • stf-processor
  • stf-websocket
  • stf-api
  • stf-reaper
  • stf-app
  • stf-auth
  • linux(deepin)机器:
  • adbd
  • stf-provider

mac 无法使用 docker host 模式,但是 stf-provider 需要监听一定范围内的端口,所以无法在mac上使用 stf provider
adbd 需要映射 /dev/bus/usb,mac 上没有该输入。所以这两个服务要部署在本地 linux 机器(windows 自查)。

下面介绍每个单元的作用及提供 docker 启动脚本。以下顺序也是服务启动顺序。
以下实例中,除了 adbdstf-provider 单元,其他单元同一台机器进行部署。所以端口都设置成不冲突的端口,在容器需要访问其他服务 ip 时都使用了 host.docker.internal127.0.0.1,如果部署在不同机器上,需要将其替换成机器地址。

其中, host.docker.internal 在容器内能映射成宿主机 ip,主要是为了兼容不支持 host 的环境(如mac),在支持 host 的环境中(如 linux),也可直接换成 127.0.0.1

四、主服务部署(云服务器)

rethinkdb 为 openstf 服务采用的数据库服务(据说当时作者在开发时选择它是因为作者想学习当时作为新技术的 rethinkdb )。有 RethinkDB 集群的话可以不启动此服务。

参数注释如下:

  • -it 让容器保持在前台运行,此参数在生产环境部署可去除;
  • --rm 在容器退出时自动清理容器内部的文件系统,方便调试,此参数在生产环境部署时可去除;
  • host.docker.internal 在容器内会映射到宿主机 ip,如果 docker 使用 host 模式可以替换成 127.0.0.1
  • -p 为宿主机端口到容器内端口的映射,以上暴露的三个端口,都是连接 rethinkdb 需要用到的。这么处理是为了兼容不支持 docker host 模式的环境(如mac),linux 机器可以直接使用 --net=host 共享宿主机网络。之后没有特殊说明,都采用相同的处理。

2、* stf-migrate

此单元初始化数据库表,创建 stf 需要的各种表格。只需要运行一次。

提供数据持久化的服务(本教程中主要提供给 stf-storage-plugin-imagestf-storage-plugin-apk)。

此单元的实例不能超过一个,因为同时使用了临时文件和内存映射。

该 APK 存储插件从主存储单元加载原始 Blob,并允许对 APK 文件执行其他操作,例如检索 AndroidManifest.xml

该 image 存储插件从主存储单元加载原始 Blob,并允许使用参数调整图像大小。

该单元发送和接收来自 stf-app 单元的请求,并将其分发给 stf-processor 处理。

该单元发送和接收来自 stf-provider 单元的请求,并将其分发给 stf-processor 处理。

该单元为 stf 服务主力,它充当设备与 stf 程序之间的桥梁,几乎所有通信都通过它进行。

  • RETHINKDB_PORT_28015_TCPrethinkdb 地址,由于实例部署在同一台机器上,所以使用了 host.docker.internal,若分布在不同机器,则需要改为对应机器ip地址。
  • -e RETHINKDB_PORT_28015_TCP=tcp://host.docker.internal:28015 可用 --link rethinkdb:rethinkdb 代替,效果相同。
  • connect-app-dealerstf-triproxy-app 地址, connect-dev-dealerstf-triproxy-dev

此处tcp地址不能写域名映射,如 tcp://triproxy-app.openstf.com,会导致服务直接访问到 tcp://triproxy-app.openstf.com:0

该单元提供客户端js脚本和服务器端 ZeroMQ + Protobuf 之间的通信层。STF 中的几乎每个动作都通过此单元进行。

该单元为 STF 提供了所有主要的 RESTful API。用户可以从 STF UI 生成其个人访问令牌,并且可以使用该令牌从任何界面访问这些 api。

该单元监听 device workers 的心跳,并将丢失的设备标记为不存在,直到继续收到心跳信息。目的是确保数据库中存在/不存在标志的完整性,以防 stf-provider 意外关闭或发生另一个意外失败。它在启动时从数据库加载当前状态,并在事件路由到它时继续修补其内部视图。

提供用户可访问的网站。

由于 stf-app 会去 stf-auth 进行用户验证之后返回,所以 stf-app 必须和 stf-auth 处于相同 host 之下,此处实例使用 openstf.test.com,需要配置 nginx 代理。配置见后文。

在本地启动 nginx 容器:

注:如果 nginx 服务没生效,需要进入容器内手动启动 nginx : /etc/init.d/nginx start

五、provider 服务部署(linux端)

在 linux 端,需要安装 adbd 用于连接设备,之后启动 stf-provider 服务。

stf-provider 单元主要用于连接 adb,为每个 adb 连接设备开一个 worker 进程。用于发送和接受 stf-processor 的指令。

需要注意的是, stf-provider 需要管理特定范围的端口,这些端口用于内部服务和屏幕截图 WebSocket。所以要求设置 --net host 的。这也是为什么 stf-provider 机器要使用 linux 的原因。

  • 启动 adbd:

  • 启动 stf-provider

devside.stf.example.orgstf-triproxy-dev 地址, stf-provider 将自动与 stf-triproxy-dev 建立连接并交换数据。

至此,openstf 部署完成,通过 openstf.test.com 即可访问网站。
如果在本地部署,其他机器需要配置 hosts: 部署机器ip openstf.test.com

Original: https://www.cnblogs.com/shengs/p/13267921.html
Author: blogsheng
Title: [转载] 使用 Docker 部署 openstf 平台

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/534607/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球