ACMAPI 中转站搭建

bg

事情的起因是这样的,笔者在四月末的某一天参加了 ACM班中期座谈会,会上 wankupi 学长说我们班没有人volunterr去搭建一个大模型的API 中转站,于是大二集体又又又接受了yyu的教育😆 彼时笔者在被 copilot proApple 服务器出bug无法修改地区 狠狠阴了一把后,气急败坏,转头开始测评起了能用 opus系列的大模型中转站,当然也对搭建中转站本身产生了一些兴趣。同时Parsifal跟我说他想通过搭建中转站赚米,笔者听了十分心动,因为笔者近期在token、服务器、域名、ip、以及给一堆人买生日礼物身上花掉了大笔大笔的钱,即便是大小姐也撑不住了,决定要靠自己获得一些经济支持。种种原因就促成了笔者去找了 kupi学长,揽下了搭中转站的活。经过4月30号近一天的摸索,笔者在P老师的帮助下有了一个较为清晰的设计,在本机上也跑成功了,遂决定写一篇博客,记录一下 从 0 开始搭建API中转站 的全过程。

Initial

最开始,想法是把中转站部署在一台海外服务器上,由海外服务器统一转发到一个海外静态住宅ip,以此来规避Anthropic 近乎恐怖的封控力度。但后来得知可以获得ACM班服务器的使用权限,我们最终选择了把中转站部署到这台服务器上,再后续将请求转发到海外静态住宅ip。

小插曲

笔者五一回家期间试图在家干活,连服务器的时候却屡屡碰壁,后来才得知wsl下的ip一直是家里的ip而非连接交大VPN后的交大ip,但windows下的ip是交大ip,遂走了windows连。后来给wsl做了windows网络镜像后依然没法连上,也是留下了一个坑点了。

中转站框架

主流的中转站框架有 oneAPInewAPIsub2API等,newAPI是最早的也是相对功能最完善的,但笔者先前用过一个基于newAPI的近乎糟糕的站,所以对 newAPI的印象不太好,最终选择了sub2API,主要是因为它的代码相对简洁,且功能也比较完善,能够满足我们的需求。

前端修缮

作了一些前端的美化工作,turn sub2API to ACMAPI。

域名和内网穿透

为了让外网能够访问到部署在服务器上的中转站,我们需要一个域名和内网穿透工具。我们选择了 cloudflare 作为内网穿透工具,因为它简单易用,且提供了免费的服务。我们注册了一个域名(.top居然只要14,我刚续费125的.site算什么),并将其解析到 cloudflare 提供的地址上,这样外网用户就可以通过这个域名访问我们的中转站了。成功在本机上跑通了。

此时,还不知道,前方的挑战才刚刚开始。

服务器部署

首先,sub2api的前后端较为奇怪,前端采用 typescript 编写,用pnpm进行包管理,而后端则是 go 编写。

1
2
3
4
5
6
cd frontend
pnpm install
pnpm run build

cd ../backend
go build -tags embed -o sub2api ./cmd/server

pnpmgo build 对我们的ACM班服务器来说简直是毁灭性的。这是一台内存极小并且在交大防火墙内的服务器,pnpm build需要占用很大的空间,前端还没编译完就炸了。更糟糕的是后端的编译。go语言基于github的依赖包太多,而交大的网络环境又极其不友好,导致编译过程中经常出现下载依赖包失败的情况,最终导致编译失败。被硬控了一个晚上后,我们转变思路,直接在本地编译好一切,统一扔到服务器上。这里我们推荐采用rsync的数据传输方式,效率比scp高很多很多。

接下来就是在服务器上装数据库这些,并且又进行了一次内网穿透,至此其实部署在ACM班服务器上的中转站已经可以正常访问了。

接着开始考虑ip代理配置。这也是遇到的最大的困难。

我们发现,部署在交大防火墙内的服务器根本无法正常连接到静态住宅ip。海外静态住宅ip其实都需要加一层海外机房ip的代理后再发去请求。所以想法自然就来到了,在acm班服务器上加一层代理。然而连github都访问不了,又该如何装 clash 呢?就这样陷入了一个死循环。当然又经过了一个晚上的摸索,通过了临时代理的方式,成功装好了clash。同样受限于交大dns,并非所有的订阅都能用在clash上。为此笔者被迫又获得了好几个梯子(此处应有tieba_hehe),终于找到了几个能成功订阅的。不出意外又要出意外了,经过两次代理后,虽然能够实现成功连通到海外住宅ip上了,但两次代理又带来了很奇怪的问题,完全无法访问AnthropicOpenAI,疑似是这两家检测出了轨迹上的交大ip或是机房ip,直接封了。

所以我们得出结论:想通过部署在校内服务器上的中转站访问Anthropic和OpenAI是行不通的。后续,我们尝试在一台港区服务器上进行了同样的操作,大获成功,这也成了我们目前的商用中转站joypiggy(快乐小猪🐖),有兴趣的uu们私聊!

就在我实在没招了的时候,郑老板告知其实只需要实现连到上游中转站就行了,bur,这么简单,那我不早就搞定了吗???何意味。。。

jAccount 认证

值得骄傲啊,这是笔者从idea设计到实施跑通全部独立完成没有外人干预的一部分。jAccount认证是我们中转站的一个重要功能,它能够确保只有交大学生才能使用我们的中转站。实现这个功能的关键是要与交大的认证系统进行对接,验证用户的身份信息。

感兴趣的可以阅读这篇文章。最后的实现是在前端登录界面添加了一个jAccount登录按钮,用户点击后会跳转到交大的认证页面,用户输入自己的jAccount账号和密码进行认证,认证成功后会返回一个包含用户信息的token,我们的中转站会验证这个token的有效性,如果有效就允许用户继续使用中转站的功能。

遗憾(也或许是future work)

我们本来预期的想法是通过acm.sjtu.edu.cn/llmapi 来进行访问,基于nginx的反向代理配置,但很不幸后端base url 修改逻辑过于复杂,感觉跟jAccount认证的url 跳转有一定关系,导致我们最后还是只能通过我买的域名来访问了,虽然这个域名也很便宜,后续如果有机会的话还是想把这个问题解决掉的。

网站运维

笔者在此之前完全没有过网站运维的经验。整个过程中遇到了很多问题,比如服务器的环境配置、数据库的安装和配置、域名解析、内网穿透等等,每一个问题都让我头疼不已。但是通过不断地学习和尝试,最终还是成功地搭建了这个中转站,这也是我觉得最有成就感的一部分。

wankupi学长给我的网站运维提出了不少意见,包括systemd service的配置、postgres数据库的使用等,非常感谢!!!

结语

我们这样费劲心思搭建的中转站,说白了还是因为 Anthropic 和 OpenAI 的种种限制,令人感慨,现在的学习科研难道真的成了 token 之争吗?我不明白。

2026年4月30号我在水源上发了一个话题,想知道源友对API中转站的看法https://shuiyuan.sjtu.edu.cn/t/topic/470419,也欢迎交大的同学前去投票。

以及(再重复一遍),如果有同学对便宜且满血不掺水codex中转站感兴趣,欢迎联系我!我们目前的商用中转站joypiggy(快乐小猪🐖)已经上线了,欢迎大家使用!

最后,感谢帮助过我的学长、同学和源友!有你们是我的幸运!