Files
AIRouter/README-DOCKER.md
2025-11-10 22:23:42 +08:00

699 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI Router Docker 部署指南
本文档提供了 AI Router 项目的 Docker 容器化部署完整指南。
## 📋 目录
- [系统架构](#系统架构)
- [前置要求](#前置要求)
- [快速开始](#快速开始)
- [详细配置](#详细配置)
- [构建和运行](#构建和运行)
- [管理和维护](#管理和维护)
- [故障排查](#故障排查)
- [性能优化](#性能优化)
- [安全建议](#安全建议)
## 🏗️ 系统架构
本项目使用 Docker Compose 编排两个主要服务:
```
┌─────────────────────────────────────────┐
│ Docker Host │
│ │
│ ┌────────────────────────────────────┐ │
│ │ Frontend Container (Nginx) │ │
│ │ 端口: 3000 → 80 │ │
│ │ - React 应用 │ │
│ │ - Nginx 静态文件服务 │ │
│ │ - API 请求代理 │ │
│ └────────────────┬───────────────────┘ │
│ │ │
│ │ API 代理 │
│ ↓ │
│ ┌────────────────────────────────────┐ │
│ │ Backend Container (Go) │ │
│ │ 端口: 8080 │ │
│ │ - Go API 服务 │ │
│ │ - SQLite 数据库 │ │
│ └────────────────┬───────────────────┘ │
│ │ │
│ ↓ │
│ ┌────────────────────────────────────┐ │
│ │ Volume: backend-data │ │
│ │ 持久化数据库文件 │ │
│ └────────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
### 容器说明
#### 前端容器 (ai-router-frontend)
- **基础镜像**: nginx:1.27-alpine
- **构建方式**: 多阶段构建Node.js 构建 + Nginx 运行)
- **端口映射**: 3000:80
- **功能**:
- 托管 React 静态文件
- 支持 React Router 的 HTML5 History API
-`/api/*` 请求代理到后端服务
- 提供健康检查端点 `/health`
#### 后端容器 (ai-router-backend)
- **基础镜像**: debian:bookworm-slim
- **构建方式**: 多阶段构建Go 编译 + 精简运行环境)
- **端口映射**: 8080:8080
- **功能**:
- 提供 RESTful API 服务
- 管理 SQLite 数据库
- 处理 AI 模型路由逻辑
- 提供健康检查端点
## 📦 前置要求
### 必需软件
- **Docker**: 版本 20.10.0 或更高
- **Docker Compose**: 版本 2.0.0 或更高
### 检查安装
```bash
# 检查 Docker 版本
docker --version
# 检查 Docker Compose 版本
docker compose version
# 验证 Docker 运行状态
docker info
```
### 系统要求
- **最低配置**:
- CPU: 2 核
- 内存: 2GB
- 磁盘空间: 5GB
- **推荐配置**:
- CPU: 4 核或更多
- 内存: 4GB 或更多
- 磁盘空间: 10GB 或更多
## 🚀 快速开始
### 1. 克隆项目(如果还没有)
```bash
git clone <repository-url>
cd ai_router
```
### 2. 配置环境变量(可选)
```bash
# 复制环境变量示例文件
cp .env.example .env
# 根据需要编辑 .env 文件
# 默认配置已经可以直接使用
```
### 3. 构建并启动服务
```bash
# 构建镜像并启动所有服务
docker compose up --build -d
```
### 4. 验证部署
```bash
# 查看容器运行状态
docker compose ps
# 查看服务日志
docker compose logs -f
# 检查前端服务
curl http://localhost:3000/health
# 检查后端服务
curl http://localhost:8080/api/providers
```
### 5. 访问应用
- **前端界面**: http://localhost:3000
- **后端 API**: http://localhost:8080/api
## ⚙️ 详细配置
### 环境变量配置
项目支持通过环境变量进行配置。创建 `.env` 文件或在 `docker-compose.yml` 中直接设置。
#### 核心配置
```bash
# 数据库路径
DB_PATH=/app/data/gateway.db
# 服务端口
BACKEND_PORT=8080
FRONTEND_PORT=3000
# 日志级别
LOG_LEVEL=info
# 项目名称
COMPOSE_PROJECT_NAME=ai-router
```
#### 修改端口映射
如果需要修改对外暴露的端口,编辑 `docker-compose.yml`:
```yaml
services:
backend:
ports:
- "自定义端口:8080" # 例如 "9000:8080"
frontend:
ports:
- "自定义端口:80" # 例如 "8080:80"
```
### 数据持久化
后端数据库文件通过 Docker Volume 持久化:
```bash
# 查看数据卷
docker volume ls | grep ai-router
# 查看数据卷详情
docker volume inspect ai-router-backend-data
# 备份数据卷
docker run --rm -v ai-router-backend-data:/data -v $(pwd):/backup alpine tar czf /backup/backup-$(date +%Y%m%d-%H%M%S).tar.gz -C /data .
# 恢复数据卷
docker run --rm -v ai-router-backend-data:/data -v $(pwd):/backup alpine tar xzf /backup/backup-YYYYMMDD-HHMMSS.tar.gz -C /data
```
## 🔧 构建和运行
### 开发环境
```bash
# 启动服务(前台运行,可以看到实时日志)
docker compose up
# 启动服务(后台运行)
docker compose up -d
# 仅启动特定服务
docker compose up backend
docker compose up frontend
# 重新构建并启动
docker compose up --build
```
### 生产环境
```bash
# 构建生产镜像
docker compose build --no-cache
# 启动服务
docker compose up -d
# 查看服务状态
docker compose ps
# 查看资源使用情况
docker stats
```
### 单独构建镜像
```bash
# 构建后端镜像
cd backend
docker build -t ai-router-backend:latest .
# 构建前端镜像
cd frontend
docker build -t ai-router-frontend:latest .
```
## 🛠️ 管理和维护
### 查看日志
```bash
# 查看所有服务日志
docker compose logs
# 实时跟踪日志
docker compose logs -f
# 查看特定服务的日志
docker compose logs backend
docker compose logs frontend
# 查看最近 100 行日志
docker compose logs --tail=100
# 查看带时间戳的日志
docker compose logs -t
```
### 重启服务
```bash
# 重启所有服务
docker compose restart
# 重启特定服务
docker compose restart backend
docker compose restart frontend
# 优雅停止后重启
docker compose down && docker compose up -d
```
### 更新服务
```bash
# 拉取最新代码
git pull
# 重新构建并启动
docker compose up --build -d
# 查看更新后的状态
docker compose ps
```
### 停止和删除
```bash
# 停止所有服务
docker compose stop
# 停止并删除容器(保留数据卷)
docker compose down
# 停止并删除容器和数据卷(谨慎使用!)
docker compose down -v
# 停止并删除所有内容(包括镜像)
docker compose down -v --rmi all
```
### 清理系统
```bash
# 删除未使用的容器
docker container prune
# 删除未使用的镜像
docker image prune
# 删除未使用的数据卷
docker volume prune
# 清理所有未使用的资源
docker system prune -a
```
## 🔍 故障排查
### 常见问题
#### 1. 容器无法启动
```bash
# 检查容器状态
docker compose ps
# 查看详细错误信息
docker compose logs
# 检查端口占用
netstat -an | grep 3000
netstat -an | grep 8080
# Windows 系统
netstat -ano | findstr "3000"
netstat -ano | findstr "8080"
```
#### 2. 前端无法连接后端
```bash
# 检查网络连接
docker compose exec frontend ping backend
# 检查后端服务是否正常
docker compose exec backend wget -O- http://localhost:8080/api/providers
# 查看 Nginx 配置
docker compose exec frontend cat /etc/nginx/conf.d/default.conf
# 查看 Nginx 错误日志
docker compose logs frontend | grep error
```
#### 3. 数据库问题
```bash
# 进入后端容器
docker compose exec backend sh
# 检查数据库文件
ls -lh /app/data/
# 查看数据库文件权限
ls -l /app/data/gateway.db
# 检查数据库连接
# 在容器内执行应用的健康检查
```
#### 4. 构建失败
```bash
# 清理 Docker 缓存
docker builder prune
# 完全重新构建(不使用缓存)
docker compose build --no-cache
# 检查 Dockerfile 语法
docker compose config
# 查看构建日志
docker compose build --progress=plain
```
#### 5. 性能问题
```bash
# 查看容器资源使用
docker stats
# 查看容器详细信息
docker compose exec backend top
docker compose exec frontend top
# 检查磁盘空间
docker system df
# 查看网络延迟
docker compose exec frontend ping -c 5 backend
```
### 健康检查
```bash
# 前端健康检查
curl -f http://localhost:3000/health || echo "Frontend unhealthy"
# 后端健康检查
curl -f http://localhost:8080/api/providers || echo "Backend unhealthy"
# 查看容器健康状态
docker compose ps
```
### 调试模式
```bash
# 进入容器进行调试
docker compose exec backend sh
docker compose exec frontend sh
# 以 root 用户进入
docker compose exec -u root backend sh
# 运行临时调试容器
docker run -it --rm --network ai-router-network alpine sh
```
## ⚡ 性能优化
### 镜像优化
1. **使用多阶段构建**:已在 Dockerfile 中实现
2. **最小化镜像层**:合并 RUN 命令
3. **使用 .dockerignore**:已配置,排除不必要的文件
### 资源限制
编辑 `docker-compose.yml` 添加资源限制:
```yaml
services:
backend:
deploy:
resources:
limits:
cpus: '2'
memory: 1G
reservations:
cpus: '1'
memory: 512M
frontend:
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
```
### 网络优化
```yaml
networks:
ai-router-network:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 1500
```
### 日志优化
```yaml
services:
backend:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
```
## 🔒 安全建议
### 1. 使用非 root 用户
修改 Dockerfile 添加专用用户:
```dockerfile
# 后端 Dockerfile
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
```
### 2. 网络隔离
```yaml
# 限制容器间通信
networks:
ai-router-network:
internal: true # 仅内部通信
```
### 3. 环境变量安全
- 不要在 `docker-compose.yml` 中硬编码敏感信息
- 使用 `.env` 文件,并将其添加到 `.gitignore`
- 生产环境使用 Docker Secrets
### 4. 定期更新
```bash
# 更新基础镜像
docker compose pull
# 重新构建
docker compose build --pull
# 重启服务
docker compose up -d
```
### 5. 限制容器权限
```yaml
services:
backend:
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
```
## 📊 监控建议
### 使用 Docker Stats
```bash
# 实时监控
docker stats
# 监控特定容器
docker stats ai-router-backend ai-router-frontend
```
### 集成监控工具
推荐使用以下监控工具:
- **Prometheus + Grafana**: 指标收集和可视化
- **ELK Stack**: 日志聚合和分析
- **cAdvisor**: 容器性能监控
### 日志管理
```bash
# 设置日志轮转
# 在 docker-compose.yml 中配置
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
```
## 🌐 生产部署建议
### 1. 使用反向代理
在生产环境中,建议在 Docker 服务前部署 Nginx 或 Traefik 作为反向代理:
```nginx
# 示例 Nginx 配置
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
### 2. 启用 HTTPS
使用 Let's Encrypt 免费证书:
```bash
# 使用 Certbot
certbot --nginx -d your-domain.com
```
### 3. 配置自动重启
```yaml
services:
backend:
restart: unless-stopped
frontend:
restart: unless-stopped
```
### 4. 数据备份策略
```bash
# 创建自动备份脚本
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d-%H%M%S)
docker run --rm -v ai-router-backend-data:/data -v $BACKUP_DIR:/backup alpine tar czf /backup/db-$DATE.tar.gz -C /data .
# 添加到 crontab
0 2 * * * /path/to/backup-script.sh
```
### 5. CI/CD 集成
```yaml
# GitHub Actions 示例
name: Build and Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build images
run: docker compose build
- name: Push images
run: docker compose push
```
## 📝 维护清单
### 每日检查
- [ ] 查看容器运行状态
- [ ] 检查日志是否有错误
- [ ] 监控资源使用情况
### 每周检查
- [ ] 备份数据库
- [ ] 清理未使用的镜像和容器
- [ ] 检查磁盘空间
### 每月检查
- [ ] 更新基础镜像
- [ ] 审查安全更新
- [ ] 性能优化评估
## 🆘 获取帮助
如果遇到问题,可以:
1. 查看日志:`docker compose logs`
2. 检查本文档的故障排查部分
3. 查看 GitHub Issues
4. 联系项目维护者
## 📚 相关资源
- [Docker 官方文档](https://docs.docker.com/)
- [Docker Compose 文档](https://docs.docker.com/compose/)
- [项目 GitHub](https://github.com/your-repo)
- [API 文档](./backend/docs/)
---
**最后更新**: 2025-11-10
**版本**: 1.0.0