STF STF 正式环境 docker 化集群部署

heygrl · 2018年04月08日 · 最后由 在路上 回复于 2019年01月21日 · 998 次阅读

在本地开发 STF,需依次安装 Node.js,ADB ,RethinkDB,GraphicsMagick,ZeroMQ ,Protocol Buffers,yasm, pkg-config 环境,如果部署到生产环境,每增加一台机器节点,都安装这些环境,那将是一个非常痛苦的过程。STF 官方也推荐使用 docker 来搭建 STF 环境,服务器只需要安装 docker,然后依次拉取以下镜像:
docker pull openstf/stf:latest
docker pull sorccu/adb:latest
docker pull rethinkdb:latest
docker pull openstf/ambassador:latest
docker pull nginx:latest
openstf/stf 是 stf 的主镜像,sorccu/adb 是 adb 工具,如果本地服务器已经有 adb 环境,可以不要此镜像,rethinkdb 是 stf 数据库镜像,openstf/ambassador 为网络代理工具,nginx 是一个 web 服务器反向代理工具, stf 依赖它将不同的 url 转发到不同模块上,没有 nginx,生产环境中的 stf 是肯定不能正常工作的。拉取这些镜像以后,stf 就可以直接在容器中运行了,不需要再安装 stf 的相关工具,openstf/stf 镜像已经包含了所依赖的环境。
如果基于 stf 做了二次定制,要在服务器上进行 docker 部署,可不是一个 stf local 命令就开始使用了,需要以下步骤:
1.发布镜像
openstf/stf 是 STF 官方 push 到 docker 官方仓库的镜像,如果进行了二次开发,理论上只需要替换该镜像即可。制作镜像首先需要 DockerFile,在源码的根目录下,已经提供了现成的 DockerFile,直接基于该 File 制作镜像,在 DockerFile 目录下,执行
sudo docker build -t dystf/stf:latest .
其中 dystf/stf 为镜像名称,latest 为镜像版本。网速好的情况下,10 分钟内可以制作好,网速不好的情况下,半个小时以上甚至失败都是有可能的,这个时候需要不断地重试,执行完后,执行 sudo doker images 可查看刚制作好的镜像:

如果新发布的镜像有问题,可以快速恢复到上个版本。每次修改代码以后,基于主服务器重新制定新的镜像,可将该镜像保存,然后可以分发到其他服务器上,其他服务器不需要再重新制定,方便快捷,sudo docker save 镜像 ID> dystf_image.tar

2.集群化部署
如果只有 10-15 个设备的数据量,只需要一台服务器节点,直接启动 stf local 命令就可以了。当然实际生产环境中,绝对提供不止十几台的数量,有可能达到上百台,上百台的话,至少需要 10 台服务器节点,一台服务器节点一般 10 台手机。所以只有通过集群部署来解决该问题,而且能够达到快速扩展新节点目的。
STF 包含多个独立运行的进程,这些进程之间通过 ZeroMQ 和 Protocol Buffers 通信,每个进程节点叫做 “unit”,这些单元可以分别部署到不同的服务器上,通过 nigix 配置来转发,详情可以看官方文档介绍。在我们的远程真机部署环境中,选了一台性能较好的服务器作为主节点,该服务器不连任何设备,provider 节点作为设备的提供 agent,它将设备上报给主服务器,并展示,如图:

主服务器节点部署以下单元模块:
rethinkdb.service
nginx.service
stf-app@.service
stf-auth@.service
stf-migrate.service
stf-processor@.service
stf-reaper.service
stf-storage-plugin-apk@.service
stf-storage-plugin-image@.service
stf-storage-temp@.service
stf-triproxy-app.service
stf-triproxy-dev.service
stf-websocket@.service
stf-api@.service

provider 服务器节点部署以下单元模块:
adbd.service/adb 环境
stf-provider@.service
stf-provider 的作用就是给主框架提供手机,provider 可以运行在同一台机器,也可以运行在其他机器,但是,这台机器一定要可直接访问的,因为手机屏幕其实就是从这里出来的。在 provider 机器上一定要先由 adb 的环境,毕竟安卓手机要依赖 adb 调试。

