my blog my blog

Tag: Docker
一个openai的ChatGPT反向代理实现

在奶牛看来,用api的同时保护自己不被暴露的安全性是最重要的。ChatGPT最近老火了,虽然奶牛还没用上4.0,一直在排队,但是也写点儿东西来弥补一下这个曾经没什么作品的遗憾吧。一直以来都没有发不过什么作品,这次写了个docker来实现这个反代。以OpenResty,通过lua来做安全验证防护,通过Nginx的proxy来反代。

使用方法:

docker pull nenew/openai-api
docker run -itd --name api-server -p 127.0.0.1:811:80 nenew/openai-api

你的openai反代地址: http://127.0.0.1:811
通过绑定到本地端口,可以阻止服务器被公众访问。
如果想让你的api反代服务器被公开,你也可以通过-e选项来绑定一个可以访问的IP或者设置一个密码来保证只有自己可以使用。

docker run -itd --name api-server -p 811:80 -e BIND_IP="123.123.123.123" nenew/openai-api
docker run -itd --name api-server -p 811:80 -e SECRET="Your secret" nenew/openai-api

注意:如果你设置了SECRET环境变量,你还需要设置你的app的请求头,增加X-Secret来完成验证:

X-Secret:Your secret

 测试:

访问 http://127.0.0.1/status 你可以看到你的请求头、请求体、设置的IP、设置的密码以及响应头的具体信息.
你也可以设置你的app的api到这个页面来进行测试或者使用Nginx的proxy_pass来设置转发。

proxy_pass http://1277.0.0.1/status

为什么你的反代不安全

其实写这个docker的原因很简单,看到很多不安全因素存在在你们的自建api里面。
首先你们没有去掉或者掩盖[“X-Real-IP”]和[“X-Forwarded-For”]。
反向代理的作用是保护目标服务器,但是我们其实想通过反代保护我们自己来保障我们的app可以正常的访问,所以完全没有必要把我们的X-Real-IP和X-Forwarded-For给目标服务器。我们建立反代其实目的是建立一个正向代理。这两个参数明显会暴露我们自己的真实IP,造成api的key多人使用的问题。
其次,很多人自建的api谁都可以用,比如像那些利用serverless实现的反代,你的访问IP地址每次都可能变化,那样子你的api key很可能就被判定为滥用【remote_addr一直是变化的】。我这个docker可以通过设置绑定IP和SECRET来阻止外界访问。
我认为最安全的方案应该是:
把这个docker放在你的独立服务器或者VPS上,你可以设置你的web app也在同一台服务器上,当然你也可以设置你的app来通过加密或者绑定IP的方式来达到隐藏自己的目的。

Ubuntu下安装Docker构建镜像教程

奶牛就做简单的记录了。在Ubuntu下使用

apt  install docker.io

这样子就完成安装了。然后我们需要登录https://hub.docker.com/settings/security设置Access Tokens

docker login -u nenew

输入生成的Tokens就可以登录了。之后我们通过Dockerfile构建镜像。

docker build -t nenew/python_run:v1.0 .
docker push nenew/python_run:v1.0
docker pull nenew/python_run:v1.0

这样子构建,推送,取回就都可以完成了。

黑群辉Docker折腾记

 

同事年前入了一个群晖NAS,前两天看H大大也入了群晖,好吧,奶牛就黑一个吧,淘宝买了一个黑群晖机,2*4T西数红盘,开始折腾。

黑群晖是要有引导U盘来带着启动的,机器自带,无非就是改改vid pid什么的小操作,不讨论,装系统也不讨论。奶牛想讨论下Docker,对Docker!

系统软件版本:DSM 5.2-5592

NAS> docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): a263667
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): a263667
OS/Arch (server): linux/amd64
NAS> cat /proc/version
Linux version 3.10.35 (root@builder) (gcc version 4.7.3 20130102 (prerelease) (crosstool-NG 1.18.0) ) #1 SMP Mon Aug 3 15:44:49 UTC 2015

群晖就是个linux系统,所以回归老本行。奶牛也是这周才接触Docker的,这个虚拟机很给力,奶牛欣喜之极,因为比起VM啊KVM之类的虚拟机,这个简直就是资源压缩机,因为共用系统的内核,所以,一个ubuntu的bash才耗费几M的系统资源,而且只要有个镜像,自己创建一个容器,可以算是无所不能了吧。对于网上有的那些迅雷远程下载xware啊,迅雷快鸟加速啊,还有那些bt下载奶牛不想讨论,没什么意思,因为有一个虚拟机系统了,你可以完成linux下的所有操作了。

先说说这个版本Docker的一个bug,就是在pull官方源的时候有的源没法在网页版中pull,提示命令执行错误。奶牛在6.X版本中测试发现没有此问题。不过,这都是小事儿不是?

开启NAS的ssh,直接命令行上去,默认的用户名和密码就是你设置的用户名和密码,而我们需要的是root,root密码其实也是你用户设置的那个密码。。。。汗。用root登录,可以直接用linux命令来操作docker。奶牛现在跑着kcptun来不间断代理ss,效果不错。再实现什么功能呢?还没想好,现在是只做了ddns到自有域名然后设置好了kcptun的客户端。这个Docker真的是太强大了,强烈推荐。