imetting/design/deployment.md

5.6 KiB
Raw Permalink Blame History

iMeeting 部署文档

本文档说明当前保留的两种 Docker 部署方式:

  • 全量部署:启动 frontendbackendmysqlredis,适合单机完整部署。
  • 半部署:只启动 frontendbackendMySQL 和 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 / ffprobeDocker 部署时宿主机不需要额外安装音频预处理依赖。

全量部署:带中间件

全量部署会启动以下服务:

  • mysql
  • redis
  • backend
  • frontend

全量部署的 MySQL 初始化 SQL 位于 scripts/sql/,并通过 docker-compose.yml 挂载到 MySQL 容器的 /docker-entrypoint-initdb.d。MySQL 官方镜像只会在数据库目录为空、首次初始化时执行该目录下的 .sql 文件;已有 data/mysql/ 数据时,修改 SQL 文件不会自动重放。

操作步骤:

cp .env.example .env
vim .env
./scripts/deploy-full.sh

建议至少修改以下配置:

MYSQL_ROOT_PASSWORD=change_this_password
MYSQL_PASSWORD=change_this_password
REDIS_PASSWORD=change_this_password
BASE_URL=https://your-domain.com

全量部署的数据会写入根目录 data/

data/
├── mysql/
├── redis/
├── uploads/
└── logs/
    ├── backend/
    └── frontend/

停止全量部署:

./scripts/stop-full.sh

该脚本会交互式提供三种操作:

  • 仅停止服务并保留容器和数据
  • 停止并删除容器,保留数据目录
  • 停止并删除 Compose 数据卷

注意:项目当前使用绑定目录 ./data/mysql./data/redis 持久化数据。删除 Compose 数据卷不会自动删除这些绑定目录;如需彻底清理数据,需要额外确认并删除 data/ 下对应目录。

半部署:不含中间件

半部署只启动以下服务:

  • backend
  • frontend

MySQL 和 Redis 必须提前准备好,并在根目录 .env 中配置连接信息。

操作步骤:

cp .env.example .env
vim .env
./scripts/deploy-app-only.sh

重点配置:

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_HOSTDB_PORTDB_USERDB_PASSWORDDB_NAME,则优先使用 DB_*

停止半部署:

./scripts/stop-app-only.sh

该脚本只停止或删除 backend / frontend 容器,不会操作外部 MySQL 和 Redis。

访问地址

默认访问地址:

  • Webhttp://localhost
  • API 文档:http://localhost/docs
  • API 代理路径:http://localhost/api/

如果使用服务器 IP 或域名访问,请将 .env 中的 BASE_URL 设置为最终外部访问地址。云端语音转录需要回调或拉取音频时,BASE_URL 不能是 localhost127.0.0.1、容器名或不可从外部访问的内网地址。

常用命令

# 查看服务状态
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

示例:

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;
    }
}

验证与排查

部署后检查:

docker compose ps
docker compose logs -f backend frontend
curl -f http://localhost/docs

全量部署时,mysqlredisbackendfrontend 应处于 healthy 或 running 状态。半部署时,只需要确认 backendfrontend 正常,外部 MySQL / Redis 的连通性由 .env 配置决定。

常见问题:

  • .env 不存在:脚本会从 .env.example 复制一份,请修改后继续。
  • 半部署缺少外部中间件配置:脚本会提示缺失的变量名。
  • BASE_URL 配置为本地地址:本地访问可用,但云端语音服务可能无法拉取音频。
  • 服务启动超时:先看 docker compose ps,再看 docker compose logs -f backend frontend