news 2026/9/24 17:30:43

用 Docker Compose 在群晖/飞牛 NAS 上部署 Cursor 文档 AI 大模型:TaoToken 统一 Key 接入 OpenAI API 的配置方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用 Docker Compose 在群晖/飞牛 NAS 上部署 Cursor 文档 AI 大模型:TaoToken 统一 Key 接入 OpenAI API 的配置方案

1. 为什么要在 NAS 上折腾 Cursor 文档 AI 大模型

很多用群晖、飞牛 NAS 的朋友,手里其实有一台 7×24 小时开机的“小服务器”,但平时只拿来存照片、跑下载、做备份,算力闲置得厉害。与此同时,写代码时又离不开 AI 补全和对话,Cursor 编辑器内置的 AI 确实好用,可订阅费用对个人开发者来说不算便宜。于是就有了一个思路:把 Cursor 官网文档页面里那个“询问 AI”的能力,通过 Docker Compose 部署到 NAS 上,转成标准的 OpenAI API 接口,这样任何支持 OpenAI 格式的工具都能连过来用。

这个方案的核心价值在于三点:第一,NAS 常年在线,部署一次就能长期提供服务,不用每次开电脑;第二,对外暴露的是标准 OpenAI API,Cherry Studio、Kilo Code、Continue 这类工具都能直接接入,学习成本几乎为零;第三,通过 TaoToken 统一 Key 和 API 通道来管理调用入口,把模型访问收敛到一个可控的网关,后续换模型、加配额、看用量都方便。适合谁?有群晖或飞牛 NAS、会一点 Docker、想低成本体验多模型对话的开发者。下面我把整套 docker-compose.yml、config.toml 骨架、环境变量和 curl 验证步骤完整写出来,你可以直接复制跟做。

2. TaoToken 前置准备:统一 Key 与 API 通道

在动手写 Compose 之前,先把“入口”理清楚。这个项目本身是一个 OpenAI 兼容的服务端,它需要一个上游模型通道来真正完成推理。我试过直接把各种 Key 散落在不同工具里,时间一长根本记不清哪个工具用了哪个 Key,所以更推荐用 TaoToken 做统一入口:所有工具都指向同一个 API 地址,Key 也只维护一份。

你需要先拿到两样东西:一个是 API Key,一个是接入地址。Key 在控制台的 API Keys 页面创建,地址统一用https://taotoken.net/api。注意这个地址是 API 根路径,实际调用时拼上/v1/chat/completions就是完整的 OpenAI 兼容端点。如果你后面要长期跑编码类 Agent,可以顺带了解下 Coding Plan,它更适合高频、长会话的场景;只是偶尔对话验证模型,用模型对话页面就够。

注意:Key 只创建一次就妥善保存,页面关闭后通常不再完整显示。不要把它写进会提交到 Git 的配置文件里,用环境变量或.env文件隔离。

这一步做完,你手里应该有:TAOTOKEN_API_KEY(你的密钥)和TAOTOKEN_BASE_URL=https://taotoken.net/api。接下来所有配置都围绕这两个值展开。

3. 可复制的 docker-compose.yml 与 config.toml 骨架

群晖和飞牛 NAS 都自带 Docker(群晖叫 Container Manager),Compose 的写法基本一致。先在 NAS 上建一个目录,比如/volume1/docker/cursor-ai,把下面两个文件放进去。

3.1 docker-compose.yml

services: cursor-ai: image: ghcr.io/jhhgiyv/cursorweb2api:latest container_name: cursor-ai restart: unless-stopped network_mode: bridge ports: - "8000:8000" env_file: - .env environment: - TZ=Asia/Shanghai - API_KEY=${LOCAL_API_KEY} - FP=${BROWSER_FP} - MODELS=anthropic/claude-sonnet-4.5,google/gemini-2.5-flash,openai/gpt-5-nano - TIMEOUT=60 - MAX_RETRIES=2 - ENABLE_FUNCTION_CALLING=false - TRUNCATION_CONTINUE=false - UPSTREAM_BASE_URL=${TAOTOKEN_BASE_URL} - UPSTREAM_API_KEY=${TAOTOKEN_API_KEY}

这里的关键点:API_KEY是你本地服务的鉴权密钥,随便生成一串随机值,别用默认的aaaUPSTREAM_BASE_URLUPSTREAM_API_KEY指向 TaoToken,让服务把请求转发到统一通道。MODELS用逗号分隔,按你实际需要的模型填。

3.2 .env 文件

LOCAL_API_KEY=sk-local-换成你的随机串 BROWSER_FP=你的浏览器指纹base64 TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_API_KEY=你的TaoToken密钥

3.3 config.toml 骨架

有些工具(比如部分 CLI 客户端)习惯用 TOML 配置,这里给一份骨架,方便你对接:

[provider] name = "taotoken" base_url = "https://taotoken.net/api/v1" api_key = "你的TaoToken密钥" [model] default = "anthropic/claude-sonnet-4.5" fallback = "google/gemini-2.5-flash" [request] timeout = 60 max_retries = 2 stream = true

base_url记得带上/v1,这是 OpenAI 兼容接口的惯例。defaultfallback按你MODELS里列出的标识填。

3.4 浏览器指纹怎么拿

