DDNS环境下的copilot-gtp4私有化部署指南

国内使用ChatGPT主要面临两个问题,一个是支付,一个是网络。但是国内使用GitHub Copilot是畅通无阻的,对于个人开发者来说,每个月只需要$10。但是Copilot毕竟是编程语言的场景。有没有一种方式能够通过Copilot使用自然语言进行交互呢?答案不仅是可以,而且底层就是ChatGPT. 而这种方式就是copilot-gpt4-service.

项目本身非常有意思,自带的说明写得挺详细。自己尝试安装了一下,针对自己的使用场景有些问题做了简单的记录。

安装copilot-gpt4-service

推荐使用docker:

docker run -d \
--name copilot-gpt4-service \
--restart always \
-p 9010:8080 \
-e HOST=0.0.0.0 \
aaamoon/copilot-gpt4-service:latest

如果对golang很熟悉,也可以从源码安装。需要自己指定配置文件.configenv,参考格式:

HOST=0.0.0.0 # 服务监听地址,默认为 0.0.0.0。
PORT=8080 # 服务监听端口,默认为 8080。
CACHE=true # 是否启用持久化,默认为 true。
CACHE_PATH=db/cache.sqlite3 # 持久化缓存的路径(仅当 CACHE=true 时有效),默认为 db/cache.sqlite3。
DEBUG=false # 是否启用调试模式,启用后会输出更多日志,默认为 false。
LOGGING=true # 是否启用日志,默认为 true。
LOG_LEVEL=info # 日志级别,可选值:panic、fatal、error、warn、info、debug、trace(注意:仅当 LOGGING=true 时有效),默认为 info。
COPILOT_TOKEN=ghp_xxxxxxx # 默认的 GitHub Copilot Token,如果设置此项,则请求时携带的 Token 将被忽略。默认为空。
SUPER_TOKEN=randomtoken,randomtoken2 # Super Token 是用户自定义的 Token,用于对请求进行鉴权,若鉴权成功则会使用上方的 COPILOT_TOKEN 处理请求。多个 Token 以英文逗号分隔。默认为空。设置该项可以帮助用户在不泄漏 COPILOT_TOKEN 的情况下分享服务给他人使用。
ENABLE_SUPER_TOKEN=false # 是否启用 Super Token 鉴权,默认为 false。如果未启用但 COPILOT_TOKEN 不为空,则所有请求都会在不鉴权的情况下使用 COPILOT_TOKEN 处理。
CORS_PROXY_NEXTCHAT=false # 启用后,可以通过路由 /cors-proxy-nextchat/ 上为 NextChat 提供代理服务。配置 NextChat 云同步时,如本地部署方式则设置代理地址为:http://localhost:8080/cors-proxy-nextchat/
RATE_LIMIT=0 # 每分钟允许的请求数,如果为 0 则没有限制,默认为 0。

安装客户端 – OpenCat

我自己比较喜欢在手机上用OpenCat, 这里需要注意的是需要从美区下载的版本才能设置OpenAI,国区不支持。另外,当前(2024-01-31)似乎支持订阅制使用高级功能了,以前是可以一次性买断,略微遗憾。不过还是推荐这个APP,即使是免费版,功能也够用,APP的交互和审美设计都很过关,且没有乱七八糟的广告,还要什么自行车。

需要注意的是在APP里面设置OpenAI地址需要使用https协议。从安全和隐私角度,这个要求非常合理。作为一个gopher,自然是是通过Caddy来解决。只不过因为我的把copilot-gpt4-service部署在家里的内网服务器,因此有一层DDNS。

使用caddy解决https问题

因为有DDNS,我自己的域名托管商是DNSPod,因此需要下载下载带有特定DNS Provider的版本,也可以使用xcaddy工具自己编译:

xcaddy build --with github.com/caddy-dns/REPOSITORY

然后一切就绪以后提供一个参考的Caddyfile配置:

{
email YOUR_EMAIL
}

YOUR_DOMAIN:PORT {
reverse_proxy localhost:9010
tls {
dns dnspod ID,KEY
}
}

Have fun!

相关资料

2023年终总结

有史以来第一次节前的最后一天在家休假,虽然也被迫被工作占用了大部分时间。不过,怀着让自己放空的请假初衷,今年的年终总结就搞一个slim版本。

