Files
012-kaopeilian/docs/测试环境配置.md
yuliang_guo 3a238f810c fix: 根据角色隐藏无权限的侧边栏菜单
- 学员角色隐藏数据分析、管理者中心、系统管理菜单
- 管理员和管理者保持所有菜单可见

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 12:01:39 +08:00

12 KiB
Raw Blame History

考培练系统 - 环境配置与部署指南

最后更新2026-02-03

一、环境总览

环境 分支 域名 dist 目录 用途
测试环境 test https://kpl.ireborn.com.cn dist-test 功能开发测试
预生产 staging https://aiedu.ireborn.com.cn dist-staging 集成测试/预发布
生产环境 main 各租户域名 dist-prod 正式生产
超级管理后台 - https://admin.kpl.ireborn.com.cn - SaaS管理

二、租户列表

租户代码 名称 域名 前端端口 后端端口
hua 华尔倍丽 https://hua.ireborn.com.cn 3010 8010
yy 杨扬宠物 https://yy.ireborn.com.cn 3011 8011
hl 武汉禾丽 https://hl.ireborn.com.cn 3012 8012
xy 芯颜定制 https://xy.ireborn.com.cn 3013 8013
fw 飞沃 https://fw.ireborn.com.cn 3014 8014
ex 恩喜成都总院 https://ex.ireborn.com.cn 3015 8015
cxw 崔曦文 https://cxw.kpl.ireborn.com.cn 3016 8016
mst 美生堂 https://mst.kpl.ireborn.com.cn 3017 8017

三、CI/CD 部署方式

3.1 开发1环境 (kpl-dev)

# 推送到 test 分支自动部署
git push cicd test

3.2 开发2环境 (主站)

# 推送到 dev2 分支自动部署
git push cicd dev2

3.3 生产环境 (租户)

# 推送到 main 分支,通过 commit message 控制部署范围
git push cicd main

部署所有租户

git commit -m "feat: 新功能上线 [all]"
git push cicd main

部署单个租户

git commit -m "fix: 修复问题 [hua]"
git push cicd main

部署多个租户

git commit -m "feat: 功能更新 [cxw,yy,hl]"
git push cicd main

默认行为

# 不带标签默认部署所有租户
git commit -m "feat: 常规更新"
git push cicd main

四、手动部署命令

4.1 SSH 登录服务器

ssh root@120.79.247.16
# 密码: Rxm88808

4.2 重启单个租户后端

cd /root/aiedu
docker restart cxw-backend

4.3 重建单个租户后端

cd /root/aiedu
docker-compose -f docker-compose.prod-multi.yml up -d --build --no-deps cxw-backend

4.4 查看日志

docker logs -f cxw-backend --tail 100

4.5 重新编译前端(所有租户共享)

cd /root/aiedu/kaopeilian-frontend
npm run build

五、数据库连接

5.1 生产共享 MySQL (prod-mysql)

  • 端口3309
  • 用户root
  • 密码ProdMySQL2025!@#
  • 数据库kaopeilian_hua, kaopeilian_yy, kaopeilian_hl, kaopeilian_xy, kaopeilian_fw, kaopeilian_ex, kaopeilian_cxw

5.2 开发测试 MySQL (kpl-mysql-dev)

  • 端口3308
  • 用户root
  • 密码nj861021
  • 数据库kaopeilian

5.3 主站 MySQL (kaopeilian-mysql)

  • 端口3307
  • 用户root
  • 密码nj861021
  • 数据库kaopeilian

六、对象存储MinIO

2026-02-03 新增,用于统一管理所有租户的文件存储

6.1 服务信息

项目
容器名 kaopeilian-minio
API端口 9000
管理界面端口 9001
数据目录 /data/minio/data
网络 prod-network

6.2 访问方式

6.3 Bucket列表

Bucket名称 租户 说明
kpl-ex 恩喜成都总院 生产环境
kpl-hua 华尔倍丽 生产环境
kpl-yy 杨扬宠物 生产环境
kpl-hl 武汉禾丽 生产环境
kpl-xy 芯颜定制 生产环境
kpl-fw 飞沃 生产环境
kpl-cxw 崔曦文 生产环境
kpl-demo 演示环境 预生产
kpl-kpl KPL测试 测试环境
kpl-peilian 陪练项目 其他项目