这个项目需要一个浏览器指纹作为环境变量。在浏览器控制台执行下面这段,把输出的 base64 字符串填到.envBROWSER_FP

function getBrowserFingerprint() { const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); let vendor = '', renderer = ''; if (gl) { const info = gl.getExtension('WEBGL_debug_renderer_info'); if (info) { vendor = gl.getParameter(info.UNMASKED_VENDOR_WEBGL) || ''; renderer = gl.getParameter(info.UNMASKED_RENDERER_WEBGL) || ''; } } const fp = { UNMASKED_VENDOR_WEBGL: vendor, UNMASKED_RENDERER_WEBGL: renderer, userAgent: navigator.userAgent }; return btoa(JSON.stringify(fp)); } console.log(getBrowserFingerprint());

拿到后粘贴进.env,注意不要有多余换行。

4. 启动服务并用 curl 验证 OpenAI API 调用

文件准备好后,在 NAS 的 SSH 里进入目录执行:

cd /volume1/docker/cursor-ai docker compose up -d docker compose logs -f cursor-ai

看到服务监听 8000 端口、没有报错就说明起来了。接着用 curl 验证,这一步是判断“到底通没通”的关键:

curl http://127.0.0.1:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-local-换成你的随机串" \ -d '{ "model": "anthropic/claude-sonnet-4.5", "messages": [{"role": "user", "content": "你好,请用一句话介绍你自己"}], "stream": false }'

如果返回 JSON 里带choicesmessage.content,说明整条链路通了:本地服务 → TaoToken 统一通道 → 模型返回。想测流式就把stream改成true,会看到逐块返回的数据。局域网内其他设备把127.0.0.1换成 NAS 的 IP 即可,比如http://192.168.1.10:8000/v1/chat/completions

在 Cherry Studio 或 Kilo Code 里接入时,基础 URL 填http://NAS的IP:8000/v1,Key 填你本地的LOCAL_API_KEY,模型名填MODELS里的标识。这样 NAS 就成了你家里的 AI 网关,手机、平板、笔记本都能连。

5. 本篇常见错排查

部署过程里最容易卡在几个地方,我按出现频率列一下。

容器起来但 curl 超时:先docker compose logs看有没有上游连接错误。多半是UPSTREAM_BASE_URL写错,注意不要漏掉/api,也不要多加/v1(转发逻辑里会拼)。另外确认 NAS 能正常访问外网。

返回 401 或鉴权失败:检查两处 Key。本地请求头里的 Bearer 必须是LOCAL_API_KEY;上游的TAOTOKEN_API_KEY要填对。两者别搞混,一个是进门钥匙,一个是出门通行证。

模型名报 not foundMODELS里的标识必须和请求体里的model完全一致,大小写、斜杠都不能差。改完MODELSdocker compose up -d重建容器才生效。

指纹相关报错BROWSER_FP必须是合法 base64,粘贴时别带引号或空格。如果换了浏览器或系统更新,指纹可能失效,重新生成一次即可。

端口冲突:群晖上 8000 可能被别的套件占用,把ports左边改成18000:8000,访问时用 18000。

提示:排障时优先看日志,再逐段验证。先确认本地服务活着,再确认上游通道通,最后才怀疑模型名。这个顺序能省很多时间。

6. 长期使用与接入建议

跑通之后,建议把 NAS 上的这个服务当成基础设施来维护。第一,给容器配好restart: unless-stopped,NAS 重启后自动拉起;第二,.env文件权限收紧,别让其他账户读到 Key;第三,定期docker compose pull更新镜像,模型列表和兼容性会随项目迭代变化。

如果你后面要把它接进编码工作流,比如让 Agent 长时间跑任务,建议走 Coding Plan 那条线,配额和稳定性更适合高频场景;只是日常问答和验证,用模型对话就够了。所有接入细节和参数说明,官方文档里写得更全,遇到拿不准的配置先去接入文档核对一遍。把 Key 和地址统一到 TaoToken 之后,你会发现换工具、加设备都只是改一个 base_url 的事,NAS 这台“闲置算力”才算真正用起来了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 17:28:03

基于微信小程序的医疗服务系统-附源码

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/9/24 17:25:47

第27篇-需求获取技术-面向六类干系人的实战方法

【软考高级系统分析师全链路通关实战】第 27 篇:需求获取技术——面向六类干系人的实战方法 本系列定位:面向有开发经验、从零备考软考高级「系统分析师」的工程师,以《系统分析师教程(第 2 版)》为主线,按…

作者头像 李华
网站建设 2026/9/24 17:23:36

ComfyUI-WanVideoWrapper:从 0 到 1 跑通文生视频与图生视频

ComfyUI-WanVideoWrapper:从 0 到 1 跑通文生视频与图生视频 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper ComfyUI-WanVideoWrapper 是一套 ComfyUI 自定义节点。克隆进 custom_no…

作者头像 李华
网站建设 2026/9/24 17:23:15

Linux运维踩坑实录:压缩文件夹报错“zip error: Nothing to do!”

Linux运维踩坑实录:压缩文件夹报错“zip error: Nothing to do!”的深度剖析与最佳实践 引言:文件打包,运维与开发的必经之路 在当今的软件开发和系统运维领域,Linux 操作系统凭借其卓越的稳定性和强大的命令行工具生态&#xff…

作者头像 李华