---
week: 6
lesson: 6.1
title: 部署方式对比
duration: 30 分钟
---

# 6.1 部署方式对比

> **周次**: 第六周 | **课时**: 6.1 | **时长**: 30 分钟

## 学习目标

- 了解四种主流部署方式及其适用场景
- 能够根据项目特点选择最合适的部署方案
- 掌握 Docker 容器化部署的基本概念和 Dockerfile 编写
- 建立部署决策的思维框架

---

## 一、四种部署方式总览

开发完一个 AI Agent 应用后，需要把它部署到生产环境让用户访问。常见的部署方式有四种：

| 部署方式 | 适用阶段 | 成本 | 复杂度 |
|---------|---------|------|--------|
| 本地运行 | 开发/演示 | 几乎为零 | 最低 |
| Docker 容器 | 开发/测试/小型生产 | 低 | 中等 |
| 云服务器 VPS | 中小型生产 | 中等 | 中高 |
| Serverless 平台 | 快速上线/小型项目 | 低-中 | 低-中 |

---

## 二、方式一：本地运行（Local Run）

### 什么是本地运行

直接在开发机器上启动应用，通过 `localhost` 或局域网 IP 访问。

### 典型操作

```bash
# Python FastAPI 项目
cd my-agent-project
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000

# 或者用 Gradio
python app.py  # 启动后访问 http://localhost:7860
```

### 优点

- **零成本**：不需要额外服务器
- **最快速**：改完代码立即重启即可看到效果
- **调试方便**：直接看终端日志，用 IDE 断点调试
- **无依赖**：不需要 Docker、云平台等额外工具

### 缺点

- **无法公网访问**：除非用 ngrok / frp 做内网穿透
- **机器关机即下线**：不适合生产环境
- **性能受限**：受限于个人电脑配置
- **环境不可复现**：换一台机器可能需要重新配置

### 成本估算

| 项目 | 费用 |
|------|------|
| 电费 | 约 0.5 元/小时（台式机） |
| 网络 | 已有宽带，额外 0 元 |
| 内网穿透工具 | ngrok 免费版可用，付费约 $7/月 |

### 最佳使用场景

- 开发调试阶段
- 给同事/导师做本地演示
- 个人实验性项目

---

## 三、方式二：Docker 容器化部署

### 什么是 Docker

Docker 把你的应用和它的运行环境（Python 版本、依赖包、配置文件）打包成一个**镜像（Image）**。这个镜像在任何安装了 Docker 的机器上都能以完全相同的方式运行。

### Docker 核心概念

```
Dockerfile（构建指令）
    ↓ docker build
Docker Image（镜像，只读模板）
    ↓ docker run
Docker Container（容器，运行中的实例）
```

### 优点

- **环境一致**：开发、测试、生产使用同一个镜像，避免"我本地是好的"问题
- **可移植性强**：一台机器构建，到处运行
- **隔离性好**：容器之间互不干扰
- **易于编排**：配合 Docker Compose 可以一键启动多个服务（Agent + 数据库 + Redis）

### 缺点

- **学习曲线**：需要理解 Docker 概念和命令
- **额外开销**：Docker 守护进程占用少量资源
- **Windows/macOS 上性能略低**：通过虚拟机运行，不如 Linux 原生

### 成本估算

| 项目 | 费用 |
|------|------|
| Docker 引擎 | 免费（Docker Desktop 个人免费） |
| 镜像存储 | 本地磁盘，免费 |
| 镜像仓库 | Docker Hub 免费（公开镜像） |

### Python Agent 项目的 Dockerfile 示例

```dockerfile
# ===== 基础镜像 =====
FROM python:3.11-slim

# ===== 设置工作目录 =====
WORKDIR /app

# ===== 设置环境变量 =====
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1

# ===== 安装系统依赖 =====
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    && rm -rf /var/lib/apt/lists/*

# ===== 复制依赖文件并安装 =====
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# ===== 复制项目代码 =====
COPY . .

# ===== 暴露端口 =====
EXPOSE 8000

# ===== 启动命令 =====
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```

### 对应的 docker-compose.yml

