# DesignerCEP 线上部署指南

## 📋 部署架构概览

本项目包含三个主要部分：
1. **Shell（登录壳）**: 本地 CEP 扩展，负责登录和版本管理
2. **Core（核心应用）**: 通过后端服务器提供的 Web 应用
3. **Backend（后端服务）**: FastAPI 服务器，提供 API 和静态文件服务

---

## 🚀 一、前端部署

### 1.1 构建前准备

#### ✅ 关闭生产环境日志

在 `main.ts` 或应用入口添加：

```typescript
import { logger } from '@/utils/logger';

// 生产环境关闭日志
if (import.meta.env.PROD) {
    logger.disable();
} else {
    logger.enable();
}
```

或者在 `logger.ts` 中修改默认状态：

```typescript
class Logger {
    // 生产环境默认关闭，开发环境默认开启
    private _enabled: boolean = import.meta.env.DEV;
    // ...
}
```

#### ✅ 配置生产环境 API 地址

创建 `.env.production` 文件：

```env
# 生产环境配置
VITE_API_BASE_URL=https://your-domain.com/api/v1
VITE_API_SERVER=https://your-domain.com
```

修改 `config.ts`：

```typescript
export const config = {
    // 从环境变量读取
    apiBaseUrl: import.meta.env.VITE_API_BASE_URL || 'http://127.0.0.1:8000/api/v1',
    apiServer: import.meta.env.VITE_API_SERVER || 'http://127.0.0.1:8000',
    
    // ...其他配置
};
```

### 1.2 构建命令

```bash
# 进入 Designer 目录
cd Designer

# 安装依赖（如果还没安装）
npm install

# 构建生产版本
npm run build

# 构建完成后，产物在 dist/ 目录
```

### 1.3 构建产物说明

```
Designer/dist/
  ├── Shell/          # Shell 登录壳（本地 CEP 扩展使用）
  │   ├── index.html
  │   ├── assets/
  │   └── ...
  └── Designer/       # Core 核心应用（上传到服务器）
      ├── index.html
      ├── assets/
      └── ...
```

**重要说明：**
- `dist/Shell/` → 需要部署到服务器的两个地方：
  - 打包为 `.zip` 供 CEP 扩展下载：`static/shell/shell-{version}.zip`
  - 部署为在线登录页：`static/shell/` （直接部署文件）
- `dist/Designer/` → 上传到服务器的 `static/core/{version}/` 目录

---

## 🖥️ 二、后端部署

### 2.1 服务器要求

- **操作系统**: Linux (推荐 Ubuntu 20.04+) 或 Windows Server
- **Python 版本**: Python 3.9+
- **内存**: 最低 1GB，推荐 2GB+
- **磁盘**: 至少 10GB 可用空间（用于存储版本文件）
- **域名**: 需要一个域名并配置 DNS
- **SSL 证书**: 建议使用 Let's Encrypt 免费证书

### 2.2 部署步骤

#### 步骤 1: 上传代码

```bash
# 方式 1: Git 克隆（推荐）
ssh user@your-server
cd /var/www
git clone https://your-repo-url.git DesignerCEP
cd DesignerCEP/Server

# 方式 2: SCP 上传
# 本地执行
scp -r Server/ user@your-server:/var/www/DesignerCEP/
```

#### 步骤 2: 创建虚拟环境

```bash
cd /var/www/DesignerCEP/Server

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate  # Linux
# 或
venv\Scripts\activate     # Windows

# 安装依赖
pip install -r requirements.txt
```

#### 步骤 3: 配置环境变量

创建 `.env` 文件：

```bash
# /var/www/DesignerCEP/Server/.env

# 基础配置
PROJECT_NAME=DesignerCEP
VERSION=1.0.0
DEBUG=False

# 安全配置
SECRET_KEY=your-super-secret-key-change-this-in-production
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=43200

# 数据库配置（如果使用）
DATABASE_URL=sqlite:///./designer.db
# 或使用 PostgreSQL/MySQL
# DATABASE_URL=postgresql://user:password@localhost/dbname

# CORS 配置
ALLOWED_ORIGINS=https://your-domain.com,https://www.your-domain.com

# 静态文件路径
STATIC_DIR=/var/www/DesignerCEP/Server/static
SHELL_DIR=/var/www/DesignerCEP/Server/static/shell
CORE_DIR=/var/www/DesignerCEP/Server/static/core
```

#### 步骤 4: 准备静态文件目录

```bash
# 创建目录结构
mkdir -p static/shell
mkdir -p static/core/1.0.0

# 1. 上传 Shell 在线登录页（用于网页访问）
scp -r Designer/dist/Shell/* user@your-server:/var/www/DesignerCEP/Server/static/shell/

# 2. 打包 Shell 供 CEP 扩展下载
cd Designer/dist
zip -r shell-1.0.0.zip Shell/
scp shell-1.0.0.zip user@your-server:/var/www/DesignerCEP/Server/static/downloads/
cd ../..

# 3. 上传 Core 构建产物
scp -r Designer/dist/Designer/* user@your-server:/var/www/DesignerCEP/Server/static/core/1.0.0/
```

