前言
STF(Smartphone Test Farm)可以很方便的通过网页管理安卓设备,然而官方的部署文档实在是一言难尽,如果通过stf local
启动则无法很方便的反向代理(在https下不可用,在http下需通过docker并使容器内的端口和反向代理的端口为同一个,否则跳转auth登陆后跳不回去)。
如何解决
通过修改lib/cli/local/index.js,新增三个参数,可使得其行为和官方部署文档中一致,
- 添加三个参数(app-url、websocket-url、screen-ws-url-pattern)
// omitted
.option('app-url', {
describe: 'URL to the app unit.'
, type: 'string'
})
.option('websocket-url', {
describe: 'URL to the websocket unit.'
, type: 'string'
})
.option('screen-ws-url-pattern', {
describe: 'The URL pattern to use for the screen WebSocket.'
, type: 'string'
})
// omitted
- 加到对应的进程的参数里(auth单元添加appUrl,app单元添加websocketUrl ,provider单元添加screenWsUrlPattern)
// omitted
// auth
, procutil.fork(path.resolve(__dirname, '..'), [
util.format('auth-%s', argv.authType)
, '--port', argv.authPort
, '--secret', argv.authSecret
, '--app-url', argv.appUrl || util.format(
'http://%s:%d/'
, argv.publicIp
, argv.port
)
].concat(JSON.parse(argv.authOptions)))
// app
, procutil.fork(path.resolve(__dirname, '..'), [
'app'
, '--port', argv.appPort
, '--secret', argv.authSecret
, '--auth-url', argv.authUrl || util.format(
'http://%s:%d/auth/%s/'
, argv.publicIp
, argv.port
, {
oauth2: 'oauth'
, saml2: 'saml'
}[argv.authType] || argv.authType
)
, '--websocket-url', argv.websocketUrl || util.format(
'http://%s:%d/'
, argv.publicIp
, argv.websocketPort
)
].concat((function() {
var extra = []
if (argv.userProfileUrl) {
extra.push('--user-profile-url', argv.userProfileUrl)
}
return extra
})()))
// provider
, procutil.fork(path.resolve(__dirname, '..'), [
'provider'
, '--name', argv.provider
, '--min-port', argv.providerMinPort
, '--max-port', argv.providerMaxPort
, '--connect-sub', argv.bindDevPub
, '--connect-push', argv.bindDevPull
, '--group-timeout', argv.groupTimeout
, '--public-ip', argv.publicIp
, '--screen-ws-url-pattern', argv.screenWsUrlPattern || util.format(
'ws://%s:${publicPort}/'
, argv.publicIp
)
, '--storage-url'
, util.format('http://localhost:%d/', argv.port)
, '--adb-host', argv.adbHost
, '--adb-port', argv.adbPort
, '--vnc-initial-size', argv.vncInitialSize.join('x')
, '--mute-master', argv.muteMaster
]
.concat(argv.allowRemote ? ['--allow-remote'] : [])
.concat(argv.lockRotation ? ['--lock-rotation'] : [])
.concat(!argv.cleanup ? ['--no-cleanup'] : [])
.concat(!argv.screenReset ? ['--no-screen-reset'] : [])
.concat(argv.serial))
// omitted
- 在启动命令里添加参数
stf local --app-url https://stf.example.org/ \
--auth-url https://stf.example.org/auth/mock/ \
--websocket-url wss://stf.example.org/ \
--screen-ws-url-pattern "wss://stf.example.org/d/provider/<%= serial %>/<%= publicPort %>/"
stf.example.org
可替换为你需要的域名,如不使用https也可换为http
反向代理
我平时使用Caddy,这里就用Caddy的配置举例,可替换为Nginx
和官方部署文档类似,只不过stf local
自带了poorxy可以代理WebSocket单元和Provider单元的screen-ws以外的单元,所以只需要单独对上述两个单元处理
stf.example.org {
@screen-ws path_regexp screen-ws /d/provider/([^/]+)/([0-9]{4})
reverse_proxy @screen-ws 127.0.0.1:{re.screen-ws.2}
reverse_proxy /socket.io/ 127.0.0.1:7110
reverse_proxy 127.0.0.1:7100
}
碎碎念
为什么要设计的这么复杂……而且明明有auth-url的参数,为什么不加上这几个参数呢?这样可以很轻松的实现反向代理。或者说,加一个remote启动命令,加上这些参数,多好呀!