轻量折腾计划3,在浏览器进行开发——搭建属于自己的开发全家桶(下篇)
系列往期文章:
前言
在上篇文章中,我们利用腾讯云轻量应用服务器搭建了codeserver在线IDE、gogs轻量GIT平台,在这篇文章中,我将继续为大家带来:
- 自建docker镜像仓库;
- 基于web的ssh管理平台;
- nps端口映射面板
以上三大功能都是在实际开发中所需要或者说能够用得上的服务,可能会对大家有所帮助。
正文
自建docker镜像仓库
说道docker镜像仓库,大家估计脑海里第一个想起的就是dockerhub了吧,虽说dockerhub是有私人镜像的功能,但是在我们的日常工作中,处于企业的数据安全考虑(同时可能也跟全球两个经济体的碰撞有关),基本上是不会上传到dockerhub中,这时候自建一个简单的镜像仓库,用于在一些复杂网络的环境进行部署还是非常有必要的。
可能看到这有的小伙伴会想到:Harbor,不可否认地说,Harbor的确是一款非常成熟的产品,有这完善的功能且美观的UI,可是关键在于他不够轻量!在上文中,我们搭建了两款好用的应用,总计占用才不到500MB内存,可这Harbor最低配置要求就要2核4G,显示是不够全部应用分的,所以在这里我将使用的是docker官方给出的一个提供给用户快速搭建私有镜像的这么一个镜像:https://hub.docker.com/_/registry。
跟之前一样的,我们新建一个目录作为存放镜像的目录:
mkdir /registry
创建完毕之后我们在创建一个容器应用的配置文件(/root/config.yml),内容如下:
version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
目的是为了能够在线删除镜像,默认的配置中是不支持此操作的。
接着运行命令:
docker run -d -p 5000:5000 -v /registry:/var/lib/registry -v /root/config.yml:/etc/docker/registry/config.yml --name registry registry:2
用docker起一个registry应用,并把/registry和/root/config.yml文件挂载上去,同时映射容器内的5000端口。
这时候打开我们的宝塔,新建一个网站(由于这里需要适用SSL证书,下列图片中的域名我会码掉一部分,当然不用也可以,但是得多一些步骤,如果不想上SSL的读者请自行搜索查询方法),给网站添加上SSL证书:
之后添加反向代理:
然后给git添加一个basic_auth(这里的账号密码就是我们后边docker login时候输入的账号密码):
接着点击配置文件:
复制红框中的路径:/www/server/panel/vhost/nginx/dir_auth/docker.xxxxx.com(自选替换)
去到此文件夹,打开唯一的conf文件:
复制框住的这两行:
auth_basic "Authorization";
auth_basic_user_file /www/server/pass/docker.xxxxxx.com/123.pass;
回到配置文件那,把include那行注释掉(反代和basic_auth的location有重合):
接着来到反向代理处,点击编辑:
添加如下这几行:
auth_basic "Authorization";
auth_basic_user_file /www/server/pass/docker.xxxx.com/123.pass; // 自行替换为你复制的那两行
add_header 'Docker-Distribution-Api-Version' 'registry/latest' always;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
添加后点击保存即可。此时已经配置完成,打开浏览器访问:https://docker.xxxxxx.com/v2/_catelog
,在弹窗输入账号密码,如下图所示即为部署成功:
在客户端尝试上传一个镜像试试,首先先登录到我们的私人镜像仓库:
docker login docker.xxxxxx.com
接着我们尝试传我们在上篇中使用的gogs/gogs镜像:
REPOSITORY TAG IMAGE ID CREATED SIZE
gogs/gogs latest 8ec7cc11f4a3 3 months ago 93.9MB
使用docker tag命令为镜像新增一个标签:
docker tag gogs/gogs:latest docker.xxxxxx.com/gogs/gogs:latest
接着上传镜像:
docker push docker.xxxxxx.com/gogs/gogs:latest
接着我们重新访问:https://docker.xxxxxx.com/v2/_catelog
可以看到已经成功上传上去了,存放镜像的本地目录也出现了对应的文件夹:
上传没啥问题,接着我们来试试拉取镜像,这里使用另一台服务器演示:
也没啥问题,最后就是删除镜像,首先获取要删除的镜像的sha256签名:
curl --user admin:admin -v --silent "docker.xxxxxx.com/v2/gogs/gogs/manifests/latest" 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'
然后就是拼接删除语句,发送删除请求:
curl -I --user admin:admin -X DELETE docker.xxxxxx.com/v2/gogs/gogs/manifests/sha256:3b0c0c685e16f2b8bdd0289e7eb8812a188b014919464f0c6f6ce5d77dac2ad9
此时只是把元数据删除掉了,具体的镜像文件并没有删除,若读者想删除腾些空间的话,还需要进入容器,执行垃圾回收命令:
docker exec -it registry sh
进入容器后执行:
registry garbage-collect /etc/docker/registry/config.yml
至此,关于私有镜像仓库的部署及使用基本明了~
基于web的ssh管理平台
接下来就是ssh管理工具了,有时候在外边手边没有趁手工具使的时候,这东西的作用就体现了出来,我们只需要打开浏览器,输入我们的平台的地址:ssh.test.com,就可以直接连接上对应服务器,效率这一块拿捏得死死的。
这里我们使用的是webssh这个python库,安装过程可谓是十分简单方便,不过这里我们还是为了方便管理,选择使用docker。
官方并没有提供docker版本或者命令,这里我根据安装命令简单写了个Dockerfile,接下来就是安装的过程:
首先我们新建一个Dockerfile文件:
vim Dockerfile
内容如下:
FROM python:3
RUN pip install webssh -i https://pypi.tuna.tsinghua.edu.cn/simple
CMD ["wssh"]
保存后执行命令构建镜像:
docker build --tag webssh .
等待一会儿构建完成后运行容器:
docker run -d -p 8082:8888 webssh
还是老规矩,进行反代。新建一个网站ssh.test.com,点击反向代理:
由于网站需要使用websocket,所以我们还需要编辑一下我们的配置文件:
加上框中的三行:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
点击保存后,打开浏览器访问我们的平台:
尝试连接一个服务器:
点击连接:
至此,我们的SSH管理平台也搭建好了。
nps端口映射面板
最后便是nps端口映射面板的搭建了,要说他的应用过程可谓是十分广泛的,就比如我本地有个服务想让其他朋友也能访问得到,但由于一般来说非云服务的带宽很少带有公网IP,都是基于NAT的网络情况,这时候我们便可以利用我们的云服务器来进行端口映射,将我们本地的端口转发到我们的开发全家桶服务器上,这样大家都可以通过开发全家桶服务器访问到我们本地无公网IP机子所转发的端口了。
对于我个人来说,我经常用于转发我本地Mysql的端口,用于项目调试,当然玩法还有很多,比如对于Kali系统来说,我们可以映射一个端口方便我们反弹Shell等操作,游戏用途的话可以局域网连接,用法因人而异。
项目地址:https://github.com/ehang-io/nps
下面是安装过程,首先是去官方git仓库拉取项目:
git clone https://github.com/ehang-io/nps.git
国内服务器拉取无速度可以使用一下镜像:
git clone https://github.com.cnpmjs.org/ehang-io/nps.git
拉取完成后输入:
cd nps
进入项目目录:
输入命令,拷贝并重命名一份Dockerfile文件:
cp Dockerfile.nps Dockerfile
编辑Dockerfile文件:
把第二行的:
ARG GOPROXY=direct
改为,防止国内机子因为网络问题无法构建镜像:
ARG GOPROXY=https://goproxy.cn,direct
接着跟上边的步骤差不多,构建镜像:
docker build --tag nps .
构建完成后,新建一个目录与一个配置文件:
mkdir /conf
vim /conf/nps.conf
填写内容如下(账号密码在#web处,线上部署请自行修改):
appname = nps
#Boot mode(dev|pro)
runmode = dev
#HTTP(S) proxy port, no startup if empty
http_proxy_ip=0.0.0.0
http_proxy_port=80
https_proxy_port=443
https_just_proxy=true
#default https certificate setting
https_default_cert_file=conf/server.pem
https_default_key_file=conf/server.key
##bridge
bridge_type=tcp
bridge_port=8024
bridge_ip=0.0.0.0
# Public password, which clients can use to connect to the server
# After the connection, the server will be able to open relevant ports and parse related domain names according to its own configuration file.
public_vkey=123
#Traffic data persistence interval(minute)
#Ignorance means no persistence
#flow_store_interval=1
# log level LevelEmergency->0 LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7
log_level=7
#log_path=nps.log
#Whether to restrict IP access, true or false or ignore
#ip_limit=true
#p2p
#p2p_ip=127.0.0.1
#p2p_port=6000
#web
web_host=a.o.com
web_username=admin
web_password=123
web_port = 8080
web_ip=0.0.0.0
web_base_url=
web_open_ssl=false
web_cert_file=conf/server.pem
web_key_file=conf/server.key
# if web under proxy use sub path. like http://host/nps need this.
#web_base_url=/nps
#Web API unauthenticated IP address(the len of auth_crypt_key must be 16)
#Remove comments if needed
#auth_key=test
auth_crypt_key =1234567812345678
#allow_ports=9001-9009,10001,11000-12000
#Web management multi-user login
allow_user_login=false
allow_user_register=false
allow_user_change_username=false
#extension
allow_flow_limit=false
allow_rate_limit=false
allow_tunnel_num_limit=false
allow_local_proxy=false
allow_connection_num_limit=false
allow_multi_ip=false
system_info_display=false
#cache
http_cache=false
http_cache_length=100
#get origin ip
http_add_origin_header=false
#pprof debug options
#pprof_ip=0.0.0.0
#pprof_port=9999
#client disconnect timeout
disconnect_timeout=60
配置项对应的含义:
名称 |
含义 |
---|---|
web_port |
web管理端口 |
web_password |
web界面管理密码 |
web_username |
web界面管理账号 |
web_base_url |
web管理主路径,用于将web管理置于代理子路径后面 |
bridge_port |
服务端客户端通信端口 |
https_proxy_port |
域名代理https代理监听端口 |
http_proxy_port |
域名代理http代理监听端口 |
auth_key |
web api密钥 |
bridge_type |
客户端与服务端连接方式kcp或tcp |
public_vkey |
客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 |
ip_limit |
是否限制ip访问,true或false或忽略 |
flow_store_interval |
服务端流量数据持久化间隔,单位分钟,忽略表示不持久化 |
log_level |
日志输出级别 |
auth_crypt_key |
获取服务端authKey时的aes加密密钥,16位 |
p2p_ip |
服务端Ip,使用p2p模式必填 |
p2p_port |
p2p模式开启的udp端口 |
pprof_ip |
debug pprof 服务端ip |
pprof_port |
debug pprof 端口 |
disconnect_timeout |
客户端连接超时,单位 5s,默认值 60,即 300s = 5mins |
然后在/conf目录继续新建三个空文件(无内容):
vim /conf/hosts.json
vim /conf/clients.json
vim /conf/hosts.json
运行容器:
docker run -d -p 10080:80 -p 10443:443 -p 18080:8080 -p 18024:8024 -v /conf:/conf --name nps nps
其中:
80与443端口为域名解析模式默认端口
8080为web管理访问端口
8024为网桥端口,用于客户端与服务器通信
最后还是老规矩,使用nginx进行反代:
反代后访问我们的网站:
至此,我们的nps面板已经搭建好了,具体使用方法由于篇幅所限就不过多赘述了,网上已经有很全面的使用教程,也可以参考官方文档:https://ehang-io.github.io/nps/
后话
至此,我们的开发全家桶已经部署好了,总共有:
- CodeServer在线IDE
- gogs私有GIT平台
- registry私有docker镜像仓库
- webssh在线SSH管理平台
- nps端口映射面板
现在,让我们来看看服务器的负载情况:
五个应用,总计不到1.2G内存的占用,1核2G的学生机都可以流畅搭建和使用,可谓是便宜又好用~
最后再让我介绍下这次使用的服务器平台:腾讯云轻量应用服务器。
在腾讯云的长期活动中新用户可¥74便可买到一台,1核2G内存60G SSD盘6Mbps的配置在性价比这块拿捏得死死得,感兴趣的读者可考虑入手:https://cloud.tencent.com/act/new。