6.4 后端配置

.env 或环境变量中设置:

# MinIO配置
MINIO_ENABLED=true
MINIO_ENDPOINT=kaopeilian-minio:9000
MINIO_ACCESS_KEY=kaopeilian_admin
MINIO_SECRET_KEY=KplMinio2026!@#
MINIO_SECURE=false

6.5 常用命令

# SSH登录服务器后

# 查看MinIO状态
docker ps | grep minio

# 查看MinIO日志
docker logs kaopeilian-minio --tail 50

# 使用mc客户端操作
mc ls kpl/                     # 列出所有bucket
mc ls kpl/kpl-ex/              # 列出ex租户文件
mc cp file.pdf kpl/kpl-ex/     # 上传文件
mc rm kpl/kpl-ex/file.pdf      # 删除文件

6.6 架构说明

用户上传文件
    ↓
后端 storage_service
    ↓
MinIO对象存储持久化+ 本地缓存(加速预览)
    ↓
Nginx代理 → 用户下载

特性

  • 自动降级MinIO不可用时自动使用本地存储
  • URL兼容保持 /static/uploads/ 格式,前端无需改动
  • 智能缓存:文件自动下载到本地缓存用于预览/分析
  • 多租户隔离每个租户独立Bucket

七、容器管理

当前运行容器统计

类型 数量
前端容器 11
后端容器 11
Redis 10
MySQL 4
MinIO 1
Nginx 1
总计 38

查看所有容器

docker ps --format 'table {{.Names}}\t{{.Status}}'

八、测试账户

角色 用户名 密码
系统管理员 admin Admin123!
培训经理 manager Admin123!
测试学员 testuser Admin123!

九、注意事项

  1. 前端共享:所有生产租户共享同一套前端代码,编译一次全部更新
  2. 后端独立:每个租户有独立的后端容器和数据库
  3. 域名解析
    • *.ireborn.com.cn 解析到 120.79.242.43SCRM服务器
    • *.kpl.ireborn.com.cn 解析到 120.79.247.16(考培练服务器)
  4. SSL证书:使用 Let's Encrypt自动续期

十、新租户部署流程

以下是添加新生产租户的完整步骤

10.1 端口分配规则

租户序号 前端端口 后端端口 Redis端口
1 (hua) 3010 8010 6390
2 (yy) 3011 8011 6391
... 301x 801x 639x
8 (mst) 3017 8017 6397

10.2 部署步骤

步骤1创建 ENV 配置文件

backend/.env.{tenant} 创建环境变量文件,参考 .env.ex 模板:

# 必须修改的配置项
APP_NAME="租户名称-考培练系统"
DATABASE_URL=mysql+aiomysql://root:ProdMySQL2025%21%40%23@prod-mysql:3306/kaopeilian_{tenant}?charset=utf8mb4
MYSQL_DATABASE=kaopeilian_{tenant}
REDIS_URL=redis://{tenant}-redis:6379/0
REDIS_HOST={tenant}-redis
SECRET_KEY={生成唯一密钥}
CORS_ORIGINS=["https://{tenant}.kpl.ireborn.com.cn", "http://{tenant}.kpl.ireborn.com.cn"]
TENANT_CODE={tenant}

# Coze 配置(每个租户需要单独配置 Bot
COZE_PRACTICE_BOT_ID={租户专用Bot ID}

步骤2创建数据库

# SSH 登录服务器
ssh root@120.79.247.16

# 创建数据库
docker exec prod-mysql mysql -uroot -p'ProdMySQL2025!@#' -e "
CREATE DATABASE IF NOT EXISTS kaopeilian_{tenant} 
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
"

# 导入基础数据(从现有租户复制结构)
docker exec prod-mysql mysqldump -uroot -p'ProdMySQL2025!@#' --no-data kaopeilian_ex | \
docker exec -i prod-mysql mysql -uroot -p'ProdMySQL2025!@#' kaopeilian_{tenant}