工作依然占据了当前自己的大部分时间。今年互联网环境继承了去年的衣钵,有增不减。自己也迎来了所谓的一个年龄转折点。你要说前后有什么区别嘛,那自然是没有的。更多的时候自己计划的一些人生第二曲线的事情在推动和践行着。这个后面会提到。今年想感谢一下自己的心态,很舒畅,也感谢自己一直坚持的职业专业性——这倒不仅是正好遇上了一些事情让这种专业性得到了了均值回归的补偿,也依赖于前面的心态。遗憾依然有的,主要两个,简单来说就是“与人”、“谋事”。本身也在路上,这里更多是提醒自己,奔赴往往是双向的,角度可以多尝试;计划和被计划并不影响做事本身,但是决定了最初出发的方向。

生活今年挺满足的,没有那么富足啦,更多是合理的ego,以及一如既往容易满足的自己。一方面财务非常安心,这种安心跟绝对值以及去杠杆有一定关系,但是更多是来自于资产和投资认知的提升。应该说,今年是自己从投资上学到东西反过来影响自己生活最有收获的一年。所以今年特别推荐老钱博客解读过的《金钱心理学》,这应该是自己2024的开篇读物。另一方面是自己跟家人更加温和的相处。有些事情没有那么着急,有些事情学会放一放,有些事情学会用时间来消化。最亲的人都在身边一碗汤的距离,所以有时候凌晨盯着熟睡的儿子,朴素而踏实。要提醒自己的一个是,家人相关黑天鹅事件的应对准备;一个是自己真的耐心的建立跟女儿的教育沟通——这一点过去一年显然做得依然不足。

应该说上半年计划的事情基本都达到了自己的预期。所以按说应该会给自己一个礼物,但是现在没有那么迫切了。所以,选择元旦小长假带家人短途出游一趟。从最开始计划,到发出来路线,虽然就是几分钟的草率的“深思熟虑”,旅途的意义不就是在路上吗?而这个在路上我想也一定包括计划和等待的路上。

今年有计划的拿了一些证。两个极端,一个是极难的法考;一个是很容易的无线电操作能力认证。最开始我以为可能只有自己会在身上会发生这种事,知道无无线电考试的当天认识一个律师朋友也来参加无线电考试,我俩愉快的互加了微信。来年我会给自己的智美伙伴加上车台,同时继续法考之路。法考过程中是有迟疑的,可能冲击最大的是最高法宣布关停判案文书网。怎么说呢,如同长老最艰难时候的英语学习——时间总会过去,一味等待除了突增焦虑也难以真的等来转折;做点什么,也许并不会有什么不一样,但是你自己知道那段时间并不平凡。

今年给自己换了手机,并不贵重,但是整理手机照片的过程中勾起了很多往昔回忆。所以有时候也不用对自己太吝啬。今年答应自己的礼物就有点小贵了,明年如果自己依然念念不忘,就给自己愉快的安排上吧。

节前最后一天的东安湖公园一改往日的熙熙攘攘,水面映着冬日暖阳。在湖边发呆的我许久的刚起身,惊起脚底下芦苇的水鸭子扑腾着翅膀飞向远方。

所谓不归

架不住坝坝宴的怀念,周日还是回了躺已经不再的老家。而且,还是拖家带口。

饶有兴致的吃完了宴席,跟主家客道道别,转眼就熟练的钻进了堰坝下的小路,一边引者而这蹒跚向前,一边不忘顺手摘下一个蜜橘跟他分享。

带着妻儿迈过半人高的杂草,跨过菜地,穿过树林,一切都熟悉得不能再熟悉起来。

时间定格在两年前,我想当时的自己是非常坚定而愤愤的写下了《不归》

当时是认真的。然而,谁也没有想到,这两年周遭也好,家国也好,太多变量发生了改变。

当再一次驻足在同一点上,我依然是认真的。可能很难解释清楚这次认真的意义是什么,如果一定要给自己一个阶段性的注释的话,我想应该是:他日远去不归,今日故访,明日可期。

我用从来没有在那方塘中间的角度微微仰视以前故土的位置:周日的阳光出奇的灿烂,天空出奇的蓝,惟独空缺点什么。而这次认真,值得认真的思考、计划和行动。

须记,这次认真不设预期,希望之美!