code-server的项目网址在cdr/code-server.
在code-server的README中, 提供了两份部署指南, 一份是用于部署在AWS等云服务的deploy, 另一份则是我们要用的用于部署在本地的quickstart.
Guide非常简洁明了, 就三步:
./code-server
).localhost:8080
来访问.对于确实是在本地用的人而言, 这就足够了, 但是考虑到要长期运行在服务器端并且需要远程访问, 需要做一些手脚:
先不说反代, 来把code-server的部分弄好.
要更改端口, 只需要在启动时加上参数, 比如--port 23333
.
它每次启动时默认会生成一个随机密码, 显示在终端中.
也可以自定义别的密码或者干脆不要, 不要的话直接加上参数--auth none
, 要密码的话则需要在环境中定义变量PASSWORD
, 并且是明文, 所以这个变量要做成尽可能局部的变量, 不仅是为了安全考虑, 而且不能不同的code-server用同一个密码吧…
反代服务器我用的是Nginx, 先安装: apt install nginx
. 之后需要修改位于/etc/nginx/nginx.conf
的配置文件.
所有的修改都位于http
模块下.
首先, 需要添加SSL设定:
http {
#前面的东西省略
ssl on
ssl_certificate /path/to/crt/chain.crt
ssl_certificate_key /path/to/key/key.key
#后面的也省略
}
SSL的protocols之类的设置都不用变.
然后, 在http模块的最后加上反代的配置(这个是可以在quickstart里面抄的):
http {
#前面的东西省略
#SSL的东西也省略
#中间可能还有东西, 继续省略
server {
listen 8080; #这个是客户端访问反代服务器时的端口
listen [::]:8080; #这个应该也是, 但是是IPv6的配置
server_name mycodeserver.com itscodeserver.com;
#填访问时用的域名, 可填多个, 空格分隔
location /path/ { #等会细讲 #1
proxy_pass http://localhost:23333/;
#这是反代访问code-server的地址,
#所以端口也是填code-server的端口
proxy_redirect http:// https://;
#把外部的https转成内部的http
proxy_set_header Host $host:443/path;
#等会细讲 #2
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Accept-Encoding gzip;
#最后三行不知道干嘛的, 从quickstart上直接抄下来的
}
#可能存在的第二个第三个location模块, 反正和上面那个差不多
}
}
等会现在细讲 #1: 这个path是反代挂载在整个Nginx上的位置, 也就是说, 当访问https://mycodeserver.com:443/path/
的时候, 就是在访问这个反代. (443是https的默认端口, 没有的话可以换成别的,并且这个端口和下面那个443是需要保持一致的)
等会现在细讲 #2: 这行的意思是把"Host"(主机)这个参数重新设定为"$path:443/path", 这样的目的是在code-server中出现URL的变化时, 会参照这个Host进行变化. 比如说, 在有密码的时候, 其URL会跳转到localhost:23333/login
, 相对地, 浏览器中的URL应该是https://mycodeserver.com:443/path/login
, 而不应该是https://mycodeserver.com:443/login
.
不难发现, 这几行配置主要做的事情可以看作是把http://localhost:23333/
全都换成了https://mycodeserver.com:443/path/
.
最后service nginx restart
以重启Nginx并重新配置.
PS: code-server打开文件夹是靠URL后的参数, 像这个样子:
https://mycodeserver.com:443/path/?folder=vscode-remote://mycodeserver.com:443/path2yourworkspace/
,
如果/path/
不是根目录(/
)的话, 就会有一些小错误.比如说, 我想打开的文件夹在
/home/user/workspace/
,
其参数理应是?folder=vscode-remote://mycodeserver.com:443/home/user/workspace/
,
但是反代会导致它会变成?folder=vscode-remote://mycodeserver.com:443/path/home/user/workspace/
,
可以看到多了一个/path
, 可以手动把它删掉, 并且保存在书签里, 直接点书签就好了. (实际上这个应该是Nginx的配置错误,
但是既然能用我也懒得去深究了)
反代配置完成之后, 就只需要把code-server也配置成service就好了(这个也是可以在quickstart里面抄的).
[Unit]
Description=Code Server NO.1
After=network.target
[Service]
Type=simple
User=username
EnvironmentFile=/home/username/.envfile
WorkingDirectory=/home/username/
Restart=on-failure
RestartSec=10
ExecStart=/path/to/code-server/code-server --port 23333
StandardOutput=file:/path/to/output/output.log
StandardError=file:/path/to/error/error.log
[Install]
WantedBy=multi-user.target
那个EnvironmentFile就是在运行这个程序前会source
的文件, 可以在里面写PASSWORD
变量, 也要在PATH
里面写上需要调用的程序(比如说clang)的路径, 文件名前面加点是为了隐藏文件, 实则没啥用处. 所以说, 这个文件大概应该长这样:
PASSWORD="yourpassword"
PATH="path"
PATH
要是不知道填啥就把/etc/environment
里面的直接拷过来就是了.
还有一个要注意的地方是, 所有出现的地址都需要填绝对地址, 不能填相对地址.
剩下的一些配置, 不是一眼就能看懂的(比如说Description), 可以自己试着改改看会有啥效果, 就是不知道它在说啥并且改了往往就会报错的玩意(比如After, Type, WantedBy). 有兴趣的话可以问搜索引擎.
最后, 把这个文件的后缀改成service
并丢到/etc/systemd/system/
下, 并执行systemctl restart name.service
, 记得把name
换成文件的名字.
如果没有任何报错, 就可以尝试用浏览器访问了, 还可以systemctl enable name.service
令其开机自启.
Q: 怎么下载二进制包到Linux机器上?
A: wget
, 或者curl -O
, 或者WinSCP.
Q: 怎么解压.tar.gz
文件?
A: tar -zxvf
.
Q: 文件不能拷到/etc/systemd/system/
?
Q: systemctl
不能执行?
Q: service
也不能执行?
Q: 修改/etc/nginx/nginx.conf
显示文件只读?
A: sudo
.
Q: systemctl restart name.service
执行后报错?
A: 好好看看报错里面写了啥, 一般不是文件没以service
作为后缀, 就是忘记把文件拷到/etc/systemd/system/
, 或者写了非绝对地址.
Q: service restart nginx
执行后报错?
A: 大概是/etc/nginx/nginx.conf
有语法错误, 自查一下很容易发现问题的. 可以参考nginx documentation, 或者Nginx中文文档.
Q: service
文件中Type
的意思?
A: simple
就是程序会一直在终端中运行的那种, 不Ctrl+C
没法用终端的. 还有一种比较常用的类型是oneshot
, 就是执行一次之后马上回到终端, 会自己注册在后台运行的, 比如vlmcsd.
Q: code-server登录时密码死活不对?
A: 可能是有字符被转义了, 比如冒号和反斜杠, 要么避免这些字符, 要么再转义回去.
Q: code-server链接跳转总是跳到404的地方?
A: 反代是不是哪里搞错了.
Q: code-server里打开文件夹后显示打不开文件夹?
A: 和反代没挂在根目录上是差不多的问题, 手动改一下URL里面folder
的地址就好了.
Q: folder
后面有一堆百分号, 看得眼花缭乱?
A: URL被转义了, 不难发现, %3A
是冒号, %2F
是斜杠, 其构成是百分号加上字符的ASCII或UTF-8的HEX形式, 对照一下就知道了.
Q: debug Golang的时候有各种错误?
A: 启动code-server时加上参数--security-opt seccomp=unconfined
, 用ms-vscode-go
进行调试, 具体请看Issue#725.
Q: 调试vscode插件的时候各种错误?
A: 这是Known Issues之一, 如下(至2020.2.11). 或者去README里面看.
Q: 有些插件搜不到/版本有点旧?
A: 它采用的是自己的Marketplace, 可以从Extensions for Visual Studio里面找到vscode的插件并下载, 传到服务器端再通过vsix安装.
Q: 在vscode的terminal里面缺了一堆指令?
A: 缺环境变量了吧, 尝试在启动code-server前运行source /etc/environment
或别的有PATH
的文件, 如果不是直接CLI启动(比如service)就考虑在配置文件里加环境变量.
Q: 内部的vscode无法OTA?
A: 可以考虑自己patch(README里面有教程), 或者就等等新的二进制包呗.
Q: Latex Workshop的预览pdf失效?
A: 在DevTools里面可以看到, 向一个五位数端口发送了一个http请求, 然后报错不允许http. 这个修起来比较复杂. 如果条件允许的话, 可以选择用vscode+Remote-SSH, 在服务器端vscode上装插件, 然后就可以看到预览了. BTW, 这个vscode和code-server是完全不冲突的, 甚至可以同时开着(vscode服务器端在本地的vscode关闭后就停止运行了), Git用的是同一个, 插件和设置是分开算的(工作区里面的设置当然还是一样的).
注: 所有的操作在Ubuntu Server 18.04下实测有效, 一些文件的位置和命令可能随环境的不同而失效.
觉得有用的话,不要吝惜评论点赞分享哦,希望大家多多包涵,有任何问题欢迎指正、讨论。
本文基于CC-BY-SA 4.0协议,欢迎转载
(博客看累了?去我的B站瞧一瞧?)