# Docker部署

## 环境要求

| 组件 | 版本 |
|------|------|
| Docker | 24+ |
| Docker Compose | 2.0+ |

## 快速部署

### 1. 克隆项目

```bash
git clone http://8.153.107.96/fischer/geo.git
cd geo
```

### 2. 配置环境变量

```bash
cp .env.example .env
# 编辑.env配置必要参数
```

> **说明**：Docker Compose 默认读取项目根目录下的 `.env` 文件加载环境变量。所有配置项均可通过 `.env` 文件统一管理，无需在 `docker-compose.yml` 中硬编码。

### 3. 启动服务

> **注意**：开发模式使用 `uvicorn --reload` 启动，支持热重载；生产环境必须移除 `--reload` 参数，使用 `uvicorn app.main:app --host 0.0.0.0 --port 8000` 启动。

```bash
# 开发环境
docker-compose up -d

# 生产环境
docker-compose -f docker-compose.prod.yml up -d
```

### 4. 验证服务

```bash
# 检查容器状态
docker-compose ps

# 查看日志
docker-compose logs -f
```

## 容器说明

| 容器名 | 说明 | 端口 |
|--------|------|------|
| geo-frontend | Next.js前端 | 3000 |
| geo-backend | FastAPI后端 | 8000 |
| geo-db | PostgreSQL数据库 | 5432 |
| geo-redis | Redis缓存 | 6379 |
| geo-worker | Celery worker | - |
| geo-nginx | 反向代理 | 80/443 |

## 数据持久化

通过Volume挂载确保容器重建后数据不丢失：

```yaml
volumes:
  postgres_data:/var/lib/postgresql/data
  redis_data:/data
  ./uploads:/app/uploads
  ./logs:/app/logs
  ./backups:/app/backups
```

| 挂载路径 | 说明 |
|----------|------|
| `postgres_data` | PostgreSQL数据目录 |
| `redis_data` | Redis持久化数据 |
| `./uploads` | 用户上传文件 |
| `./logs` | 应用日志 |
| `./backups` | 数据库备份 |

## 健康检查

```bash
# 前端健康检查
curl http://localhost:3000/health

# 后端健康检查
curl http://localhost:8000/health

# 数据库健康检查
docker-compose exec db pg_isready
```

## 停止服务

```bash
# 停止服务（保留数据）
docker-compose stop

# 停止并删除容器
docker-compose down

# 停止并删除数据卷（危险！）
docker-compose down -v
```

## 生产环境优化

### 资源限制

```yaml
services:
  backend:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2G
        reservations:
          cpus: '0.5'
          memory: 512M
```

### 日志管理

```yaml
services:
  backend:
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
```

### 定期备份

```bash
# 备份数据库
docker-compose exec -T db pg_dump -U postgres geo > backup.sql

# 恢复数据库
cat backup.sql | docker-compose exec -T db psql -U postgres geo
```
