import { Callout, Cards, Steps, Tabs } from "nextra/components";

# 部署指南

本指南涵盖 DeerFlow 应用所有支持的部署方式：本地开发、Docker Compose 以及使用 Kubernetes 管理沙箱的生产环境。

## 本地开发部署

本地工作流是运行 DeerFlow 最快的方式，所有服务作为原生进程在你的机器上运行。

<Tabs items={["启动", "停止", "日志"]}>
  <Tabs.Tab>
```bash
make dev
```

启动的服务：

| 服务 | 端口 | 描述 |
|---|---|---|
| LangGraph | 2024 | DeerFlow Harness 运行时 |
| Gateway API | 8001 | FastAPI 后端 |
| 前端 | 3000 | Next.js 界面 |
| nginx | 2026 | 统一反向代理 |

访问地址：**http://localhost:2026**
  </Tabs.Tab>
  <Tabs.Tab>
```bash
make stop
```

停止所有四个服务。即使某个服务没有运行也可以安全执行。
  </Tabs.Tab>
  <Tabs.Tab>
```
logs/langgraph.log   # Agent 运行时日志
logs/gateway.log     # API Gateway 日志
logs/frontend.log    # Next.js 开发服务器日志
logs/nginx.log       # nginx 访问/错误日志
```

实时追踪日志：
```bash
tail -f logs/langgraph.log
```
  </Tabs.Tab>
</Tabs>

## Docker Compose 部署

Docker Compose 在容器中运行所有服务。适用于更接近生产的本地设置或团队环境。

### 前置条件

- Docker（macOS 上的 Docker Desktop 或 OrbStack）
- 在仓库根目录中已配置的 `config.yaml`

### 开发 Compose

```bash
# 设置 deer-flow 仓库根目录的绝对路径
export DEER_FLOW_ROOT=/path/to/deer-flow

docker compose -f docker/docker-compose-dev.yaml up --build
```

访问地址：**http://localhost:2026**

### 环境变量

在仓库根目录创建 `.env` 文件用于存放密钥和运行时配置：

```bash
# .env
OPENAI_API_KEY=sk-...
DEER_FLOW_ROOT=/absolute/path/to/deer-flow
BETTER_AUTH_SECRET=your-secret-here-min-32-chars
```

`docker-compose*.yaml` 文件包含 `env_file: ../.env` 指令，会自动加载该文件。

<Callout type="warning">
  在部署前始终将 <code>BETTER_AUTH_SECRET</code> 设置为强随机字符串。没有它，前端构建会使用一个公开已知的默认值。
</Callout>

### 数据持久化

线程数据存储在 `backend/.deer-flow/threads/`。在 Docker 部署中，此目录被绑定挂载到 langgraph 容器中。

为避免容器重建时数据丢失：

1. 将 `DEER_FLOW_ROOT` 设置为仓库根目录的绝对路径。
2. 验证 `threads/` 和 `skills/` 目录挂载正确。

对于生产环境，使用命名卷或持久化卷声明（PVC）代替主机绑定挂载。

## 生产部署注意事项

### 沙箱模式选择

| 沙箱 | 使用场景 |
|---|---|
| `LocalSandboxProvider` | 单用户、受信任的本地工作流 |
| `AioSandboxProvider`（Docker） | 多用户、中等隔离需求 |
| `AioSandboxProvider` + K8s Provisioner | 生产环境、强隔离、多用户 |

对于有多个并发用户的任何部署，使用基于容器的沙箱，防止用户之间的执行环境相互干扰。

### K8s Provisioner 配置

<Steps>

#### 配置 Provisioner

在你的 `.env` 或 compose 覆盖文件中设置必需的环境变量：

```bash
K8S_NAMESPACE=deer-flow
SANDBOX_IMAGE=enterprise-public-cn-beijing.cr.volces.com/vefaas-public/all-in-one-sandbox:latest
DEER_FLOW_ROOT=/absolute/path/to/deer-flow
```

#### 配置沙箱提供者

```yaml
# config.yaml
sandbox:
  use: deerflow.community.aio_sandbox:AioSandboxProvider
  provisioner_url: http://provisioner:8002
```

#### 配置数据持久化

对于生产环境，使用 PVC 代替 hostPath 卷：

```bash
# 在 .env 或 compose 环境中
USERDATA_PVC_NAME=deer-flow-userdata-pvc
SKILLS_PVC_NAME=deer-flow-skills-pvc
```

当设置 `USERDATA_PVC_NAME` 时，Provisioner 自动使用子路径（`threads/{thread_id}/user-data`），每个线程在 PVC 中获得自己的目录。

</Steps>

### nginx 配置

nginx 路由所有流量，控制路由的关键环境变量：

| 变量 | 默认值 | 描述 |
|---|---|---|
| `LANGGRAPH_UPSTREAM` | `langgraph:2024` | LangGraph 服务地址 |
| `LANGGRAPH_REWRITE` | `/` | LangGraph 路由的 URL 重写前缀 |

这些在 Docker Compose 环境中设置，并在容器启动时由 `envsubst` 处理。

### 认证配置

DeerFlow 应用使用 [Better Auth](https://www.better-auth.com/) 进行会话管理。在生产环境中：

1. 将 `BETTER_AUTH_SECRET` 设置为强随机字符串（最少 32 个字符）。
2. 将 `BETTER_AUTH_URL` 设置为你的公开 URL（例如 `https://your-domain.com`）。

```bash
# 生成密钥
openssl rand -base64 32
```

### 资源建议

| 服务 | 最低配置 | 推荐配置 |
|---|---|---|
| LangGraph（Agent 运行时） | 2 vCPU、4 GB RAM | 4 vCPU、8 GB RAM |
| Gateway | 0.5 vCPU、512 MB | 1 vCPU、1 GB |
| 前端 | 0.5 vCPU、512 MB | 1 vCPU、1 GB |
| 沙箱容器（每会话） | 1 vCPU、1 GB | 2 vCPU、2 GB |

## 部署后验证

启动后验证部署：

```bash
# 检查 Gateway 健康状态
curl http://localhost:8001/health

# 检查 LangGraph 健康状态
curl http://localhost:2024/ok

# 通过 nginx 列出配置的模型（验证完整代理链）
curl http://localhost:2026/api/models
```

正常工作的部署会从每个端点返回 `200` 响应。`/api/models` 调用会返回你 `config.yaml` 中的模型列表。

<Cards num={2}>
  <Cards.Card title="配置" href="/docs/application/configuration" />
  <Cards.Card title="运维与排障" href="/docs/application/operations-and-troubleshooting" />
</Cards>