步骤3创建必要目录

# 在服务器上执行
mkdir -p /data/prod-envs/logs-{tenant}
mkdir -p /data/kaopeilian/uploads/{tenant}
mkdir -p /data/redis-data/{tenant}

步骤4更新 docker-compose.prod-multi.yml

/data/prod-envs/docker-compose.prod-multi.yml 添加新租户的服务定义:

  # ============================================
  # 租户名称 ({tenant}.kpl.ireborn.com.cn)
  # ============================================
  {tenant}-frontend:
    build:
      context: ./kaopeilian-frontend
      dockerfile: Dockerfile
      args:
        - NODE_ENV=production
        - VITE_API_BASE_URL=https://{tenant}.kpl.ireborn.com.cn
        - VITE_WS_BASE_URL=wss://{tenant}.kpl.ireborn.com.cn
        - VITE_USE_MOCK_DATA=false
    container_name: {tenant}-frontend
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "{前端端口}:80"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    networks:
      - prod-network
    depends_on:
      - {tenant}-backend
    labels:
      - "com.centurylinklabs.watchtower.enable=false"

  {tenant}-backend:
    image: crpi-na6dit5kd0bonqed.cn-guangzhou.personal.cr.aliyuncs.com/ireborn/kaopeilian-backend:main
    container_name: {tenant}-backend
    restart: unless-stopped
    env_file:
      - ./kaopeilian-backend/.env.{tenant}
    environment:
      - TZ=Asia/Shanghai
      - PYTHONPATH=/app
    ports:
      - "{后端端口}:8000"
    volumes:
      - /root/aiedu/kaopeilian-backend/app:/app/app
      - /data/kaopeilian/uploads/{tenant}:/app/uploads
      - /data/prod-envs/logs-{tenant}:/app/logs
      - /data/prod-envs/secrets:/app/secrets:ro
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    networks:
      - prod-network
    depends_on:
      prod-mysql:
        condition: service_healthy
      {tenant}-redis:
        condition: service_healthy
    labels:
      - "com.centurylinklabs.watchtower.enable=false"

  {tenant}-redis:
    image: redis:7.2-alpine
    container_name: {tenant}-redis
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "{Redis端口}:6379"
    volumes:
      - /data/redis-data/{tenant}:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    networks:
      - prod-network
    command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru

步骤5创建 MinIO Bucket

# 在服务器上执行
mc mb kpl/kpl-{tenant}
mc anonymous set download kpl/kpl-{tenant}

步骤6配置 Nginx 反向代理

在 Nginx 配置中添加新租户的域名解析(通常在 SCRM 服务器 120.79.242.43)。

步骤7启动服务

cd /data/prod-envs
docker compose -f docker-compose.prod-multi.yml up -d {tenant}-redis {tenant}-backend {tenant}-frontend

步骤8初始化数据

# 创建管理员账户
docker exec {tenant}-backend python3 -c "
from app.db.init_db import init_admin_user
import asyncio
asyncio.run(init_admin_user())
"

10.3 环境变量说明

变量名 说明 示例
APP_NAME 应用显示名称 "美生堂-考培练系统"
DATABASE_URL 数据库连接URL mysql+aiomysql://...
REDIS_URL Redis连接URL redis://{tenant}-redis:6379/0
SECRET_KEY JWT密钥64位随机字符串 使用 openssl rand -hex 32 生成
CORS_ORIGINS 允许的跨域来源 ["https://{tenant}.kpl.ireborn.com.cn"]
TENANT_CODE 租户代码(小写字母) mst
COZE_PRACTICE_BOT_ID Coze陪练Bot ID 需要在Coze平台创建
COZE_BROADCAST_BOT_ID Coze播课Bot ID 可共用

十一、Git 仓库配置

# 查看远程仓库
git remote -v

# origin: GitHub 源代码仓库
# cicd: Gitea CI/CD 触发仓库

# 常规开发
git push origin main

# 触发部署
git push cicd test    # 部署开发1
git push cicd dev2    # 部署开发2
git push cicd main    # 部署生产