宇宙主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

欧基零壹微头条IP归属甄别会员请立即修改密码
查看: 3423|回复: 21

【教程】轻量折腾计划3,搭建属于自己的开发全家桶,下篇

[复制链接]
发表于 2021-8-21 14:13:01 | 显示全部楼层 |阅读模式
本帖最后由 nnt 于 2021-8-21 14:14 编辑

原文Markdown写的,更好的阅读体验请前往:https://cloud.tencent.com/developer/article/1865833

前言

在[上篇文章](https://blog.1234234.xyz/archives/22/)中,我们利用腾讯云轻量应用服务器搭建了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。

跟之前一样的,我们新建一个目录作为存放镜像的目录:

  1. shell
  2. mkdir /registry
复制代码


创建完毕之后我们在创建一个容器应用的配置文件(/root/config.yml),内容如下:

  1. yml
  2. version: 0.1
  3. log:
  4.   fields:
  5.     service: registry
  6. storage:
  7.   delete:
  8.     enabled: true
  9.   cache:
  10.     blobdescriptor: inmemory
  11.   filesystem:
  12.     rootdirectory: /var/lib/registry
  13. http:
  14.   addr: :5000
  15.   headers:
  16.     X-Content-Type-Options: [nosniff]
  17. health:
  18.   storagedriver:
  19.     enabled: true
  20.     interval: 10s
  21.     threshold: 3
复制代码


目的是为了能够在线删除镜像,默认的配置中是不支持此操作的。

接着运行命令:

  1. shell
  2. 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文件:



复制框住的这两行:


  1.     auth_basic "Authorization";
  2.     auth_basic_user_file /www/server/pass/docker.xxxxxx.com/123.pass;
复制代码


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



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



添加如下这几行:


  1.     auth_basic "Authorization";
  2.     auth_basic_user_file /www/server/pass/docker.xxxx.com/123.pass; // 自行替换为你复制的那两行
  3.     add_header 'Docker-Distribution-Api-Version' 'registry/latest' always;
  4.     proxy_set_header X-Forwarded-Proto $scheme;
  5.     proxy_read_timeout 900;
复制代码


添加后点击保存即可。此时已经配置完成,打开浏览器访问:`https://docker.xxxxxx.com/v2/_catelog`,在弹窗输入账号密码,如下图所示即为部署成功:



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


  1. docker login docker.xxxxxx.com
复制代码




接着我们尝试传我们在上篇中使用的gogs/gogs镜像:


  1. REPOSITORY                    TAG       IMAGE ID       CREATED        SIZE
  2. gogs/gogs                     latest    8ec7cc11f4a3   3 months ago   93.9MB
复制代码


使用docker tag命令为镜像新增一个标签:


  1. docker tag gogs/gogs:latest docker.xxxxxx.com/gogs/gogs:latest
复制代码


接着上传镜像:


  1. docker push docker.xxxxxx.com/gogs/gogs:latest
复制代码




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



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



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



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


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




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


  1. curl -I --user admin:admin -X DELETE docker.xxxxxx.com/v2/gogs/gogs/manifests/sha256:3b0c0c685e16f2b8bdd0289e7eb8812a188b014919464f0c6f6ce5d77dac2ad9
复制代码


此时只是把元数据删除掉了,具体的镜像文件并没有删除,若读者想删除腾些空间的话,还需要进入容器,执行垃圾回收命令:


  1. docker exec -it registry sh
复制代码


进入容器后执行:


  1. registry garbage-collect /etc/docker/registry/config.yml
复制代码


至此,关于私有镜像仓库的部署及使用基本明了~
 楼主| 发表于 2021-8-21 14:13:02 | 显示全部楼层
基于web的ssh管理平台

接下来就是ssh管理工具了,有时候在外边手边没有趁手工具使的时候,这东西的作用就体现了出来,我们只需要打开浏览器,输入我们的平台的地址:ssh.test.com,就可以直接连接上对应服务器,效率这一块拿捏得死死的。

这里我们使用的是webssh这个python库,安装过程可谓是十分简单方便,不过这里我们还是为了方便管理,选择使用docker。

官方并没有提供docker版本或者命令,这里我根据安装命令简单写了个Dockerfile,接下来就是安装的过程:

首先我们新建一个Dockerfile文件:


  1. vim Dockerfile
复制代码


内容如下:


  1. FROM python:3

  2. RUN pip install webssh -i https://pypi.tuna.tsinghua.edu.cn/simple

  3. CMD ["wssh"]
复制代码


保存后执行命令构建镜像:


  1. docker build --tag webssh .
复制代码


等待一会儿构建完成后运行容器:


  1. docker run -d -p 8082:8888 webssh
复制代码




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



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



加上框中的三行:


  1.     proxy_http_version 1.1;
  2.     proxy_set_header Upgrade $http_upgrade;
  3.     proxy_set_header Connection upgrade;
复制代码


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



尝试连接一个服务器:



点击连接:



至此,我们的SSH管理平台也搭建好了。
 楼主| 发表于 2021-8-21 14:13:03 | 显示全部楼层
nps端口映射面板

最后便是nps端口映射面板的搭建了,要说他的应用过程可谓是十分广泛的,就比如我本地有个服务想让其他朋友也能访问得到,但由于一般来说非云服务的带宽很少带有公网IP,都是基于NAT的网络情况,这时候我们便可以利用我们的云服务器来进行端口映射,将我们本地的端口转发到我们的开发全家桶服务器上,这样大家都可以通过开发全家桶服务器访问到我们本地无公网IP机子所转发的端口了。

对于我个人来说,我经常用于转发我本地Mysql的端口,用于项目调试,当然玩法还有很多,比如对于Kali系统来说,我们可以映射一个端口方便我们反弹Shell等操作,游戏用途的话可以局域网连接,用法因人而异。

项目地址:https://github.com/ehang-io/nps

下面是安装过程,首先是去官方git仓库拉取项目:


  1. git clone https://github.com/ehang-io/nps.git
复制代码


国内服务器拉取无速度可以使用一下镜像:


  1. git clone https://github.com.cnpmjs.org/ehang-io/nps.git
复制代码


拉取完成后输入:


  1. cd nps
复制代码


进入项目目录:



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


  1. cp Dockerfile.nps Dockerfile
复制代码


编辑Dockerfile文件:

把第二行的:


  1. ARG GOPROXY=direct
复制代码


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


  1. ARG GOPROXY=https://goproxy.cn,direct
复制代码


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


  1. docker build --tag nps .
复制代码




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


  1. mkdir /conf
  2. vim /conf/nps.conf
复制代码


填写内容如下(账号密码在#web处,线上部署请自行修改):


  1. appname = nps
  2. #Boot mode(dev|pro)
  3. runmode = dev

  4. #HTTP(S) proxy port, no startup if empty
  5. http_proxy_ip=0.0.0.0
  6. http_proxy_port=80
  7. https_proxy_port=443
  8. https_just_proxy=true
  9. #default https certificate setting
  10. https_default_cert_file=conf/server.pem
  11. https_default_key_file=conf/server.key

  12. ##bridge
  13. bridge_type=tcp
  14. bridge_port=8024
  15. bridge_ip=0.0.0.0

  16. # Public password, which clients can use to connect to the server
  17. # After the connection, the server will be able to open relevant ports and parse related domain names according to its own configuration file.
  18. public_vkey=123

  19. #Traffic data persistence interval(minute)
  20. #Ignorance means no persistence
  21. #flow_store_interval=1

  22. # log level LevelEmergency->0  LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7
  23. log_level=7
  24. #log_path=nps.log

  25. #Whether to restrict IP access, true or false or ignore
  26. #ip_limit=true

  27. #p2p
  28. #p2p_ip=127.0.0.1
  29. #p2p_port=6000

  30. #web
  31. web_host=a.o.com
  32. web_username=admin
  33. web_password=123
  34. web_port = 8080
  35. web_ip=0.0.0.0
  36. web_base_url=
  37. web_open_ssl=false
  38. web_cert_file=conf/server.pem
  39. web_key_file=conf/server.key
  40. # if web under proxy use sub path. like http://host/nps need this.
  41. #web_base_url=/nps

  42. #Web API unauthenticated IP address(the len of auth_crypt_key must be 16)
  43. #Remove comments if needed
  44. #auth_key=test
  45. auth_crypt_key =1234567812345678

  46. #allow_ports=9001-9009,10001,11000-12000

  47. #Web management multi-user login
  48. allow_user_login=false
  49. allow_user_register=false
  50. allow_user_change_username=false


  51. #extension
  52. allow_flow_limit=false
  53. allow_rate_limit=false
  54. allow_tunnel_num_limit=false
  55. allow_local_proxy=false
  56. allow_connection_num_limit=false
  57. allow_multi_ip=false
  58. system_info_display=false

  59. #cache
  60. http_cache=false
  61. http_cache_length=100

  62. #get origin ip
  63. http_add_origin_header=false

  64. #pprof debug options
  65. #pprof_ip=0.0.0.0
  66. #pprof_port=9999

  67. #client disconnect timeout
  68. 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目录继续新建三个空文件(无内容):


  1. vim /conf/hosts.json
  2. vim /conf/clients.json
  3. vim /conf/hosts.json
复制代码


运行容器:


  1. 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/#/example

后话

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

  • 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。


发表于 2021-8-21 14:21:31 来自手机 | 显示全部楼层
战略性mark
 楼主| 发表于 2021-8-21 14:21:37 | 显示全部楼层
下篇都莫得人看了吗
发表于 2021-8-21 14:34:52 | 显示全部楼层
技术文,当然要顶一下


感谢分享,日后再看


发表于 2021-8-21 14:43:55 | 显示全部楼层
感谢分享,日后再看



/**
* 你们是不是健忘?
* 别不承认,我就问你们一个问题。
* 你原本是来浏览器干嘛的?
* 如果你想起来了,就去做你该做的事情,别在这里迷失了自己的方向。
* ——浏览器引路人
*
* Link https://greasyfork.org/zh-CN/scripts/396933-hostloc-zsbd
*/
 楼主| 发表于 2021-8-21 15:08:36 | 显示全部楼层
6fyC8r 发表于 2021-8-21 14:34
技术文,当然要顶一下


感谢顶贴
发表于 2021-8-21 15:26:16 来自手机 | 显示全部楼层
很棒,楼主辛苦了,帮顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宇宙主机交流论坛

GMT+8, 2024-10-31 07:30 , Processed in 0.070202 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表