目录结构应该是：

```
Server/
  ├── app/
  ├── static/
  │   ├── shell/                  # Shell 在线登录页
  │   │   ├── index.html
  │   │   ├── assets/
  │   │   └── ...
  │   ├── downloads/              # 下载文件（供 CEP 扩展）
  │   │   └── shell-1.0.0.zip
  │   └── core/
  │       └── 1.0.0/              # Core 核心应用
  │           ├── index.html
  │           ├── assets/
  │           └── ...
  ├── .env
  ├── requirements.txt
  └── main.py
```

**说明：**
- `static/shell/` - Shell 在线登录页，用户退出登录后访问这里
- `static/downloads/shell-1.0.0.zip` - 供 CEP 扩展首次下载的 Shell 安装包
- `static/core/1.0.0/` - Core 核心应用，用户登录后使用

#### 步骤 5: 使用 Gunicorn 运行（生产环境）

安装 Gunicorn：

```bash
pip install gunicorn uvicorn[standard]
```

创建启动脚本 `start.sh`:

```bash
#!/bin/bash
cd /var/www/DesignerCEP/Server
source venv/bin/activate

gunicorn app.main:app \
    --workers 4 \
    --worker-class uvicorn.workers.UvicornWorker \
    --bind 0.0.0.0:8000 \
    --access-logfile logs/access.log \
    --error-logfile logs/error.log \
    --daemon
```

```bash
chmod +x start.sh
./start.sh
```

#### 步骤 6: 使用 Systemd 管理服务（推荐）

创建服务文件 `/etc/systemd/system/designer-cep.service`:

```ini
[Unit]
Description=DesignerCEP Backend Service
After=network.target

[Service]
Type=notify
User=www-data
Group=www-data
WorkingDirectory=/var/www/DesignerCEP/Server
Environment="PATH=/var/www/DesignerCEP/Server/venv/bin"
ExecStart=/var/www/DesignerCEP/Server/venv/bin/gunicorn \
    --workers 4 \
    --worker-class uvicorn.workers.UvicornWorker \
    --bind 0.0.0.0:8000 \
    app.main:app

Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
```

启动服务：

```bash
# 重载 systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start designer-cep

# 设置开机自启
sudo systemctl enable designer-cep

# 查看状态
sudo systemctl status designer-cep

# 查看日志
sudo journalctl -u designer-cep -f
```

---

## 🔧 三、Nginx 反向代理配置

### 3.1 安装 Nginx

```bash
sudo apt update
sudo apt install nginx
```

### 3.2 配置 Nginx

创建配置文件 `/etc/nginx/sites-available/designer-cep`:

```nginx
# HTTP 重定向到 HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name your-domain.com www.your-domain.com;
    
    # Let's Encrypt 验证
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    
    # 重定向到 HTTPS
    location / {
        return 301 https://$server_name$request_uri;
    }
}

# HTTPS 配置
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name your-domain.com www.your-domain.com;
    
    # SSL 证书配置
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    # 日志
    access_log /var/log/nginx/designer-cep-access.log;
    error_log /var/log/nginx/designer-cep-error.log;
    
    # 客户端最大上传大小（用于大文件上传）
    client_max_body_size 100M;
    
    # API 代理
    location /api/ {
        proxy_pass http://127.0.0.1:8000;
        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;
        
        # WebSocket 支持（如果需要）
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
    # Shell 在线登录页
    location /shell/ {
        alias /var/www/DesignerCEP/Server/static/shell/;
        try_files $uri $uri/ /shell/index.html;
        
        # HTML 不缓存，资源文件缓存
        location ~* \.html$ {
            expires -1;
            add_header Cache-Control "no-cache, no-store, must-revalidate";
        }
        
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 7d;
            add_header Cache-Control "public, immutable";
        }
    }
    
    # 下载文件（供 CEP 扩展下载）
    location /downloads/ {
        alias /var/www/DesignerCEP/Server/static/downloads/;
        autoindex off;
        
        # 强制下载
        add_header Content-Disposition "attachment";
        
        # 缓存配置
        expires 7d;
        add_header Cache-Control "public, immutable";
    }
    
    # Core 静态文件
    location /core/ {
        alias /var/www/DesignerCEP/Server/static/core/;
        try_files $uri $uri/ =404;
        
        # SPA 路由支持（如果需要）
        # try_files $uri $uri/ /core/$1/index.html;
        
        # 缓存配置
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
        
        location ~* \.html$ {
            expires -1;
            add_header Cache-Control "no-cache, no-store, must-revalidate";
        }
    }
    
    # 健康检查
    location /health {
        proxy_pass http://127.0.0.1:8000/health;
        access_log off;
    }
}
```

启用配置：

```bash
# 创建软链接
sudo ln -s /etc/nginx/sites-available/designer-cep /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重载 Nginx
sudo systemctl reload nginx
```

### 3.3 配置 SSL 证书（Let's Encrypt）

