banner
约 2,100 字
7 分钟

Docker 部署免费的AI大模型API接口平台,每月10+亿Tokens免费用

摘要

FreeLLMAPI 是一个开源的大模型 API 服务平台,支持统一接口和多模型并行。本文介绍了在 VPS 上利用 Docker Compose 部署该项目的步骤,包括配置环境、获取安装码及添加免费大模型提供商密钥。使用时需绑定域名,并注意各平台策略,多平台适度使用以防封号。

前言

FreeLLMAPI 是一个开源项目,它能帮你快速搭建一个属于自己的大模型 API 服务平台:你可以往里添加多家大模型供应商,然后用统一的 API 接口去访问它们,方便各种 AI 应用统一调用,不用每家各配一套。

其实类似的项目挺多的,我之所以选 FreeLLMAPI,主要是两点:一是界面和操作更易用,对小白友好;二是它直接给出了免费大模型的获取链接,省去了自己去各家翻找免费额度的麻烦。

一句话理解价值:把"多家的免费模型额度"汇聚到一个入口,给你的 AI 应用一个统一的 OpenAI 兼容 API 地址,模型可以自动切换、按需调度。

为什么需要"聚合网关"

先说清楚这东西解决的是什么问题,不然后面的配置容易照着做但不知道在做什么。

你手上大概有这些情况:OpenRouter 一个 key、Google AI Studio 一个 key、Groq 一个 key……每个平台的接口地址、鉴权方式、返回格式都略有不同。当你有三四个 AI 应用(聊天前端、翻译脚本、编辑器插件)要用模型时,就变成了 N 个应用 × M 个平台 的配置矩阵。换一个 key,得把这几个应用全改一遍。

网关做的事就是把这个矩阵压成一行:应用只认网关一个地址,网关内部管着 M 个平台。

这里的关键是"OpenAI 兼容"。目前绝大多数 AI 工具(不管是自建还是开源项目)的支持列表里,第一项都是"OpenAI 格式",你只需要填两个东西:

  • Base URL:接口地址

  • API Key:密钥

网关把自己伪装成一个"OpenAI 接口",所以任何支持自定义 API 地址的工具都能直接接上。这就是为什么这类项目都要强调"OpenAI 兼容"——不兼容的话,工具接入成本会高到没人愿意用。

部署

项目提供了多平台的各种部署及安装方法,甚至直接给了 exe 安装文件(Windows 上双击即用)。不过我考虑到这个服务需要 24 小时在线,而且可能要兼顾网络连通问题,所以选择把它部署在 VPS 上,用 docker compose 方式运行,最省心也最稳定。

1. 创建项目目录

在 VPS 上先建一个目录并进入:

纯文本
mkdir freellmapi ; cd freellmapi

2. 新建 docker-compose.yml

用 vim 新建编排文件:

纯文本
vim docker-compose.yml

填入以下内容:

YAML
services:
  freellmapi:
    image: ghcr.io/tashfeenahmed/freellmapi:latest
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - .env
    environment:
      NODE_ENV: production
      PORT: 3001
    # Bound to localhost by default — FreeLLMAPI is single-user and must not be
    # exposed to the internet. Set HOST_BIND=0.0.0.0 to reach it from your LAN.
    ports:
      - "${HOST_BIND:-127.0.0.1}:${PORT:-3001}:3001"
    volumes:
      - freellmapi-data:/app/server/data
    restart: unless-stopped
    healthcheck:
      test:
        [
          "CMD",
          "node",
          "-e",
          "fetch('http://127.0.0.1:3001/api/ping').then((res) => { if (!res.ok) process.exit(1); }).catch(() => process.exit(1));"
        ]
      interval: 30s
      timeout: 5s
      start_period: 15s
      retries: 3

volumes:
  freellmapi-data:

重点看注释:项目默认绑定到 localhost(127.0.0.1),因为它是单用户的,不应该直接暴露到公网。如果你想让局域网内其他设备也能访问,需要把 HOST_BIND 设成 0.0.0.0(建议配合反代 + 认证使用,别裸奔)。

这段配置里有三个设计意图值得解释一下,看懂了才知道哪些能改哪些不能改:

