88f822a8b3
Agent-Logs-Url: https://github.com/bytedance/deer-flow/sessions/ff389ed8-31c9-430c-85ff-cc1b52b8239c Co-authored-by: foreleven <4785594+foreleven@users.noreply.github.com>
206 lines
5.8 KiB
Plaintext
206 lines
5.8 KiB
Plaintext
import { Callout, Cards, Steps, Tabs } from "nextra/components";
|
|
|
|
# Deployment Guide
|
|
|
|
This guide covers all supported deployment methods for DeerFlow App: local development, Docker Compose, and production with Kubernetes-managed sandboxes.
|
|
|
|
## Local development deployment
|
|
|
|
The local workflow is the fastest way to run DeerFlow. All services run as native processes on your machine.
|
|
|
|
<Tabs items={["Start", "Stop", "Logs"]}>
|
|
<Tabs.Tab>
|
|
```bash
|
|
make dev
|
|
```
|
|
|
|
Services started:
|
|
|
|
| Service | Port | Description |
|
|
|---|---|---|
|
|
| LangGraph | 2024 | DeerFlow Harness runtime |
|
|
| Gateway API | 8001 | FastAPI backend |
|
|
| Frontend | 3000 | Next.js UI |
|
|
| nginx | 2026 | Unified reverse proxy |
|
|
|
|
Access the app at **http://localhost:2026**.
|
|
</Tabs.Tab>
|
|
<Tabs.Tab>
|
|
```bash
|
|
make stop
|
|
```
|
|
|
|
Stops all four services. Safe to run even if a service is not running.
|
|
</Tabs.Tab>
|
|
<Tabs.Tab>
|
|
```
|
|
logs/langgraph.log # Agent runtime logs
|
|
logs/gateway.log # API gateway logs
|
|
logs/frontend.log # Next.js dev server logs
|
|
logs/nginx.log # nginx access/error logs
|
|
```
|
|
|
|
Tail a log in real time:
|
|
```bash
|
|
tail -f logs/langgraph.log
|
|
```
|
|
</Tabs.Tab>
|
|
</Tabs>
|
|
|
|
## Docker Compose deployment
|
|
|
|
Docker Compose runs all services in containers. Use this for a more production-like local setup or for team environments.
|
|
|
|
### Prerequisites
|
|
|
|
- Docker (or Docker Desktop / OrbStack on macOS)
|
|
- A configured `config.yaml` at the repo root
|
|
|
|
### Development compose
|
|
|
|
```bash
|
|
# Set the absolute path to your deer-flow repo root
|
|
export DEER_FLOW_ROOT=/path/to/deer-flow
|
|
|
|
docker compose -f docker/docker-compose-dev.yaml up --build
|
|
```
|
|
|
|
Services: nginx, frontend, gateway, langgraph, and optionally provisioner (for K8s-managed sandboxes).
|
|
|
|
Access the app at **http://localhost:2026**.
|
|
|
|
### Environment variables
|
|
|
|
Create a `.env` file in the repo root for secrets and runtime configuration:
|
|
|
|
```bash
|
|
# .env
|
|
OPENAI_API_KEY=sk-...
|
|
DEER_FLOW_ROOT=/absolute/path/to/deer-flow
|
|
BETTER_AUTH_SECRET=your-secret-here-min-32-chars
|
|
```
|
|
|
|
The `docker-compose*.yaml` files include an `env_file: ../.env` directive that loads this automatically.
|
|
|
|
<Callout type="warning">
|
|
Always set <code>BETTER_AUTH_SECRET</code> to a strong random string before
|
|
deploying. Without it, the frontend build uses a default that is publicly
|
|
known.
|
|
</Callout>
|
|
|
|
### Data persistence
|
|
|
|
Thread data is stored in `backend/.deer-flow/threads/`. In Docker deployments, this directory is bind-mounted into the langgraph container.
|
|
|
|
To avoid data loss when containers are recreated:
|
|
|
|
1. Set `DEER_FLOW_ROOT` to the absolute repo root path (or a stable host path).
|
|
2. Verify the `threads/` and `skills/` directories are mounted correctly.
|
|
|
|
For production, use a named volume or a Persistent Volume Claim (PVC) instead of a host bind-mount.
|
|
|
|
## Production deployment considerations
|
|
|
|
### Sandbox mode selection
|
|
|
|
| Sandbox | Use case |
|
|
|---|---|
|
|
| `LocalSandboxProvider` | Single-user, trusted local workflows |
|
|
| `AioSandboxProvider` (Docker) | Multi-user, moderate isolation requirement |
|
|
| `AioSandboxProvider` + K8s Provisioner | Production, strong isolation, multi-user |
|
|
|
|
For any deployment with more than one concurrent user, use a container-based sandbox to prevent users from interfering with each other's execution environments.
|
|
|
|
### K8s Provisioner setup
|
|
|
|
The provisioner manages sandbox Pods in a Kubernetes cluster. It is included in `docker/docker-compose-dev.yaml`.
|
|
|
|
<Steps>
|
|
|
|
#### Configure the provisioner
|
|
|
|
Set required environment variables in your `.env` or compose override:
|
|
|
|
```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
|
|
```
|
|
|
|
#### Configure the sandbox provider
|
|
|
|
```yaml
|
|
# config.yaml
|
|
sandbox:
|
|
use: deerflow.community.aio_sandbox:AioSandboxProvider
|
|
provisioner_url: http://provisioner:8002
|
|
```
|
|
|
|
#### Configure data persistence
|
|
|
|
For production, use PVCs instead of hostPath volumes:
|
|
|
|
```bash
|
|
# In .env or compose environment
|
|
USERDATA_PVC_NAME=deer-flow-userdata-pvc
|
|
SKILLS_PVC_NAME=deer-flow-skills-pvc
|
|
```
|
|
|
|
When `USERDATA_PVC_NAME` is set, the provisioner automatically uses subPath (`threads/{thread_id}/user-data`) so each thread gets its own directory in the PVC.
|
|
|
|
</Steps>
|
|
|
|
### nginx configuration
|
|
|
|
nginx routes all traffic. Key environment variables that control routing:
|
|
|
|
| Variable | Default | Description |
|
|
|---|---|---|
|
|
| `LANGGRAPH_UPSTREAM` | `langgraph:2024` | LangGraph service address |
|
|
| `LANGGRAPH_REWRITE` | `/` | URL rewrite prefix for LangGraph routes |
|
|
|
|
These are set in the Docker Compose environment and processed by `envsubst` at container startup.
|
|
|
|
### Authentication
|
|
|
|
DeerFlow App uses [Better Auth](https://www.better-auth.com/) for session management. In production:
|
|
|
|
1. Set `BETTER_AUTH_SECRET` to a strong random string (minimum 32 characters).
|
|
2. Set `BETTER_AUTH_URL` to your public-facing URL (e.g., `https://your-domain.com`).
|
|
|
|
```bash
|
|
# Generate a secret
|
|
openssl rand -base64 32
|
|
```
|
|
|
|
### Resource recommendations
|
|
|
|
| Service | Minimum | Recommended |
|
|
|---|---|---|
|
|
| LangGraph (agent runtime) | 2 vCPU, 4 GB RAM | 4 vCPU, 8 GB RAM |
|
|
| Gateway | 0.5 vCPU, 512 MB | 1 vCPU, 1 GB |
|
|
| Frontend | 0.5 vCPU, 512 MB | 1 vCPU, 1 GB |
|
|
| Sandbox container (per session) | 1 vCPU, 1 GB | 2 vCPU, 2 GB |
|
|
|
|
## Deployment verification
|
|
|
|
After starting, verify the deployment:
|
|
|
|
```bash
|
|
# Check Gateway health
|
|
curl http://localhost:8001/health
|
|
|
|
# Check LangGraph health
|
|
curl http://localhost:2024/ok
|
|
|
|
# List configured models (through nginx)
|
|
curl http://localhost:2026/api/models
|
|
```
|
|
|
|
A working deployment returns a `200` response from each endpoint. The `/api/models` call returns the list of models from your `config.yaml`.
|
|
|
|
<Cards num={2}>
|
|
<Cards.Card title="Configuration" href="/docs/application/configuration" />
|
|
<Cards.Card title="Operations & Troubleshooting" href="/docs/application/operations-and-troubleshooting" />
|
|
</Cards>
|