```yaml
version: '3.8'

services:
  agent-app:
    build: .
    container_name: ai-agent
    ports:
      - "8000:8000"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - DATABASE_URL=postgresql://user:pass@db:5432/agentdb
    depends_on:
      - db
    restart: unless-stopped
    networks:
      - agent-net

  db:
    image: postgres:15-alpine
    container_name: agent-db
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=agentdb
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - agent-net

volumes:
  pgdata:

networks:
  agent-net:
    driver: bridge
```

### 构建和运行

```bash
# 构建镜像
docker build -t my-agent .

# 运行容器
docker run -p 8000:8000 my-agent

# 或者用 docker-compose 一键启动
docker compose up -d

# 查看日志
docker compose logs -f agent-app

# 停止服务
docker compose down
```

### 最佳使用场景

- 需要保证环境一致性的团队项目
- 应用依赖较多（数据库、缓存、消息队列）
- 准备迁移到云服务器或 K8s 的前置步骤

---

## 四、方式三：云服务器（VPS）

### 什么是 VPS

Virtual Private Server（虚拟专用服务器），你在云服务商那里租用一台远程 Linux 服务器，拥有完整的 root 权限。

### 国内主流云服务商

| 服务商 | 入门配置 | 价格（约） | 特点 |
|--------|---------|-----------|------|
| 阿里云 ECS | 2C2G 40GB | ¥99/年（新用户） | 生态完善，文档丰富 |
| 腾讯云 CVM | 2C2G 50GB | ¥88/年（新用户） | 性价比高 |
| 华为云 ECS | 2C4G 40GB | ¥128/年（新用户） | 国内节点多 |
| 宝塔面板 | 免费面板 | 0 元（面板免费） | 可视化管理，适合新手 |

### 优点

- **公网可达**：绑定公网 IP，任何人通过域名/IP 即可访问
- **完全控制**：root 权限，想装什么装什么
- **稳定可靠**：7x24 小时运行，SLA 通常 99.9%+
- **可扩展**：随时升级 CPU/内存/带宽

### 缺点

- **需要运维知识**：Linux 命令、安全配置、防火墙
- **成本较高**：长期运行有持续费用
- **需自己维护**：系统更新、安全补丁都需要手动处理

### 成本估算（推荐配置：2C4G）

| 项目 | 月费用 |
|------|--------|
| 云服务器（2C4G） | ¥100-200/月 |
| 域名 | ¥50-80/年 |
| SSL 证书 | 0 元（Let's Encrypt 免费） |
| **合计** | **约 ¥100-200/月** |

### 最佳使用场景

- 正式生产环境
- 需要自定义配置的应用
- 预计有稳定用户量
- 需要国内访问速度（选国内节点）

---

## 五、方式四：Serverless 平台

### 什么是 Serverless

你不需要管理服务器，只需要上传代码，平台自动处理部署、扩缩容、负载均衡。按实际使用量计费。

### 主流平台

| 平台 | 支持语言 | 免费额度 | 特点 |
|------|---------|---------|------|
| Render.com | Python/Node/Go/Docker | 750 小时/月 | 简单好用，自动 HTTPS |
| Railway.app | 全语言/Docker | $5 额度/月 | 一键部署，集成数据库 |
| Vercel | Node/Python/Go | 免费额度充足 | 前端+Serverless 最佳 |
| Fly.io | Docker | 免费额度有限 | 全球部署，低延迟 |
| Zeabur | 全语言/Docker | 免费额度 | 亚洲友好，中文文档 |

### 优点

- **极简部署**：push 代码到 GitHub 自动部署
- **自动 HTTPS**：平台免费配 SSL 证书
- **自动扩缩容**：流量大时自动扩容，流量小时缩容
- **免费额度**：小项目可能完全免费
- **零运维**：不需要管服务器、系统更新

### 缺点

- **冷启动延迟**：无请求时实例休眠，首次请求慢 2-10 秒
- **功能限制**：长时间运行的 Agent 可能被超时杀掉
- **成本控制**：流量大时费用可能超过 VPS
- **调试困难**：日志不如本地方便
- **国内访问**：服务器多在海外，国内访问较慢

