# Docker Compose 部署指南

本文档介绍如何使用 Docker Compose 部署 MaaS-Base 平台。Docker Compose 方式适合单机部署、开发测试和小团队使用。

## 前置要求

| 要求 | 说明 |
|------|------|
| 操作系统 | Linux（推荐 Ubuntu 20.04+ / Debian 12+） |
| Docker | 20.10+，已安装 [Docker Compose](https://docs.docker.com/compose/install/) |
| CPU 节点 | 至少 4 核 CPU，8GB 内存（仅 Server 节点） |
| 磁盘空间 | 至少 20GB 可用空间 |

> **注意：** Server 可运行在无 GPU 的 CPU 节点上。GPU 节点用于部署 Worker，参见 [Worker 节点部署指南](../deployment/worker.md)。

## 部署模式

项目提供两套 Docker Compose 配置，可根据需求选择：

| 配置文件 | 包含组件 | 适用场景 |
|----------|---------|---------|
| `docker-compose.server.yaml` | PostgreSQL + Server | 最小部署，已有外部监控体系 |
| `docker-compose.external-observability.yaml` | PostgreSQL + Server + Prometheus + Grafana | 完整部署，内置可观测性 |

---

## 模式一：最小部署（PostgreSQL + Server）

### 1. 克隆项目

```bash
git clone https://github.com/your-org/maas-base.git
cd maas-base/docker-compose
```

### 2. 启动服务

```bash
docker compose -f docker-compose.server.yaml up -d
```

该命令会启动以下两个容器：

- **`maas-base-db`** — PostgreSQL 16 数据库
- **`maas-base-server`** — MaaS-Base Server（从 `pack/Dockerfile` 自动构建镜像）

### 3. 验证部署

```bash
# 查看容器状态
docker compose -f docker-compose.server.yaml ps

# 查看 Server 日志
docker compose -f docker-compose.server.yaml logs -f maas-base-server
```

### 4. 获取初始管理员密码

```bash
docker exec maas-base-server cat /var/lib/maas-base/initial_admin_password
```

### 5. 访问 UI

在浏览器中打开 `http://<服务器IP>`，使用用户名 `admin` 和上一步获取的密码登录。

---

## 模式二：完整部署（含 Prometheus + Grafana）

### 1. 克隆项目

```bash
git clone https://github.com/your-org/maas-base.git
cd maas-base/docker-compose
```

### 2. 启动服务

```bash
GPUSTACK_VERSION=$(git -C .. rev-parse --short HEAD) docker compose -f docker-compose.external-observability.yaml up -d --build
```

该命令会启动以下四个容器：

- **`maas-base-db`** — PostgreSQL 16 数据库
- **`maas-base-server`** — MaaS-Base Server
- **`maas-base-prometheus`** — Prometheus 指标采集
- **`maas-base-grafana`** — Grafana 监控面板

### 3. 访问服务

| 服务 | 地址 | 默认凭据 |
|------|------|---------|
| MaaS-Base UI | `http://<服务器IP>:80` | admin / 初始密码 |
| Prometheus | `http://<服务器IP>:9090` | 无 |
| Grafana | `http://<服务器IP>:3100` | admin / grafana |

### 4. 获取初始管理员密码

```bash
docker exec maas-base-server cat /var/lib/maas-base/initial_admin_password
```

---

## 环境变量配置

所有环境变量均可通过 `.env` 文件或 `--env-file` 参数传入。

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `POSTGRES_PASSWORD` | `gpustack` | PostgreSQL 数据库密码 |
| `GPUSTACK_GRAFANA_URL` | 空 | Grafana 外部访问地址（留空则自动使用相对路径 `/grafana`） |
| `IMAGE_REGISTRY` | `docker.io` | 镜像仓库地址（可用于替换为国内镜像源） |
| `PROMETHEUS_IMAGE_NAMESPACE` | `prom` | Prometheus 镜像命名空间 |
| `PROMETHEUS_TAG` | `latest` | Prometheus 镜像标签 |
| `GRAFANA_IMAGE_NAMESPACE` | `grafana` | Grafana 镜像命名空间 |
| `GRAFANA_TAG` | `latest` | Grafana 镜像标签 |
| `GRAFANA_PASSWORD` | `grafana` | Grafana 管理员密码 |

### 示例：使用自定义密码

创建 `.env` 文件：

```env
POSTGRES_PASSWORD=my_secure_db_password_123
GRAFANA_PASSWORD=my_secure_grafana_password
```

然后启动：

```bash
docker compose -f docker-compose.external-observability.yaml --env-file .env up -d
```

---

## 数据持久化

Docker Compose 使用命名卷（named volumes）进行数据持久化：

| 卷名 | 用途 | 挂载路径 |
|------|------|---------|
| `postgres-data` | PostgreSQL 数据 | `/var/lib/postgresql/data` |
| `prom_data` | Prometheus 指标数据 | `/prometheus` |
| `gpustack-data` | Server 数据（含日志、配置、嵌入式数据库备份） | `/var/lib/gpustack` |

如需将数据映射到宿主机目录，可修改 `volumes` 配置：

```yaml
volumes:
  - /data/postgres:/var/lib/postgresql/data
  - /data/prometheus:/prometheus
  - /data/gpustack:/var/lib/gpustack
```

---

## 端口说明

| 端口 | 组件 | 用途 |
|------|------|------|
| `80` | Server API | REST API、Web UI、模型推理接口 |
| `10161` | Server Metrics | Prometheus 抓取指标 |
| `9090` | Prometheus | Prometheus Web UI |
| `3100` | Grafana | Grafana 监控面板 |

> **安全建议：** 生产环境中建议仅开放 `80` 端口，其他端口通过反向代理或内网访问。

---

## 外部数据库

如果已有 PostgreSQL 或 MySQL，可以不部署内嵌数据库，通过修改 `GPUSTACK_DATABASE_URL` 环境变量连接：

```yaml
environment:
  GPUSTACK_DATABASE_URL: postgresql://user:password@host:5432/gpustack
```

此时可从 `docker-compose.*.yaml` 中移除 `postgres` 服务及其 `depends_on` 依赖。

---

## 停止与清理

```bash
# 停止服务（保留数据卷）
docker compose -f docker-compose.server.yaml down

# 停止服务并删除数据卷（数据将丢失）
docker compose -f docker-compose.server.yaml down -v

# 查看日志
docker compose -f docker-compose.server.yaml logs -f

# 仅查看 Server 日志
docker compose -f docker-compose.server.yaml logs -f maas-base-server
```

---

## 更新镜像

```bash
# 拉取最新代码
git pull

# 重新构建并启动
docker compose -f docker-compose.external-observability.yaml up -d --build
```

---

## 下一步

- 部署 Worker 节点以提供 GPU 推理能力 → [Worker 节点部署指南](../deployment/worker.md)
- 使用 Kubernetes 进行大规模部署 → [Kubernetes (Helm) 部署指南](../deployment/kubernetes.md)
