imetting/design/deployment.md

200 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# iMeeting 部署文档
本文档说明当前保留的两种 Docker 部署方式:
- 全量部署:启动 `frontend`、`backend`、`mysql`、`redis`,适合单机完整部署。
- 半部署:只启动 `frontend`、`backend`MySQL 和 Redis 使用外部已有服务。
所有脚本统一放在根目录 `scripts/` 下,运行脚本时请在项目根目录执行命令。
## 文件说明
| 文件 | 说明 |
|------|------|
| `docker-compose.yml` | Docker Compose 服务定义 |
| `.env.example` | 根目录环境变量模板 |
| `scripts/deploy-full.sh` | 全量部署脚本,包含 MySQL / Redis |
| `scripts/stop-full.sh` | 全量部署停止脚本 |
| `scripts/deploy-app-only.sh` | 半部署脚本,只启动前后端 |
| `scripts/stop-app-only.sh` | 半部署停止脚本 |
| `scripts/sql/` | 全量部署 MySQL 初始化 SQL |
## 环境要求
- Docker
- Docker Compose v2或兼容的 `docker-compose`
- 服务器开放 `HTTP_PORT` 对应端口,默认 `80`
后端镜像已在 `backend/Dockerfile` 中安装 `ffmpeg` / `ffprobe`Docker 部署时宿主机不需要额外安装音频预处理依赖。
## 全量部署:带中间件
全量部署会启动以下服务:
- `mysql`
- `redis`
- `backend`
- `frontend`
全量部署的 MySQL 初始化 SQL 位于 `scripts/sql/`,并通过 `docker-compose.yml` 挂载到 MySQL 容器的 `/docker-entrypoint-initdb.d`。MySQL 官方镜像只会在数据库目录为空、首次初始化时执行该目录下的 `.sql` 文件;已有 `data/mysql/` 数据时,修改 SQL 文件不会自动重放。
操作步骤:
```bash
cp .env.example .env
vim .env
./scripts/deploy-full.sh
```
建议至少修改以下配置:
```bash
MYSQL_ROOT_PASSWORD=change_this_password
MYSQL_PASSWORD=change_this_password
REDIS_PASSWORD=change_this_password
BASE_URL=https://your-domain.com
```
全量部署的数据会写入根目录 `data/`
```text
data/
├── mysql/
├── redis/
├── uploads/
└── logs/
├── backend/
└── frontend/
```
停止全量部署:
```bash
./scripts/stop-full.sh
```
该脚本会交互式提供三种操作:
- 仅停止服务并保留容器和数据
- 停止并删除容器,保留数据目录
- 停止并删除 Compose 数据卷
注意:项目当前使用绑定目录 `./data/mysql``./data/redis` 持久化数据。删除 Compose 数据卷不会自动删除这些绑定目录;如需彻底清理数据,需要额外确认并删除 `data/` 下对应目录。
## 半部署:不含中间件
半部署只启动以下服务:
- `backend`
- `frontend`
MySQL 和 Redis 必须提前准备好,并在根目录 `.env` 中配置连接信息。
操作步骤:
```bash
cp .env.example .env
vim .env
./scripts/deploy-app-only.sh
```
重点配置:
```bash
MYSQL_HOST=your-mysql-host
MYSQL_PORT=3306
MYSQL_DATABASE=imeeting
MYSQL_USER=imeeting
MYSQL_PASSWORD=your-password
REDIS_HOST=your-redis-host
REDIS_PORT=6379
REDIS_PASSWORD=your-password
REDIS_DB=0
BASE_URL=https://your-domain.com
```
脚本会把 `MYSQL_*` 转换为后端容器使用的 `DB_*` 环境变量。如果 `.env` 中显式配置了 `DB_HOST`、`DB_PORT`、`DB_USER`、`DB_PASSWORD`、`DB_NAME`,则优先使用 `DB_*`
停止半部署:
```bash
./scripts/stop-app-only.sh
```
该脚本只停止或删除 `backend` / `frontend` 容器,不会操作外部 MySQL 和 Redis。
## 访问地址
默认访问地址:
- Web`http://localhost`
- API 文档:`http://localhost/docs`
- API 代理路径:`http://localhost/api/`
如果使用服务器 IP 或域名访问,请将 `.env` 中的 `BASE_URL` 设置为最终外部访问地址。云端语音转录需要回调或拉取音频时,`BASE_URL` 不能是 `localhost`、`127.0.0.1`、容器名或不可从外部访问的内网地址。
## 常用命令
```bash
# 查看服务状态
docker compose ps
# 查看所有服务日志
docker compose logs -f
# 查看前后端日志
docker compose logs -f backend frontend
# 重启服务
docker compose restart
docker compose restart backend
docker compose restart frontend
```
如果当前环境只支持旧版命令,可把 `docker compose` 替换为 `docker-compose`
## HTTPS 和域名
项目容器默认提供 HTTP 服务。如需 HTTPS建议在接入层 Nginx、负载均衡或网关上配置证书再反向代理到 iMeeting 服务器的 `HTTP_PORT`
示例:
```nginx
server {
listen 443 ssl http2;
server_name imeeting.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/imeeting.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/imeeting.yourdomain.com/privkey.pem;
location / {
proxy_pass http://imeeting-server-ip:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
## 验证与排查
部署后检查:
```bash
docker compose ps
docker compose logs -f backend frontend
curl -f http://localhost/docs
```
全量部署时,`mysql`、`redis`、`backend`、`frontend` 应处于 healthy 或 running 状态。半部署时,只需要确认 `backend``frontend` 正常,外部 MySQL / Redis 的连通性由 `.env` 配置决定。
常见问题:
- `.env` 不存在:脚本会从 `.env.example` 复制一份,请修改后继续。
- 半部署缺少外部中间件配置:脚本会提示缺失的变量名。
- `BASE_URL` 配置为本地地址:本地访问可用,但云端语音服务可能无法拉取音频。
- 服务启动超时:先看 `docker compose ps`,再看 `docker compose logs -f backend frontend`