# AR04 — 部署架构设计 > **版本:V1.1 | 部署模式:纯本地离线** > **完整部署步骤请见 docs/deploy.md** > > **⚠️ 本文档为 V1.1 设计期历史快照(Docker + FastAPI 拓扑),不再反映当前实现。** 当前部署为 **Go 单二进制 + MySQL 8.0 + FAISS + systemd + Clonezilla 整盘克隆**,无 Docker、无 Python 运行时,以 `docs/deploy.md` 为准。 --- ## 1. 部署拓扑 ``` ┌──────────────────────┐ │ 内网员工浏览器 │ │ http://train.bosun │ └──────────┬───────────┘ │ ┌─────▼──────┐ │ Nginx │ │ :80 / :443 │ │ │ │ · 前端静态 │ │ · API 反代 │ │ · SSE 支持 │ └──┬──────┬──┘ │ │ ┌──────────────┘ └──────────────┐ │ │ ┌─────▼──────┐ ┌────────▼────────┐ │ FastAPI │ │ Vue 静态打包 │ │ :8000 │ │ nginx html/ │ │ │ └─────────────────┘ │ · JWT │ │ · 业务 │ └──┬──┬──┬──┘ │ │ │ ┌───────────┘ │ └──────────────┐ │ │ │ ┌──▼─────┐ ┌────▼───────┐ ┌──────▼──────────┐ │ MySQL │ │ data/media │ │ LibreOffice │ │ 8.0 │ │ 文件存储 │ │ 预览容器 │ │ :3306 │ │ │ │ :8100 │ └────────┘ └────────────┘ └─────────────────┘ │ │ (文档转换) ▼ ┌──────────────┐ │ 内网 LLM │ │ Ollama/ │ │ vLLM/网关 │ │ :11434 │ └──────────────┘ ``` ## 2. 服务清单 | 服务 | 端口 | 基础镜像/依赖 | 说明 | |------|------|-------------|------| | Nginx | 80/443 | nginx:alpine | HTTP 反代 + 前端静态资源 | | FastAPI | 8000 | python:3.10 | 后端 API(uvicorn 启动) | | MySQL | 3306 | mysql:8.0 | 数据库 | | LibreOffice | 8100 | 自定义 Docker 镜像 | 文档转 PDF 预览 | | LLM 服务 | 11434 | ollama/vllm | 内网 AI 推理 | ## 3. Nginx 关键配置 ```nginx # SPA 路由 location / { try_files $uri $uri/ /index.html; } # API 反代 + SSE location /api/ { proxy_pass http://127.0.0.1:8000; proxy_buffering off; proxy_cache off; proxy_read_timeout 300s; } # 媒体文件预览(仅内部) location /media/ { alias /opt/eaisalestrain/backend/data/media/; internal; } client_max_body_size 2048M; ``` ## 4. docker-compose 服务拓扑 ```yaml version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_DATABASE: eaisalestrain MYSQL_USER: eaisalestrain MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - mysql_data:/var/lib/mysql backend: build: ./backend environment: DATABASE_URL: mysql+pymysql://eaisalestrain:${DB_PASSWORD}@mysql:3306/eaisalestrain JWT_SECRET: ${JWT_SECRET} LLM_BASE_URL: http://llm-server:11434/v1 volumes: - ./data/media:/app/data/media depends_on: - mysql libreoffice: image: libreoffice-preview:latest volumes: - ./data/media:/data/media nginx: image: nginx:alpine ports: - "80:80" volumes: - ./frontend/dist:/usr/share/nginx/html - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - backend ``` ## 5. 安全边界 | 层级 | 措施 | |------|------| | 网络 | 仅监听内网,不暴露公网端口 | | 认证 | JWT token 校验 + bcrypt 密码 | | 鉴权 | 后端 API role 校验(非前端) | | 文件 | 白名单扩展名 + UUID 命名 + 只读预览 | | 数据库 | 独立用户 + 最小权限 | | LLM | 仅内网地址,严禁公网 API |