### 成本估算

| 阶段 | 月费用 |
|------|--------|
| 测试/个人使用 | ¥0（免费额度） |
| 小型项目（日均 1000 请求） | ¥20-50/月 |
| 中型项目（日均 10000 请求） | ¥100-300/月 |

### Render.com 部署示例

```yaml
# render.yaml（项目根目录）
services:
  - type: web
    name: my-ai-agent
    env: python
    buildCommand: pip install -r requirements.txt
    startCommand: uvicorn main:app --host 0.0.0.0 --port $PORT
    envVars:
      - key: PYTHON_VERSION
        value: 3.11.0
      - key: OPENAI_API_KEY
        sync: false  # 在控制台手动填写
```

### 最佳使用场景

- 快速原型验证 / MVP
- 个人项目，不想运维
- 海外用户为主的应用
- 学生项目展示

---

## 六、部署方式决策树

遇到部署选择时，按照下面的决策树来选：

```
你的项目部署到哪里？
│
├── Q1: 只是开发调试或本地演示？
│   └── 是 → 本地运行 ✅
│   └── 否 → 继续
│
├── Q2: 需要公网可访问吗？
│   └── 否 → 本地运行 + Docker ✅
│   └── 是 → 继续
│
├── Q3: 用户主要在国内吗？
│   └── 是 → 云服务器 VPS ✅（阿里云/腾讯云）
│   └── 否 → 继续
│
├── Q4: 项目规模小、想快速上线？
│   └── 是 → Serverless ✅（Render/Railway）
│   └── 否 → 继续
│
└── Q5: 需要完全控制服务器环境？
    └── 是 → 云服务器 VPS ✅
    └── 否 → Serverless ✅
```

### 快速对照表

| 场景 | 推荐方式 |
|------|---------|
| 开发调试 | 本地运行 |
| 团队协保环境一致 | Docker |
| 课程项目展示 | Serverless（最快） |
| 国内正式产品 | 云服务器 VPS |
| 海外快速验证 | Serverless |
| 长期稳定运行 | 云服务器 + Docker |
| 毕业设计答辩 | Docker + 云服务器 |

---

## 七、动手练习

### 练习 1：为 Agent 项目编写 Dockerfile（10 分钟）

假设你有一个基于 FastAPI + LangChain 的客服 Agent 项目，结构如下：

```
my-customer-agent/
├── main.py
├── requirements.txt
├── agents/
│   ├── __init__.py
│   └── customer_agent.py
└── config/
    └── settings.py
```

**任务**：参考上面的模板，编写适合这个项目的 Dockerfile。

### 练习 2：填写部署决策表（5 分钟）

对于你的期末项目，回答以下问题：

| 问题 | 你的回答 |
|------|---------|
| 用户主要在国内还是海外？ | |
| 预期日活跃用户数？ | |
| 是否需要数据库等依赖服务？ | |
| 预算范围？ | |
| 答辩时需要公网访问吗？ | |
| **推荐部署方式** | |

---

## 八、部署检查清单

在正式部署前，逐项检查：

- [ ] 应用能通过 `localhost` 正常运行
- [ ] 所有依赖已写入 `requirements.txt`
- [ ] 敏感信息（API Key）使用环境变量，未硬编码
- [ ] Dockerfile 能成功构建镜像
- [ ] `docker compose up` 能完整启动
- [ ] 健康检查端点已配置（如 `/health`）
- [ ] 日志输出到 stdout（Docker 最佳实践）
- [ ] 端口映射正确
- [ ] 数据库连接使用服务名而非 localhost

---

## 总结

本节课对比了四种部署方式：

1. **本地运行**：零成本零运维，但仅限开发阶段
2. **Docker 容器**：环境一致、可移植，是部署的基础设施层
3. **云服务器 VPS**：完全控制、稳定可靠，适合正式生产
4. **Serverless**：极简部署、自动运维，适合快速上线和小型项目

选择部署方式的核心原则：**够用就好，不要过度设计**。课程项目用 Serverless 最快上手，正式产品用 VPS + Docker 最稳妥。下一节课我们将实战部署到云服务器。