```bash
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx

# 获取证书
sudo certbot --nginx -d your-domain.com -d www.your-domain.com

# 自动续期（已自动配置 cron）
sudo certbot renew --dry-run
```

---

## 🔒 四、安全配置

### 4.1 防火墙配置

```bash
# 允许 SSH
sudo ufw allow 22/tcp

# 允许 HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 启用防火墙
sudo ufw enable

# 查看状态
sudo ufw status
```

### 4.2 生产环境安全检查清单

- [ ] 修改 `SECRET_KEY` 为随机强密钥
- [ ] 设置 `DEBUG=False`
- [ ] 配置正确的 `ALLOWED_ORIGINS`
- [ ] 使用 HTTPS（SSL 证书）
- [ ] 配置数据库（不使用 SQLite）
- [ ] 设置文件上传大小限制
- [ ] 配置日志轮转
- [ ] 关闭前端日志输出
- [ ] 定期备份数据库和用户数据
- [ ] 配置监控和告警

---

## 📦 五、版本更新流程

### 5.1 发布新版本

```bash
# 1. 本地构建新版本
cd Designer
npm run build

# 2. 上传到服务器
scp -r dist/Designer/* user@your-server:/var/www/DesignerCEP/Server/static/core/1.0.1/

# 3. 更新后端版本配置
# 在后端 API 中更新 current_version 为 1.0.1
```

### 5.2 版本管理建议

```
static/core/
  ├── 1.0.0/    # 旧版本保留
  ├── 1.0.1/    # 当前版本
  └── 1.0.2/    # 新版本
```

后端 API 返回最新版本号，客户端自动下载更新。

---

## 🔍 六、监控与日志

### 6.1 日志管理

创建日志轮转配置 `/etc/logrotate.d/designer-cep`:

```
/var/www/DesignerCEP/Server/logs/*.log {
    daily
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 www-data www-data
    sharedscripts
    postrotate
        systemctl reload designer-cep > /dev/null 2>&1 || true
    endscript
}
```

### 6.2 性能监控

推荐使用：
- **PM2**: 进程管理和监控
- **Prometheus + Grafana**: 指标监控
- **Sentry**: 错误追踪
- **ELK Stack**: 日志分析

---

## 🚀 七、快速部署脚本

创建 `deploy.sh` 一键部署脚本：

```bash
#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  DesignerCEP 自动部署脚本${NC}"
echo -e "${GREEN}========================================${NC}"

# 1. 拉取最新代码
echo -e "\n${YELLOW}[1/6] 拉取最新代码...${NC}"
git pull origin main

# 2. 构建前端
echo -e "\n${YELLOW}[2/6] 构建前端...${NC}"
cd Designer
npm install
npm run build
cd ..

# 3. 上传 Core 到服务器
echo -e "\n${YELLOW}[3/6] 上传 Core 到服务器...${NC}"
VERSION=$(node -p "require('./Designer/package.json').version")
ssh user@your-server "mkdir -p /var/www/DesignerCEP/Server/static/core/$VERSION"
scp -r Designer/dist/Designer/* user@your-server:/var/www/DesignerCEP/Server/static/core/$VERSION/

# 4. 更新后端代码
echo -e "\n${YELLOW}[4/6] 更新后端代码...${NC}"
ssh user@your-server "cd /var/www/DesignerCEP/Server && git pull origin main"

# 5. 重启后端服务
echo -e "\n${YELLOW}[5/6] 重启后端服务...${NC}"
ssh user@your-server "sudo systemctl restart designer-cep"

# 6. 检查服务状态
echo -e "\n${YELLOW}[6/6] 检查服务状态...${NC}"
ssh user@your-server "sudo systemctl status designer-cep --no-pager"

echo -e "\n${GREEN}========================================${NC}"
echo -e "${GREEN}  部署完成！${NC}"
echo -e "${GREEN}  版本: $VERSION${NC}"
echo -e "${GREEN}========================================${NC}"
```

使用方法：

```bash
chmod +x deploy.sh
./deploy.sh
```

---

## ❓ 八、常见问题

### Q1: CORS 跨域问题
**A**: 在后端 `.env` 中正确配置 `ALLOWED_ORIGINS`。

### Q2: 静态文件 404
**A**: 检查 Nginx 配置中的 `alias` 路径是否正确。

### Q3: API 请求超时
**A**: 调整 Nginx `proxy_read_timeout` 和 Gunicorn `timeout` 参数。

### Q4: 前端日志仍然输出
**A**: 确保在生产环境中调用了 `logger.disable()`。

### Q5: 版本更新后客户端没反应
**A**: 检查后端 API 返回的版本号是否正确，清除客户端缓存。

---

## 📞 技术支持

如遇到部署问题，请检查：
1. 后端日志：`sudo journalctl -u designer-cep -f`
2. Nginx 日志：`sudo tail -f /var/log/nginx/designer-cep-error.log`
3. 系统资源：`htop` 或 `top`

---

**最后更新**: 2024-12-17