① 127.0.0.1:3001:3001 里的 ${HOST_BIND:-127.0.0.1} —— 这是"宿主机绑定 IP"。写成 127.0.0.1 意味着只有这台服务器自己能访问,外部网络连都连不上。这不是多此一举:这个网关里存着你所有的平台 key,而且它本身没有用户体系(单用户产品),一旦暴露到公网,等于把 key 直接挂出去了。所以默认值的这个"保守"是刻意设计的。

② volumes 里的 freellmapi-data:/app/server/data —— 这是 named volume,用来持久化数据(账号、你填的各个 key、配置)。这行必须留着,否则容器重建一次,你辛苦配的供应商全没了。

③ healthcheck 在测 /api/ping —— Docker 会每 30 秒自己请求一次这个接口。应用如果卡死了,Docker 会把它标记为不健康。这不是必须的,但配合 restart: unless-stopped 能让服务在异常时自动恢复。

3. 新建 .env 配置文件

纯文本
vim .env

填入以下内容(更多参数可参考项目里的 .env.example 文件):

YAML
ENCRYPTION_KEY=4ae0e130ea4a2f4effcf8026dcaf3f2b857e95a601d4752158fdbaa2bf55cba6
# 修改成随机的64位十六进制密钥
# Server port (default: 3001)
PORT=3001

⚠️ 安全提醒:上面的 ENCRYPTION_KEY 是示例值,部署时请务必改成你自己的随机 64 位十六进制密钥(可以用 openssl rand -hex 32 生成),否则存在安全隐患。

env配置

ENCRYPTION_KEY 到底是干什么的:你在 Web 界面填入的各平台 API Key,不会以明文存在数据库里,而是用这个密钥加密后存储。它的作用是防止"数据库被拖走就等于所有 key 泄露"。

由此推出两个必须遵守的操作:

  • 一旦部署后启用,就不要改这个值 —— 改了之后,之前加密保存的 key 全部解不开,只能重新填一遍

  • 这个 key 要单独备份好 —— 换机器迁移时,只有带上它才能把数据接续上

至于生成方式,openssl rand -hex 32 会自动产生 64 个十六进制字符(32 字节 = 256 位),正好符合要求。注意别自己手敲一串"看起来随机"的字符,人的随机性很差。

4. 启动容器

纯文本
docker-compose up -d

等待镜像拉取并启动:

启动容器

项目设置

1. 打开 Web 页面并初始化

浏览器访问 http://VPS的IP:3001,初始化账号时页面会提示需要安装码:

初始化账号

"安装码"这个机制是干什么的:因为服务可能在初始化前就被别人扫到了,如果谁先访问谁就能注册管理员,那你的网关就被别人接管了。安装码的存在相当于**"只有能看到服务器日志的人才能完成初始化"**——它是一个一次性的、只能从本地容器里拿到的凭据。

2. 从日志获取安装码

查看 docker 项目日志,就能拿到安装码:

纯文本
docker-compose logs

查看日志

如果日志很长,可以用 docker-compose logs --tail=50 只看最后 50 行,找起来更快。

3. 添加提供商密钥

进入 Web 页面后,根据提示选择"添加提供商密钥":

添加密钥

4. 选择免费大模型平台

项目提供了非常多免费的大模型平台,并且贴心地给出了各自的获取链接,照着去申请对应的 API Key 即可:

免费模型列表

5. 检查并确认

添加 API Key 后,选择立即检查,能通过就说明配好了。可以多添加几个不同平台的,方便后续按需使用:

检查通过

6. 使用方式

实际调用时,可以自动选择模型,也可以让多个模型同时工作(并行负载均衡/容灾):

自动选择模型

"自动选择模型"和"多模型并行"是两种不同的策略,别混淆:

  • 自动选择(路由):请求进来时,网关挑一个当前可用的平台发出去。这是"提高可用性"——某个平台限流了或挂了,请求会自动落到其他平台上

  • 并行(负载均衡):同一个请求同时发给多个平台,取最先返回的结果。这是"降低延迟 + 提高成功率",代价是消耗多份额度

