从零搭建 Claude API 服务:Docker、Nginx 与配置文件全流程指南
Claude 部署完整教程|附配置文件
Claude 是 Anthropic 推出的高性能大语言模型,具备优秀的文本理解、代码生成、长上下文处理和复杂推理能力。对于个人开发者、团队或企业来说,将 Claude 接入到自己的应用、内部工具或私有工作流中,可以显著提升知识管理、客服问答、代码辅助、文档处理等场景的效率。
本文将以“从零部署一个可调用 Claude API 的 Web 服务”为目标,完整介绍 Claude 的部署思路、环境准备、项目结构、配置文件、Docker 部署、Nginx 反向代理以及常见问题处理。你可以根据本文搭建一个基础的 Claude 接入服务,也可以在此基础上继续扩展成聊天机器人、企业知识库助手或内部 AI 网关。
说明:本文默认你已经拥有可用的 Anthropic API Key,并在符合 Anthropic 服务条款及当地法律法规的前提下使用 Claude。
一、Claude 部署方式概览
在正式开始之前,需要先明确一点:Claude 本身不是一个可以直接下载安装到服务器上的开源模型,而是通过 Anthropic 官方 API 进行调用。因此所谓“部署 Claude”,通常指的是部署一个自己的服务端应用,用于安全地调用 Claude API,并对外提供可控的访问入口。
常见部署方式有以下几种:
1. 直接在前端调用 Claude API
这种方式最简单,但不推荐。因为 API Key 会暴露在浏览器端,一旦被他人获取,可能造成额度被滥用、产生费用风险。
2. 后端服务调用 Claude API
这是最推荐的方式。前端只请求你自己的后端接口,后端再携带 API Key 调用 Claude。这样可以隐藏密钥,并且可以加入鉴权、限流、日志、模型切换等功能。
3. Docker 容器化部署
适合服务器部署和团队协作。通过 Docker 可以统一运行环境,避免“本地能跑,线上不能跑”的问题。
4. Nginx 反向代理 + HTTPS
如果你的服务需要公网访问,推荐使用 Nginx 作为反向代理,并配置 HTTPS 证书,提升安全性和访问体验。
本文将采用:
- Node.js + Express 构建后端服务
- Anthropic 官方 API 调用 Claude
- Docker 进行容器化部署
- Nginx 反向代理
.env管理环境变量- 提供完整配置文件示例
二、环境准备
在开始部署前,请准备以下环境。
1. 一台服务器
可以选择任意云服务器,例如:
- 阿里云
- 腾讯云
- 华为云
- AWS
- Google Cloud
- Azure
- Vultr
- Hetzner
推荐最低配置:
CPU:1 核
内存:1GB
系统:Ubuntu 22.04 LTS
磁盘:20GB
如果只是转发 Claude API 请求,对服务器性能要求并不高,因为主要计算由 Anthropic 云端完成。
2. 安装基础工具
登录服务器后,先更新系统:
sudo apt update && sudo apt upgrade -y
安装常用工具:
sudo apt install -y curl wget git vim unzip
3. 安装 Node.js
推荐使用 Node.js 20 LTS:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
查看版本:
node -v
npm -v
如果能看到版本号,说明安装成功。
4. 安装 Docker 和 Docker Compose
如果你希望用 Docker 部署,可以执行:
curl -fsSL https://get.docker.com | bash
启动 Docker:
sudo systemctl enable docker
sudo systemctl start docker
安装 Docker Compose 插件:
sudo apt install -y docker-compose-plugin
检查版本:
docker version
docker compose version
三、项目目录结构
我们将创建一个名为 claude-server 的项目,用于封装 Claude API 调用。
推荐目录结构如下:
claude-server/
├── src/
│ └── index.js
├── .env
├── .env.example
├── package.json
├── Dockerfile
├── docker-compose.yml
└── nginx.conf
创建项目目录:
mkdir claude-server
cd claude-server
npm init -y
安装依赖:
npm install express cors dotenv @anthropic-ai/sdk
其中:
express:用于创建 HTTP 服务cors:处理跨域请求dotenv:读取环境变量@anthropic-ai/sdk:Anthropic 官方 Node.js SDK
四、编写后端服务代码
创建 src/index.js:
mkdir src
vim src/index.js
写入以下代码:
import express from "express";
import cors from "cors";
import dotenv from "dotenv";
import Anthropic from "@anthropic-ai/sdk";
dotenv.config();
const app = express();
const PORT = process.env.PORT || 3000;
const API_KEY = process.env.ANTHROPIC_API_KEY;
const DEFAULT_MODEL = process.env.CLAUDE_MODEL || "claude-3-5-sonnet-latest";
const MAX_TOKENS = Number(process.env.MAX_TOKENS || 1024);
const ALLOW_ORIGIN = process.env.ALLOW_ORIGIN || "*";
const ACCESS_TOKEN = process.env.ACCESS_TOKEN || "";
if (!API_KEY) {
console.error("错误:未配置 ANTHROPIC_API_KEY");
process.exit(1);
}
const anthropic = new Anthropic({
apiKey: API_KEY,
});
app.use(cors({
origin: ALLOW_ORIGIN === "*" ? "*" : ALLOW_ORIGIN.split(","),
}));
app.use(express.json({
limit: "2mb",
}));
function authMiddleware(req, res, next) {
if (!ACCESS_TOKEN) {
return next();
}
const token = req.headers.authorization?.replace("Bearer ", "");
if (!token || token !== ACCESS_TOKEN) {
return res.status(401).json({
error: "Unauthorized",
message: "访问令牌无效或缺失",
});
}
next();
}
app.get("/", (req, res) => {
res.json({
name: "Claude API Server",
status: "running",
model: DEFAULT_MODEL,
});
});
app.get("/health", (req, res) => {
res.json({
status: "ok",
timestamp: new Date().toISOString(),
});
});
app.post("/api/chat", authMiddleware, async (req, res) => {
try {
const {
message,
system,
model,
max_tokens,
temperature,
} = req.body;
if (!message) {
return res.status(400).json({
error: "Bad Request",
message: "message 字段不能为空",
});
}
const response = await anthropic.messages.create({
model: model || DEFAULT_MODEL,
max_tokens: max_tokens || MAX_TOKENS,
temperature: temperature ?? 0.7,
system: system || "你是一个专业、严谨、友好的 AI 助手。",
messages: [
{
role: "user",
content: message,
},
],
});
res.json({
model: response.model,
id: response.id,
role: response.role,
content: response.content,
usage: response.usage,
});
} catch (error) {
console.error("Claude API 调用失败:", error);
res.status(500).json({
error: "Claude API Error",
message: error.message || "未知错误",
});
}
});
app.post("/api/messages", authMiddleware, async (req, res) => {
try {
const {
messages,
system,
model,
max_tokens,
temperature,
} = req.body;
if (!Array.isArray(messages) || messages.length === 0) {
return res.status(400).json({
error: "Bad Request",
message: "messages 必须是非空数组",
});
}
const response = await anthropic.messages.create({
model: model || DEFAULT_MODEL,
max_tokens: max_tokens || MAX_TOKENS,
temperature: temperature ?? 0.7,
system: system || "你是一个专业、严谨、友好的 AI 助手。",
messages,
});
res.json({
model: response.model,
id: response.id,
role: response.role,
content: response.content,
usage: response.usage,
});
} catch (error) {
console.error("Claude API 调用失败:", error);
res.status(500).json({
error: "Claude API Error",
message: error.message || "未知错误",
});
}
});
app.listen(PORT, () => {
console.log(`Claude API Server is running on port ${PORT}`);
});
这段代码提供了三个主要接口:
| 接口 | 方法 | 说明 |
|---|---|---|
/ |
GET | 查看服务基本信息 |
/health |
GET | 健康检查 |
/api/chat |
POST | 单轮对话接口 |
/api/messages |
POST | 多轮对话接口 |
其中 /api/messages 更适合真正的聊天应用,因为它可以传入上下文消息数组。
五、配置 package.json
因为上面的代码使用了 ES Module 语法,所以需要修改 package.json。
示例配置如下:
{
"name": "claude-server",
"version": "1.0.0",
"description": "A simple Claude API server based on Express",
"main": "src/index.js",
"type": "module",
"scripts": {
"start": "node src/index.js",
"dev": "node src/index.js"
},
"dependencies": {
"@anthropic-ai/sdk": "^0.32.1",
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.18.3"
}
}
如果你的依赖版本略有不同,一般不影响运行。
六、环境变量配置文件
创建 .env.example:
vim .env.example
写入:
# 服务端口
PORT=3000
# Anthropic API Key
ANTHROPIC_API_KEY=your_anthropic_api_key_here
# Claude 模型名称
CLAUDE_MODEL=claude-3-5-sonnet-latest
# 最大输出 token 数
MAX_TOKENS=1024
# 允许跨域来源,多个域名用英文逗号分隔
ALLOW_ORIGIN=*
# 可选:访问服务所需的 Bearer Token
ACCESS_TOKEN=your_custom_access_token
然后复制一份为 .env:
cp .env.example .env
编辑 .env:
vim .env
将 ANTHROPIC_API_KEY 替换成你自己的 API Key:
PORT=3000
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxxxxxxxx
CLAUDE_MODEL=claude-3-5-sonnet-latest
MAX_TOKENS=1024
ALLOW_ORIGIN=*
ACCESS_TOKEN=my-secret-token
配置项说明
| 配置项 | 是否必填 | 说明 |
|---|---|---|
PORT |
否 | 服务监听端口 |
ANTHROPIC_API_KEY |
是 | Anthropic API 密钥 |
CLAUDE_MODEL |
否 | 默认使用的 Claude 模型 |
MAX_TOKENS |
否 | 最大输出长度 |
ALLOW_ORIGIN |
否 | CORS 跨域白名单 |
ACCESS_TOKEN |
否 | 简单接口访问令牌 |
生产环境中不建议将 ALLOW_ORIGIN 设置为 *,应改为你的实际前端域名,例如:
ALLOW_ORIGIN=https://example.com,https://admin.example.com
七、本地运行测试
执行:
npm start
如果看到:
Claude API Server is running on port 3000
说明服务启动成功。
测试健康检查:
curl http://localhost:3000/health
返回示例:
{
"status": "ok",
"timestamp": "2026-01-01T00:00:00.000Z"
}
测试 Claude 单轮对话接口:
curl -X POST http://localhost:3000/api/chat \
-H "Content-Type: application/json" \
-H "Authorization: Bearer my-secret-token" \
-d '{
"message": "请用三句话介绍 Claude 的特点"
}'
返回结果类似:
{
"model": "claude-3-5-sonnet-latest",
"id": "msg_xxx",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Claude 是 Anthropic 开发的大语言模型,擅长文本理解、生成和复杂推理..."
}
],
"usage": {
"input_tokens": 20,
"output_tokens": 80
}
}
测试多轮对话接口:
curl -X POST http://localhost:3000/api/messages \
-H "Content-Type: application/json" \
-H "Authorization: Bearer my-secret-token" \
-d '{
"messages": [
{
"role": "user",
"content": "你是谁?"
},
{
"role": "assistant",
"content": "我是一个 AI 助手。"
},
{
"role": "user",
"content": "你能帮我写代码吗?"
}
]
}'
八、Dockerfile 配置
如果你希望使用 Docker 部署,可以在项目根目录创建 Dockerfile:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY src ./src
EXPOSE 3000
CMD ["npm", "start"]
这个 Dockerfile 的作用是:
- 使用 Node.js 20 Alpine 镜像;
- 将项目文件复制到容器中;
- 安装生产依赖;
- 暴露 3000 端口;
- 启动服务。
九、docker-compose.yml 配置
创建 docker-compose.yml:
services:
claude-server:
build: .
container_name: claude-server
restart: always
ports:
- "3000:3000"
env_file:
- .env
environment:
- NODE_ENV=production
使用 Docker Compose 启动:
docker compose up -d
查看容器状态:
docker ps
查看日志:
docker logs -f claude-server
如果需要重新构建:
docker compose up -d --build
停止服务:
docker compose down
十、Nginx 反向代理配置
如果你想通过域名访问,例如:
https://claude.example.com
可以使用 Nginx 反向代理到本地的 3000 端口。
1. 安装 Nginx
sudo apt install -y nginx
2. 创建站点配置
创建配置文件:
sudo vim /etc/nginx/sites-available/claude-server
写入:
server {
listen 80;
server_name claude.example.com;
client_max_body_size 10m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Real-IP $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/claude-server /etc/nginx/sites-enabled/
检查 Nginx 配置:
sudo nginx -t
重载 Nginx:
sudo systemctl reload nginx
此时可以通过:
http://claude.example.com/health
访问健康检查接口。
十一、配置 HTTPS 证书
生产环境强烈建议启用 HTTPS。可以使用 Certbot 免费申请 Let’s Encrypt 证书。
安装 Certbot:
sudo apt install -y certbot python3-certbot-nginx
申请证书:
sudo certbot --nginx -d claude.example.com
按照提示选择自动重定向 HTTP 到 HTTPS。
申请完成后,测试自动续期:
sudo certbot renew --dry-run
如果没有报错,说明证书自动续期配置成功。
十二、前端调用示例
如果你有一个前端页面,可以通过以下方式调用:
async function askClaude(message) {
const response = await fetch("https://claude.example.com/api/chat", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer my-secret-token",
},
body: JSON.stringify({
message,
system: "你是一个中文技术写作助手。",
temperature: 0.7,
max_tokens: 1000,
}),
});
if (!response.ok) {
throw new Error("请求失败");
}
const data = await response.json();
return data.content?.[0]?.text || "";
}
askClaude("请写一段 Claude 部署说明").then(console.log);
如果你要做聊天界面,建议维护一个 messages 数组:
const messages = [];
async function sendMessage(userInput) {
messages.push({
role: "user",
content: userInput,
});
const response = await fetch("https://claude.example.com/api/messages", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer my-secret-token",
},
body: JSON.stringify({
messages,
system: "你是一个耐心、专业的 AI 助手。",
}),
});
const data = await response.json();
const answer = data.content?.[0]?.text || "";
messages.push({
role: "assistant",
content: answer,
});
return answer;
}
十三、安全建议
部署 Claude 服务时,安全性非常重要,尤其是你的服务暴露在公网时。
1. 不要暴露 API Key
ANTHROPIC_API_KEY 只能放在服务器端,不能写进前端代码,也不要提交到 Git 仓库。
建议创建 .gitignore:
node_modules
.env
logs
.DS_Store
2. 设置访问令牌
本文代码中提供了 ACCESS_TOKEN。如果配置该值,请求时必须带上:
Authorization: Bearer your_custom_access_token
这可以避免接口被随意调用。
3. 配置 CORS 白名单
生产环境建议指定前端域名:
ALLOW_ORIGIN=https://your-domain.com
不要长期使用:
ALLOW_ORIGIN=*
4. 加入限流机制
如果访问量较大,建议安装 express-rate-limit:
npm install express-rate-limit
示例代码:
import rateLimit from "express-rate-limit";
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 60,
});
app.use(limiter);
这表示每个 IP 每分钟最多请求 60 次。
5. 记录必要日志
你可以记录请求时间、接口路径、消耗 token 数等信息,但不建议记录用户完整输入内容,尤其是在涉及隐私、合同、医疗、财务等敏感场景时。
十四、常见问题排查
1. 启动时报错:未配置 ANTHROPIC_API_KEY
说明 .env 文件不存在,或者没有正确填写:
ANTHROPIC_API_KEY=你的真实APIKey
如果使用 Docker,确认 docker-compose.yml 中已经包含:
env_file:
- .env
2. 请求返回 401
如果你配置了 ACCESS_TOKEN,请求时必须带上正确的请求头:
-H "Authorization: Bearer my-secret-token"
如果不想启用访问令牌,可以将 .env 中的 ACCESS_TOKEN 留空。
3. Nginx 访问 502 Bad Gateway
通常是后端服务没有启动,或者端口不一致。可以检查:
docker ps
docker logs -f claude-server
curl http://127.0.0.1:3000/health
同时确认 Nginx 中的代理地址:
proxy_pass http://127.0.0.1:3000;
4. Claude API 调用超时
可能原因包括:
- 网络到 Anthropic API 不稳定;
- 请求内容过长;
- 模型响应耗时较长;
- Nginx 超时时间太短。
可以适当增加 Nginx 配置中的:
proxy_read_timeout 120s;
5. 返回内容为空
Claude 的返回内容通常在:
data.content[0].text
如果你使用了不同类型的内容块,需要根据 type 判断。例如:
for (const block of data.content) {
if (block.type === "text") {
console.log(block.text);
}
}
十五、生产环境优化建议
完成基础部署后,如果要用于正式业务,建议进一步优化。
1. 增加统一错误处理
将错误处理封装为中间件,可以让代码更清晰,也方便后期维护。
2. 支持流式输出
聊天应用中,流式输出体验更好。Claude API 支持 streaming,你可以改造接口为 SSE,让前端逐字接收内容。
3. 增加用户系统
如果是多人使用,建议加入用户身份识别,并为不同用户设置调用额度。
4. 增加 token 统计
你可以根据 Claude 返回的 usage 字段统计消耗:
{
"input_tokens": 100,
"output_tokens": 300
}
这对于成本控制非常重要。
5. 接入数据库
如果需要保存会话记录,可以使用:
- PostgreSQL
- MySQL
- MongoDB
- Redis
例如,Redis 可以用于短期上下文缓存,PostgreSQL 可以用于长期聊天记录保存。
6. 使用 PM2 部署非 Docker 应用
如果不使用 Docker,也可以用 PM2 保持 Node 服务常驻:
npm install -g pm2
pm2 start src/index.js --name claude-server
pm2 save
pm2 startup
查看日志:
pm2 logs claude-server
十六、完整部署流程总结
最后,将整个 Claude 部署流程整理如下:
# 1. 创建项目
mkdir claude-server
cd claude-server
npm init -y
# 2. 安装依赖
npm install express cors dotenv @anthropic-ai/sdk
# 3. 编写 src/index.js、package.json、.env
# 4. 本地测试
npm start
# 5. Docker 部署
docker compose up -d --build
# 6. 配置 Nginx
sudo nginx -t
sudo systemctl reload nginx
# 7. 配置 HTTPS
sudo certbot --nginx -d claude.example.com
# 8. 测试接口
curl https://claude.example.com/health
结语
通过本文,你已经完成了一个基础但可扩展的 Claude API 服务部署。它具备后端转发、环境变量管理、访问令牌鉴权、Docker 容器化、Nginx 反向代理和 HTTPS 支持等能力,能够满足个人项目和小型团队的常见使用需求。
如果你只是做实验,可以直接使用 Node.js 启动服务;如果你准备长期运行,推荐使用 Docker Compose 部署,并结合 Nginx、HTTPS、访问令牌、限流和日志监控来提升安全性与稳定性。后续你还可以在此基础上增加流式输出、用户系统、知识库检索、会话存储和成本统计,将它扩展成一个完整的 AI 应用平台。