3.发布运行
主节点的启动运行:
基于第一步已经制作好的镜像,可执行以下 shell 命令进行容器的启动,$1 参数为镜像名字和版本,如:dystf/stf:3.0, $2 参数为主服务器 ip
# 停止所有正在运行的容器
sudo docker stop $(sudo docker ps -a -q)
sleep 3
# 删除所有的容器
sudo docker rm -v $(sudo docker ps -a -q)
sleep 3
# 启动 nignx 容器
sudo docker run -d --name nginx --net host -v /home/mtp/stf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro nginx:latest nginx
sleep 3
# 启动 rethinkdb
sudo docker run -d --name rethinkdb -v /srv/rethinkdb:/data --net host rethinkdb:2.3 rethinkdb --bind all --cache-size 8192 --http-port 8090 --no-update-check
sleep 3
# 启动 stf-migrate 初始化数据库表
sudo docker run -d --name stf-migrate $1 stf migrate
sleep 3
#start stf-app
sudo docker run -d --name stf-app --net host -e "SECRET=YOUR_SESSION_SECRET_HERE" $1 stf app --port 3100 --auth-url http://$2/auth/mock/ --websocket-url ws://$2/
sleep 3
#start stf-auth
sudo docker run -d --name stf-auth --net host -e "SECRET=YOUR_SESSION_SECRET_HERE" $1 stf auth-mock --port 3200 --app-url http://$2/
sleep 3
#start websocket
sudo docker run -d --name websocket --net host -e "SECRET=YOUR_SESSION_SECRET_HERE" $1 stf websocket --port 3600 --storage-url http://$2/ --connect-sub tcp://$2:7150 --connect-push tcp://$2:7170
sleep 3
#start stf-api
sudo docker run -d --name stf-api --net host -e "SECRET=YOUR_SESSION_SECRET_HERE" $1 stf api --port 3700 --connect-sub tcp://$2:7150 --connect-push tcp://$2:7170
sleep 3
#start storage-apk
sudo docker run -d --name storage-apk --net host $1 stf storage-plugin-apk --port 3300 --storage-url http://$2/
sleep 3
#start storage-images
sudo docker run -d --name storage-image --net host $1 stf storage-plugin-image --port 3400 --storage-url http://$2/
sleep 3
#start storage-temp
sudo docker run -d --name storage-temp --net host -v /mnt/storage:/data $1 stf storage-temp --port 3500 --save-dir /data
sleep 3
#start triproxy-app
sudo docker run -d --name triproxy-app --net host $1 stf triproxy app --bind-pub "tcp://:7150" --bind-dealer "tcp://:7160" --bind-pull "tcp://:7170"
sleep 3
#start stf-processer
sudo docker run -d --name stf-processer --net host $1 stf processor stf-processer --connect-app-dealer tcp://$2:7160 --connect-dev-dealer tcp://$2:7260
sleep 3
#start triproxy-dev
sudo docker run -d --name triproxy-dev --net host $1 stf triproxy dev --bind-pub "tcp://
:7250" --bind-dealer "tcp://:7260" --bind-pull "tcp://:7270"
sleep 3
#start stf-reaper
sudo docker run -d --name stf-reaper --net host $1 stf reaper dev --connect-push tcp://$2:7270 --connect-sub tcp://$2:7150 --heartbeat-timeout 30000
启动完成后可通过 sudo docker ps -a 查看正在运行的容器:

provider 节点的运行:
以镜像 dystf/stf:latest,主节点 10.118.97.X,provider 节点 10.118.97.Y 为例子,该服务器节点已安装 adb 环境,所以不需要启动 adbd.service 容器:
sudo docker run -d --name provider-34 --net host dystf/stf:latest stf provider --name "provider-34" --connect-sub tcp://10.118.97.X:7250 --connect-push tcp://10.118.97.X:7270 --storage-url http://10.118.97.X --public-ip 10.118.97.Y --min-port=15000 --max-port=25000 --heartbeat-interval 20000 --screen-ws-url-pattern "ws://10.118.97.X/d/agentX/<%= serial %>/<%= publicPort %>/"
通过 sudo docker ps -a 查看结果:

4.添加新 provider 节点
添加新的设备,需要增加新的服务器节点,新的节点只需几分钟便可接入完成:
第一步:安装 docker 环境,adb 环境。
第二部:导入镜像,在上面第一步中,将主服务器已经发布好的镜像 dystf_image.tar scp 到该服务器上,然后导入该镜像:
sudo docker load < /Users/mtp/dystf_image.tar
刚导入的镜像没有名字和版本,需要对其打标,dystf/stf:latest 为打标的名字和版本
sudo docker tag $(sudo docker images --filter "dangling=true" -q) dystf/stf:latest
第三部:启动 stf-provider,如上命令。
第四部:配置 nginx
在主服务器的 nginx.conf 文件下,添加刚启动的 provider 节点配置,添加:
location ~ "/d/新节点启动名称,如上例的 agentX/([/]+)/(?[0-9]{5})/$" {
proxy_pass http://新节点 IP2:$port/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
}
配置完成后,重启 ngnix,新节点所连接的设备即可上报给主服务器。

共收到 8 条回复 时间 点赞

内容不错,写得挺详细的。如果能用 markdown 排下版就更好了。

另外,我目前配置的时候新增 provider 节点不需要改 nginx 的,provider 不直接对外暴露。想问下你这里需要配置 nginx 的原因是?

陈恒捷 回复

试了一下,去掉配置,设备虽然也在线,但是看不到页面,provider 节点需要将他所连接的设备页面上报给主服务器展示,官方文档里面有这样的配置:

请问 dystf/stf 是自己制作的镜像吗?

witslan 回复

是的

搭建完之后,打开 stf 主页没有显示?是什么情况 localhost:3200/auth/mock/

@heygrl 好像是我的 nginx 没有起来,sudo systemctl status nginx 显示:Loaded-found(Reason: No such file or directory) /r Active: inactive (dead)

ovwane 使用 Docker Compose 部署 OpenSTF 中提及了此贴 12月11日 20:23

Hi!参考了您的文章,使用 Docker Compose 重新整理了一下,谢谢!https://testerhome.com/topics/17233

请教一下,添加 provider 后,并没有显示出设备来,但是 provider 的设备 adb devices 都显示了
请问这种问题,如何排查呢?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册