日常用建议开自动路由就够了;并行适合"这个请求绝对不能失败"的场景,但要记住它会按倍数消耗你的免费额度——本来一天能聊 50 次,开了并行可能只剩十几二十次。

7. 额度与可用模型一目了然

每个平台的可用模型和剩余额度在界面上显示得非常清晰,方便你随时掌握各家的使用情况:

额度显示

这个额度面板是这类工具最实用的一块。因为免费额度分散在多家,你很难靠脑子记住"今天 OpenRouter 还剩几次"。有了它才能做到主动均衡——哪家快用满了就临时停用,把流量引到额度还充裕的平台,避免某一家被薅到触发风控。

使用

  1. 项目会给你生成一个统一的 API 密钥,之后你的各种 AI 应用只要配置这一个地址和这一个 key 即可:

统一API密钥
  1. 如果给服务绑定一个域名再配合 HTTPS 反代,用起来会更方便(不用记 IP + 端口,也避免明文走 HTTP)。

关于第 2 点的"避免明文",值得多说一句:如果你通过公网用 http:// 访问这个网关,那你的统一 API Key 是明文在网络里传输的,中途任何一个节点都能抓走。一旦被抓到,别人就能拿着它消耗你的全部额度。所以只要走公网,就必须上 HTTPS(反代里配证书最省事)。局域网内用 HTTP 可以接受,但前提是你信任这个局域网。

常见问题与排错

1. 页面打不开 / 提示连接被拒绝

最常见的原因是 HOST_BIND 没改。默认配置只允许本机访问,你在自己电脑上输入 http://VPS的IP:3001 是连不上的,需要在 .env 里加一行 HOST_BIND=0.0.0.0 再 docker-compose up -d 重建。改完后记得确认服务器防火墙/安全组也放行了 3001。

2. 加了 key,点检查却不通过

按顺序排查:

  • key 有没有多余空格(从网页复制时最容易带上,前后各一个空格就会鉴权失败)

  • 该平台的 key 是不是还没生效(部分平台新建 key 后要等几分钟)

  • 该平台是否需要额外的 header 或项目 ID(有些平台的鉴权不只靠 key)

  • 网络能不能通:如果这台 VPS 在境内,访问某些海外平台本身就不通,这跟 key 无关

3. 某家平台突然全部报错

先看额度面板。免费额度被用完或触发限流是最高频的原因,尤其晚高峰时段。临时把该平台停用,让请求走其他平台,隔天再看。

4. 想换机器 / 迁移

必须把 .env 里的 ENCRYPTION_KEY 和 freellmapi-data 这个 volume 一起带走。只带数据不带密钥,里面的 key 全是解不开的乱码,等于要重新配一遍。

结尾提醒

最后要注意一下各平台的策略,别在一家平台上薅得太狠,防止被封号。我的理解是多添加几个平台,每个平台适度薅,广撒网、细水长流,整体更稳:

多平台策略

和 OmniRoute 怎么选

同类项目里,我还写过 OmniRoute。两个都是"聚合网关",但性格不太一样:

FreeLLMAPI

OmniRoute

上手难度

低,界面直白

略高,面板功能多

内置免费平台

有,且带获取链接

50+ 家,含免鉴权平台

适合谁

只想"把几个 key 合起来用"

想集中管理多个供应商、玩得深

我的建议:如果你只是嫌"每个应用都要配一遍 key"麻烦,选 FreeLLMAPI;如果你连注册申请 key 都嫌烦(OmniRoute 有几家免鉴权平台,添加账号时自动生成 key),或者想在一个地方管很多供应商,那就上 OmniRoute。

个人结论

如果你手头攒了好几个免费大模型的 API Key,又不想在每个应用里分别配一遍,FreeLLMAPI 这类聚合网关确实能省很多事——一个统一入口、一套统一 API、模型自动切换,把"多平台薅羊毛"的碎片整合成了可用的服务。它的易用界面和自带免费模型获取链接,对小白尤其友好。

唯一要守住的是别在同一家超限滥刷,以及部署时记得改掉默认的加密密钥、别把服务裸奔在公网。整体值得一试。

END