轻量折腾计划三:在浏览器进行开发——搭建属于自己的开发全家桶(下篇)

利用腾讯云轻量应用服务器搭建了codeserver在线IDE、gogs轻量GIT平台,在这篇文章中,我将继续为大家带来全家桶的其他应用~

前言

上篇文章中,我们利用腾讯云轻量应用服务器搭建了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证书:

image-20210820010657998

之后添加反向代理:

image-20210820010732545

然后给git添加一个basic_auth(这里的账号密码就是我们后边docker login时候输入的账号密码):

image-20210820010838148

接着点击配置文件:

image-20210820011011315

复制红框中的路径:/www/server/panel/vhost/nginx/dir_auth/docker.xxxxx.com(自选替换)

去到此文件夹,打开唯一的conf文件:

image-20210820011128883

复制框住的这两行:

    auth_basic "Authorization";
    auth_basic_user_file /www/server/pass/docker.xxxxxx.com/123.pass;

回到配置文件那,把include那行注释掉(反代和basic_auth的location有重合):

image-20210820011257961

接着来到反向代理处,点击编辑:

image-20210820011550254

添加如下这几行:

    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,在弹窗输入账号密码,如下图所示即为部署成功:

QQ截图20210820010058

在客户端尝试上传一个镜像试试,首先先登录到我们的私人镜像仓库:

docker login docker.xxxxxx.com

image-20210820012116421

接着我们尝试传我们在上篇中使用的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

QQ截图20210820010047

接着我们重新访问:https://docker.xxxxxx.com/v2/_catelog

QQ截图20210820010122

可以看到已经成功上传上去了,存放镜像的本地目录也出现了对应的文件夹:

image-20210820012546988

上传没啥问题,接着我们来试试拉取镜像,这里使用另一台服务器演示:

QQ截图20210820010326

也没啥问题,最后就是删除镜像,首先获取要删除的镜像的sha256签名:

curl --user admin:admin -v --silent "docker.xxxxxx.com/v2/gogs/gogs/manifests/latest" 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'

image-20210820013649799

然后就是拼接删除语句,发送删除请求:

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

image-20210820225322980

还是老规矩,进行反代。新建一个网站ssh.test.com,点击反向代理:

image-20210820225424023

由于网站需要使用websocket,所以我们还需要编辑一下我们的配置文件:

image-20210820225650327

加上框中的三行:

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;

点击保存后,打开浏览器访问我们的平台:

image-20210820225706083

尝试连接一个服务器:

image-20210820225835255

点击连接:

image-20210820225915671

至此,我们的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

进入项目目录:

image-20210820231112791

输入命令,拷贝并重命名一份Dockerfile文件:

cp Dockerfile.nps Dockerfile

编辑Dockerfile文件:

把第二行的:

ARG GOPROXY=direct

改为,防止国内机子因为网络问题无法构建镜像:

ARG GOPROXY=https://goproxy.cn,direct

接着跟上边的步骤差不多,构建镜像:

docker build --tag nps .

image-20210820232651987

构建完成后,新建一个目录与一个配置文件:

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为网桥端口,用于客户端与服务器通信

image-20210820234914876

最后还是老规矩,使用nginx进行反代:

image-20210820235039555

反代后访问我们的网站:

image-20210820235053238

至此,我们的nps面板已经搭建好了,具体使用方法由于篇幅所限就不过多赘述了,网上已经有很全面的使用教程,也可以参考官方文档:https://ehang-io.github.io/nps/#/example

后话

至此,我们的开发全家桶已经部署好了,总共有:

  • CodeServer在线IDE
  • gogs私有GIT平台
  • registry私有docker镜像仓库
  • webssh在线SSH管理平台
  • nps端口映射面板

现在,让我们来看看服务器的负载情况:

image-20210820235415168

五个应用,总计不到1.2G内存的占用,1核2G的学生机都可以流畅搭建和使用,可谓是便宜又好用~

最后再让我介绍下这次使用的服务器平台:腾讯云轻量应用服务器。

在腾讯云的长期活动中新用户可¥74便可买到一台,1核2G内存60G SSD盘6Mbps的配置在性价比这块拿捏得死死得,感兴趣的读者可考虑入手:https://cloud.tencent.com/act/new

image-20210820235722791

本文来自开发者投稿,不代表腾讯云立场,转载请注明出处:https://computeinit.com/archives/4722

发表评论

登录后才能评论
交流群