上一篇 下一篇 分享链接 返回 返回顶部

从零搭建 Claude API 服务:Docker、Nginx 与配置文件全流程指南

发布人:慈云数据-客服中心 发布时间:6小时前 阅读量:3

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 的作用是:

  1. 使用 Node.js 20 Alpine 镜像;
  2. 将项目文件复制到容器中;
  3. 安装生产依赖;
  4. 暴露 3000 端口;
  5. 启动服务。

九、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 应用平台。

目录结构
全文