upterm改造(一)-支持VSCode远程连接任意容器
Contents
我们的平台自从增加了dashboard功能, 从使用者们那边得到的反馈很多, 基本都是不稳定经常断线, 没法传文件这种问题. 说明大家用的很多, 并且希望它能成为稳定的服务. 所以不管从功能性, 还是稳定性的角度, 我都应该考虑下对它进行扩展和改进.
博客分为两部分, 前半部分介绍如何使用, 后半部分针对工作原理进行简单说明. 公网自建的uptermd
是个自用的小水管,
经不起大风大浪, 请大家合理使用. 我不是很想用爱发电, 有心用的同学可以捐点服务器费用.
现在的代码放在这里了:
https://github.com/corvofeng/upterm
upterm安装与使用
安装
1 | bash <(curl -sL http://corvo.myseu.cn/scripts/upterm.sh) |
使用
你可以直接将上面的uri贴到浏览器中启动:
或者新开一个命令行:
当VSCode左下角有了这个图标, 就表示远程连接已经成功了
打开项目
Open Folder可以打开仓库
全功能Terminal
它是一个全功能的SSH服务器, 放大之后当个Terminal来用也可以, 也支持分屏
自动的本地端口转发
当你在远程的Linux中启动了端口之后, VSCode能帮你自动转发到本地, 可以获得接近原生的开发体验
还有很多功能, 用户可以自己探索下. 例如, 拷贝文件, 安装插件, 只要是VSCode remote支持的功能, 它都可以用
原理及扩展
你可以粗浅的认为这个工具拥有openssh-server+frp的功能
upterm做了什么
左右是两台机器, 其中一台机器使用upterm开启了服务, 另一台可以直接连接其session.
upterm是与tmate类似的工具(tmate可能相对多知名一点), upterm做了几个工作:
- 在本地建立ssh server
- 连接uptermd, 获取一个session id, 并打印
- 当用户连接了对应的session, 就有了与本地ssh server交互的权力
有兴趣的读者可以参考upterm项目主页上面的流程图
Remote SSH功能
这是VSCode官方的图, 可以认为是前端的代码编辑器与后端的Sever分离
结合一下
upterm已经提供给我们ssh连接的功能, 为什么不能直接使用VSCode的remote ssh功能呢. 这个要从remote ssh的实现说起,
当我们使用VSCode远程开发时, 它是这样连接的远程服务器:
1 | ssh -T -D 1234 192.168.101.135 -p 2224 bash |
这个命令需要拆开来看:
ssh -T 192.168.101.135 -p 2224 bash
这个命令的含义是远程连接服务器后, 不启动tty, 直接启动bash.ssh -D 1234 xxxxx
表示本地建立一个socks5的转发服务, 具体使用可见OpenSSH系列(六)-正向代理与端口映射
所以只要我们的ssh服务器能够提供给VSCode这样的连接方式, 就可以了. 感谢Golang的库开发者, 让我有机会比较容易的建立一个ssh服务, 具体的代码我放在gist中了, 有兴趣的读者可以去看:
https://gist.github.com/corvofeng/45c01edd33fa750e31653a90b1c4cdec
建立ssh连接之后的通信的过程: remote机器会下载一个code-server执行文件, 然后启动, VSCode之后仅与服务器中的code-server通信.
瓶颈以及扩展
从目前使用的情况来看, 现有的工具确实有一些瓶颈, 比如:
- 每次到一个新的容器中, 都需要重新下载一个code-server并启动, 会占用带宽
- 每次到一个新的容器中, 用户的插件配置也需要重新下载, 使用体验上没那么好
- session id每次都会变, 可能会导致vscode保存的历史纪录太多了
- 目前vscode还不支持Alpine Linux, 手机端也要安装好完整的容器才可以使用
- 每个容器中的用户可能之后root, 所以多人合作使用一个容器的场景其实是有问题的
与Gitpod相比, 这个项目仅仅是能用, 还称不上好用:
- 用户的配置文件和插件的保存与下载, 至少要获得每个容器相对来讲一致的体验
- 企业级的功能和鉴权, 在企业内部使用的话, 还是希望能有一套基于OpenID或是Oauth的鉴权系统, 有了这个系统之后, session id就可以用它来进行替换
- 如果想要支持手机设备, 可能需要类似Gitpod一样有个网页版, 用户用起来会更加方便的
看到Gitpod两轮融了1600万美元, 真的还是有点心动. 现代安卓机器性能过剩很多, 如果我们能支持Android, 就是相当不错的一个产品.
其他相关内容
从我一开始将Dashboard引入到系统中, 我就有个目标是允许我们的用户通过本地的ssh或是VSCode连接远程. 因为我们的开发语言都是Python. 线上环境的Pod其实有一整套Python代码, 所以能够支持用户开发或者调试是很有必要的. 下面是我做过的一些尝试和调研.
如何定制与裁剪Dashboard
Gitpod使用与简单原理分析
tmate的服务的使用
VSCode remote在Android上运行记录
总结
有人可能会说有的用就不错了, 用户可能完全可以用ssh+frp实现VSCode remote ssh功能, 但是这样的学习成本有点太高了, 需要每次安装好多依赖, 很可能有需求也不会去这么用. 我主要想简化这个启动过程, 做到一条命令映射给VSCode可用的ssh server. 功能做出来之后其实通用性很强的,
我已经将原理简单介绍过了, 安全性的话就见仁见智了, 建议经常性的重连来强制刷新token.