有 VPS 的别闲着,自己搭个 AI 中转站玩玩
文章目录
本教程需要的技术(版本仅作为参考):
-
VPS(云服务器):2c2g(2个CPU核数2G的内存),地区选择硅谷
-
Linux:CentOS Linux release 7.6.1810 (Core)
-
Docker:26.1.4
-
Docker Compose:2.27.1
-
CLI Proxy API(CPA):latest(v6.10.9)
-
New API:latest(v1.0.0-rc.4)
-
Nginx:latest(1.29.8)
CPA在本教程中只作为New API的一个渠道,用于管理认证文件;token监控和代理节点都交给New API,所以CPA用最新版本即可。
本教程需要的工具:
- FinalShell:SSH远程连接工具
VPS选择
我买了腾讯云的服务器用来做教学,全程可用国内网访问 有VPS的佬可以跳过这一步了
活动页:腾讯云最新活动
这是新人优惠,2c2g一年99米 这是两个图片拼接起来的,颜色不同的大框表示不同的图片,这两个图片的截取在同一个页面,下滑即可
购买完毕后进入控制台
这也是两张图片拼接起来的,颜色不同的大框表示不同的图片,上面黄框是腾讯云主页的头部标签,下面红框是点击控制台后进入控制台的页面
查看服务器IP
也是由黄框和红框分别不同的图片 由于腾讯云默认安全组打开了22端口(SSH服务),这里就不进安全组了,后文有讲到如何配置安全组,这里不过多赘述
使用FinalShell连接到服务器
填写名称、主机IP、用户名和密码即可连接到我们的服务器 FinalShell的好处就是修改文件或者上传下载文件时是可视化的,不用一遍一遍敲命令行
一、准备工作
1、创建一个文件夹用于存文件,并进入该文件夹
proxy:用于存放docker-compose.yml文件(启动文件夹) cpa:用于存放CPA的配置文件(config.yaml)和其他的挂载卷信息(日志、OAuth认证文件) newapi:用于存放New API的挂载卷信息(日志、配置文件)
mkdir -p /opt/proxy/{cpa/{logs,auths},newapi/{data,logs}} && cd /opt/proxy && touch docker-compose.yml cpa/config.yaml
执行上述命令后,我们就可以看到下面图片所示内容 newapi里面就不展示了,里面的文件是空的 需要修改proxy文件夹中的docker-compose.yml和cpa目录下的config.yaml文件 目录结构如下
/opt/proxy/
├── docker-compose.yml
├── cpa/
│ ├── logs/
│ ├── auths/
│ └── config.yaml
└── newapi/
├── data/
└── logs/
2、cpa目录下的config.yaml文件
包含⚠️的参数是需要修改的,包含❓的是可修改的,其他的可以照抄
# 留空则完全禁用管理API(所有 /v0/management 路由返回404)。
secret-key: "$2a$10$5dHykttqHWAU.WcYFg0qgOXhDoxC1P7wpZ7i2T8Kj9xqwvVRfTUm2" # ⚠️ 请修改密码
# true时禁用内置管理面板资源与路由。默认false
disable-control-panel: false
# 认证目录(支持 ~ 展开为主目录)
auth-dir: "~/.cli-proxy-api"
# apikeys自己设置
api-keys:
- sk-8SGCShq021BAFgpBE # ⚠️ 请修改密钥
# 调试日志。默认false
debug: true
# 写入滚动日志文件而非stdout。默认false
logging-to-file: true
# 日志目录大小上限,0表示不限制。
logs-max-total-size-mb: 100
# 403/408/500/502/503/504时的重试次数。
request-retry: 3
# 冷却凭据等待秒数上限,超出即触发重试。
max-retry-interval: 30
routing:
# 多匹配凭据的选择策略:round-robin 或 fill-first。默认round-robin
strategy: "round-robin"
# 是否为 /v1/ws 启用认证。默认false
ws-auth: false
# 为false时禁用内存用量统计聚合,默认false
# 1.10版本后失效,我这里用的最新版本,并且后续通过New API统计,这里false即可
# ❓ 如果选择CPA对外的话,并且参照我之前的文章,需要监控token消耗,这里可以改为true
usage-statistics-enabled: false
3、proxy目录下的docker-compose.yml文件
包含⚠️的参数是需要修改的,包含❓的是可修改的,其他的可以照抄
# New API docker-compose 配置参考:
# https://docs.newapi.ai/zh/docs/installation/config-maintenance/docker-compose-yml
# 启动的全部服务
services:
# 服务名
new-api:
# 镜像名
image: calciumion/new-api:latest
# 容器名
container_name: new-api
# 退出时总是自动重启,确保服务意外挂掉后能恢复。
restart: always
# 启动容器后,会执行这个自定义命令,它将应用的日志目录设置为 /app/logs
command: --log-dir /app/logs
# 端口映射
ports:
- '3000:3000' # ❓注意后面的3000不能修改,不然后面的healthcheck心跳检测,检测不到
# 卷挂载
volumes:
- ./newapi/data:/data
- ./newapi/logs:/app/logs
# 环境变量
environment:
- SQL_DSN=postgresql://root:123456@postgres:5432/new-api # ⚠️ 请修改密码
# - SQL_DSN=root:123456@tcp(mysql:3306)/new-api # 如果用mysql的话,取消这条注释,并注释上面那条
- REDIS_CONN_STRING=redis://redis
# 设置容器时区为上海
- TZ=Asia/Shanghai
# 是否启用错误日志记录
- ERROR_LOG_ENABLED=true
# 是否启用批量更新 batch update enabled
- BATCH_UPDATE_ENABLED=true
# - STREAMING_TIMEOUT=300 # 流模式无响应超时时间,单位秒,默认120秒,如果出现空补全可以尝试改为更大值
# - SESSION_SECRET=random_string # 多机部署时设置,必须修改这个随机字符串!!
# - SYNC_FREQUENCY=60 # 如果需要定期数据库同步,请取消注释
# 定义启动顺序,它会等待cpa、redis、postgres容器启动后,再启动
depends_on:
- redis
- postgres
# - mysql # 如果用mysql的话,取消这条注释,并注释上面那条
- cpa
# 心跳检查,在容器内检查,间隔30s,超时时间10s,重复机制3次
healthcheck:
# test的内容是向本机(容器内)发送一个请求,如果在响应中找不到success关键字就报错
test:
[
'CMD-SHELL',
"wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' || exit 1",
]
interval: 30s
timeout: 10s
retries: 3
# 下面的同上,不同的参数我再做解释
redis:
image: redis:latest
container_name: redis
restart: always
postgres:
image: postgres:15
container_name: postgres
restart: always
environment:
# 数据库用户名
POSTGRES_USER: root # ❓ 设置用户名,改为你自己的
# 数据库密码
POSTGRES_PASSWORD: 123456 # ⚠️ 设置密码,改为你自己的
# 数据库名
POSTGRES_DB: new-api
volumes:
- pg_data:/var/lib/postgresql/data
# ports:
# - "5432:5432" # 如果这个服务要对外,需要解开这个注释
# mysql:
# image: mysql:8.2
# container_name: mysql
# restart: always
# environment:
# MYSQL_ROOT_PASSWORD: 123456 # ⚠️ 设置密码,改为你自己的
# MYSQL_DATABASE: new-api
# volumes:
# - mysql_data:/var/lib/mysql
# ports:
# - "3306:3306" # 如果这个服务要对外,需要解开这个注释
# cpa服务
cpa:
image: eceasy/cli-proxy-api:latest
container_name: cpa
# ports:
# - "9999:8317" # ❓因为这次是通过New API对外提供服务,CPA只是作为认证文件管理工具
volumes:
- ./cpa/config.yaml:/CLIProxyAPI/config.yaml # 配置文件输出
- ./cpa/auths:/root/.cli-proxy-api # 认证文件,config.yaml中的~代表主目录,在Linux中就是/root
- ./cpa/logs:/CLIProxyAPI/logs # 日志文件输出
restart: always
# 顶级挂载,避免文件权限问题,挂载地址:/var/lib/docker/volumes/pg_data
volumes:
pg_data:
# mysql_data:
4、把认证文件放进 /opt/proxy/cpa/auths 目录下
5、去Linux的防火墙打开3000端口
先查看下防火墙状态:
# 看防火墙是否在运行
systemctl status firewalld
# 启动防火墙(不会断SSH,放心)
systemctl start firewalld
# 设置开机自启
systemctl enable firewalld
# 看看当前默认放行了哪些服务
firewall-cmd --list-services
# 看开放了哪些端口
firewall-cmd --list-ports
如果防火墙没有开启,则不用执行下面的步骤;或者你要安全,可以打开防火墙后再执行下面命令。 打开后,后续如果要对外开放端口,都需要重新配置一遍。 比如你只想用CPA对外,就需要把--add-port改成你自己的参数。
firewall-cmd --zone=public --add-port=3000/tcp --permanent && firewall-cmd --reload && firewall-cmd --list-ports
比如下面我的操作就说明可以了(供参考):
[root@VM-0-16-centos proxy]# firewall-cmd --zone=public --add-port=3000/tcp --permanent && firewall-cmd --reload && firewall-cmd --list-ports
success
success
3000/tcp
[root@VM-0-16-centos proxy]# firewall-cmd --list-ports
3000/tcp
6、打开云服务器的安全组
我用的是腾讯云的VPS,这里用腾讯云举例,其他的也是大同小异
(1)先去控制台,选择我们的服务器
(2)选择防火墙并添加规则,下面三个是官方配置的,不要动,特别是SSH登录(22端口)
(3)添加规则:配置来源和端口号
(4)确认好后就多了一条
二、执行Docker Compose文件
在 /opt/proxy 目录下(你的 docker-compose.yml 文件所在目录) 执行命令docker compose up -d即可
[root@VM-0-16-centos proxy]# docker compose up -d
WARN[0000] /opt/proxy/docker-compose.yml: `version` is obsolete
[+] Running 27/10
✔ redis Pulled 8.2s
✔ postgres Pulled 26.0s
✔ new-api Pulled 27.3s
[+] Running 6/6
✔ Network proxy_default Created 0.1s
✔ Volume "proxy_pg_data" Created 0.0s
✔ Container cpa Started 0.8s
✔ Container postgres Started 0.7s
✔ Container redis Started 0.8s
✔ Container new-api Started
PS:关闭Docker Compose后重启报错
关闭Docker Compose命令
docker compose down
我重启时遇见了下面的问题 这里只需要重启docker再启动Docker Compose即可 重启docker:systemctl restart docker 启动Docker Compose:docker compose up -d
[root@VM-0-16-centos proxy]# docker compose up -d
WARN[0000] /opt/proxy/docker-compose.yml: `version` is obsolete
[+] Running 1/0
✘ Network proxy_default Error 0.0s
failed to create network proxy_default: Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b977b99684c8 -j RETURN: iptables: No chain/target/match by that name. (exit status 1))
三、我们通过 http://ip:3000 就可以访问我们中转站了
四、New API配置
1、登录
我们通过管理员登录,就可以看见只有管理员才能看见的菜单了 而这些菜单就是最关键的配置 我这里只讲一下几个关键菜单配置 这些菜单也只是挑重点讲一下,最后能使用即可,如果自用或者公益站这些足以,如果商用就得自己下功夫去看官网文档,或者把源码下载下来二次开发了 如果感兴趣可以去官网查看文档,写的很详细:渠道管理 | New API
2、渠道管理
添加渠道
这里填写我们CPA配置的apikey和Docker Compose配置的服务名(因为在同一个Docker Compose文件中,它们共享同一个Docker网络)名称:随意 密钥:CPA中config.yaml配置的密钥 API地址(放个可以复制粘贴的:http://cpa:8317):就是CPA的地址 模型:密钥和API地址填好后点击获取即可
点击测试后发现报错,我们就根据报错提示去配置价格。
3、系统管理
设置模型价格
我们再去点击测试,发现就可以通过了。
在模型广场里面也可以看见我们配置的模型了
其他
系统设置里面有很多功能,比如修改可见菜单。
设置签到功能。
设置公告、API信息、支付等等。
4、配置令牌
5、本地连接测试(CC Switch)
配置一下刚才我们复制的密钥
测试一下,没有问题。
在数据看板中也可以看见使用情况。
五、域名配置
这里可以简单的配置一下DNS做映射,但不安全,所以我们这里添加一个项目Nginx,用于添加SSL证书 这里我使用的是Cloudflare做的代理,所以我按Cloudflare讲解,其他的云服务商配置也是大同小异 如果不想配置Nginx和SSL,只想单纯的通过域名解析到IP,直接看第三步:配置DNS解析服务 我买的顶级域名为(严格来说这是二级域名,我习惯说这是顶级域名):wudike.online 需要创建一个二级域名来映射我的网站:api.wudike.online
1、使用Cloudflare的DNS代理我们的域名
这里我的域名是之前在阿里云买的,所以我用阿里云作为演示,各个云服务商的操作都是大同小异的
(1)进入域名与网站
(2)选择域名进行购买
查询之后下滑点击购买就可以了 域名这里买了之后要实名认证,审核要几个工作日吧,有点忘记了
由于文章添加图片上限了,不往下写了,完整的放在夸克上了




























