# 📦 结伴客系统部署指南

## 📋 部署概述

本文档详细说明了结伴客项目的完整部署流程，包括开发环境、测试环境和生产环境的部署配置。项目采用容器化部署方式，支持快速部署和弹性扩容。

## 🛠️ 环境要求

### 系统要求
- **操作系统**：Ubuntu 20.04+ / CentOS 7+ / macOS 10.15+
- **CPU**：最低2核，推荐4核+
- **内存**：最低4GB，推荐8GB+
- **存储**：最低20GB可用空间，推荐50GB+
- **网络**：稳定的互联网连接，带宽10Mbps+

### 软件依赖

#### 基础软件
- **Node.js**：16.x 或 18.x LTS版本
- **npm**：8.x+ 或 yarn 1.22+
- **Git**：2.30+
- **Docker**：20.10+
- **Docker Compose**：2.0+

#### 数据库
- **MySQL**：8.0+
- **Redis**：6.0+（可选，用于缓存）

#### 其他工具
- **Nginx**：1.18+（用于反向代理）
- **PM2**：5.0+（用于进程管理）
- **微信开发者工具**：最新版本

## 🚀 快速部署

### 一键部署脚本

```bash
#!/bin/bash
# 快速部署脚本 - deploy.sh

echo "开始部署结伴客项目..."

# 1. 克隆项目
git clone https://github.com/your-org/jiebanke.git
cd jiebanke

# 2. 安装依赖
echo "安装项目依赖..."
npm install

# 3. 配置环境变量
echo "配置环境变量..."
cp .env.example .env

# 4. 初始化数据库
echo "初始化数据库..."
npm run db:migrate
npm run db:seed

# 5. 构建项目
echo "构建项目..."
npm run build

# 6. 启动服务
echo "启动服务..."
npm run start:prod

echo "部署完成！访问 http://localhost:3000"
```

### Docker一键部署

```bash
# 使用Docker Compose一键部署
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f
```

## 🏗️ 开发环境部署

### 1. 环境准备

#### 安装Node.js
```bash
# 使用nvm安装Node.js
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18
```

#### 安装MySQL
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server

# macOS
brew install mysql
brew services start mysql

# 创建数据库
mysql -u root -p
CREATE DATABASE jiebandata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'jieban'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON jiebandata.* TO 'jieban'@'localhost';
FLUSH PRIVILEGES;
```

### 2. 项目配置

#### 克隆项目代码
```bash
git clone https://github.com/your-org/jiebanke.git
cd jiebanke
```

#### 安装项目依赖
```bash
# 后端依赖
cd backend
npm install

# 前端管理系统依赖
cd ../admin-system
npm install

# 小程序依赖
cd ../mini-program
npm install

# 官网依赖
cd ../website
npm install
```

#### 配置环境变量
```bash
# 复制环境变量模板
cd backend
cp .env.example .env

# 编辑环境变量
vim .env
```

**环境变量配置示例：**
```env
# 应用配置
NODE_ENV=development
PORT=3000
APP_NAME=结伴客

# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_NAME=jiebandata
DB_USER=jieban
DB_PASSWORD=password

# Redis配置
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=

# JWT配置
JWT_SECRET=your-jwt-secret-key
JWT_EXPIRES_IN=7d

# 微信小程序配置
WECHAT_APP_ID=your-wechat-app-id
WECHAT_APP_SECRET=your-wechat-app-secret

# 文件上传配置
UPLOAD_PATH=./uploads
MAX_FILE_SIZE=10485760

# 邮件配置
SMTP_HOST=smtp.qq.com
SMTP_PORT=587
SMTP_USER=your-email@qq.com
SMTP_PASS=your-email-password
```

### 3. 数据库初始化

```bash
# 运行数据库迁移
cd backend
npm run db:migrate

# 运行数据库种子文件
npm run db:seed

# 或者直接执行SQL文件
mysql -u jieban -p jiebandata < scripts/init-database.sql
```

### 4. 启动开发服务

```bash
# 启动后端服务
cd backend
npm run dev

# 启动前端管理系统（新终端）
cd admin-system
npm run dev

# 启动官网（新终端）
cd website
npm run dev
```

### 5. 验证部署

访问以下地址验证部署是否成功：
- 后端API：http://localhost:3000/api/health
- 管理系统：http://localhost:8080
- 官网：http://localhost:8081

## 🧪 测试环境部署

### 1. 服务器配置

#### 服务器信息
- **主机**：192.168.0.240
- **操作系统**：Ubuntu 20.04
- **用户**：deploy
- **部署路径**：/var/www/jiebanke

#### 环境变量配置
```env
NODE_ENV=testing
PORT=3000
DB_HOST=192.168.0.240
DB_PORT=3306
DB_NAME=jiebandata_test
DB_USER=jieban_test
DB_PASSWORD=test_password
```

### 2. 自动化部署脚本

```bash
#!/bin/bash
# 测试环境部署脚本 - deploy-test.sh

SERVER_HOST="192.168.0.240"
SERVER_USER="deploy"
DEPLOY_PATH="/var/www/jiebanke"

echo "开始部署到测试环境..."

# 1. 构建项目
echo "构建项目..."
npm run build

# 2. 打包文件
echo "打包部署文件..."
tar -czf jiebanke-$(date +%Y%m%d-%H%M%S).tar.gz \
  backend/ admin-system/dist/ website/dist/ \
  package.json docker-compose.yml

# 3. 上传到服务器
echo "上传文件到服务器..."
scp jiebanke-*.tar.gz $SERVER_USER@$SERVER_HOST:$DEPLOY_PATH/

# 4. 远程部署
echo "执行远程部署..."
ssh $SERVER_USER@$SERVER_HOST << 'EOF'
cd /var/www/jiebanke
tar -xzf jiebanke-*.tar.gz
docker-compose down
docker-compose up -d --build
docker-compose ps
EOF

echo "测试环境部署完成！"
```

## 🌐 生产环境部署

### 1. 服务器配置

#### 服务器信息
- **主机**：129.211.213.226
- **端口**：9527
- **操作系统**：CentOS 7
- **用户**：root
- **部署路径**：/opt/jiebanke

#### 高可用架构
```mermaid
graph TB
    A[负载均衡器 Nginx] --> B[应用服务器1]
    A --> C[应用服务器2]
    A --> D[应用服务器3]
    B --> E[MySQL主库]
    C --> E
    D --> E
    E --> F[MySQL从库1]
    E --> G[MySQL从库2]
    B --> H[Redis集群]
    C --> H
    D --> H
```

### 2. Docker容器化部署

#### Dockerfile配置
```dockerfile
# 后端服务Dockerfile
FROM node:18-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .

EXPOSE 3000
USER node
CMD ["npm", "start"]
```

#### Docker Compose配置
```yaml
version: '3.8'

services:
  # 后端API服务
  api:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=mysql
      - REDIS_HOST=redis
    depends_on:
      - mysql
      - redis
    restart: unless-stopped
    networks:
      - jiebanke-network

  # 前端管理系统
  admin:
    build:
      context: ./admin-system
      dockerfile: Dockerfile
    ports:
      - "8080:80"
    restart: unless-stopped
    networks:
      - jiebanke-network

  # MySQL数据库
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: jiebandata
      MYSQL_USER: jieban
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql
      - ./scripts/init-database.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "3306:3306"
    restart: unless-stopped
    networks:
      - jiebanke-network

  # Redis缓存
  redis:
    image: redis:6-alpine
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis_data:/data
    ports:
      - "6379:6379"
    restart: unless-stopped
    networks:
      - jiebanke-network

  # Nginx反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - api
      - admin
    restart: unless-stopped
    networks:
      - jiebanke-network

volumes:
  mysql_data:
  redis_data:

networks:
  jiebanke-network:
    driver: bridge
```

### 3. Nginx配置

```nginx
# nginx.conf
upstream api_backend {
    server api:3000;
}

upstream admin_backend {
    server admin:80;
}

# API服务器配置
server {
    listen 80;
    server_name api.jiebanke.com;
    
    # 重定向到HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name api.jiebanke.com;
    
    # SSL证书配置
    ssl_certificate /etc/nginx/ssl/api.jiebanke.com.crt;
    ssl_certificate_key /etc/nginx/ssl/api.jiebanke.com.key;
    
    # SSL安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    
    # 安全头
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    
    # API代理
    location /api/ {
        proxy_pass http://api_backend;
        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;
        
        # 超时配置
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }
    
    # 文件上传大小限制
    client_max_body_size 10M;
}

# 管理系统配置
server {
    listen 443 ssl http2;
    server_name admin.jiebanke.com;
    
    ssl_certificate /etc/nginx/ssl/admin.jiebanke.com.crt;
    ssl_certificate_key /etc/nginx/ssl/admin.jiebanke.com.key;
    
    location / {
        proxy_pass http://admin_backend;
        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;
    }
}
```

### 4. 生产环境部署脚本

```bash
#!/bin/bash
# 生产环境部署脚本 - deploy-prod.sh

set -e

PROD_SERVER="129.211.213.226"
PROD_USER="root"
DEPLOY_PATH="/opt/jiebanke"
BACKUP_PATH="/opt/backups"

echo "开始生产环境部署..."

# 1. 备份当前版本
echo "备份当前版本..."
ssh $PROD_USER@$PROD_SERVER << EOF
if [ -d "$DEPLOY_PATH" ]; then
    sudo mkdir -p $BACKUP_PATH
    sudo tar -czf $BACKUP_PATH/jiebanke-backup-$(date +%Y%m%d-%H%M%S).tar.gz -C $DEPLOY_PATH .
fi
EOF

# 2. 构建生产版本
echo "构建生产版本..."
NODE_ENV=production npm run build

# 3. 创建部署包
echo "创建部署包..."
tar -czf jiebanke-prod-$(date +%Y%m%d-%H%M%S).tar.gz \
  backend/ admin-system/dist/ website/dist/ \
  docker-compose.prod.yml nginx/ scripts/

# 4. 上传到生产服务器
echo "上传到生产服务器..."
scp jiebanke-prod-*.tar.gz $PROD_USER@$PROD_SERVER:$DEPLOY_PATH/

# 5. 执行部署
echo "执行生产部署..."
ssh $PROD_USER@$PROD_SERVER << 'EOF'
cd /opt/jiebanke
tar -xzf jiebanke-prod-*.tar.gz

# 停止旧服务
docker-compose -f docker-compose.prod.yml down

# 启动新服务
docker-compose -f docker-compose.prod.yml up -d --build

# 等待服务启动
sleep 30

# 检查服务状态
docker-compose -f docker-compose.prod.yml ps

# 健康检查
curl -f http://localhost:3000/api/health || exit 1

echo "生产环境部署成功！"
EOF

echo "部署完成！"
```

## 🔍 部署验证

### 健康检查

```bash
# API健康检查
curl -X GET http://localhost:3000/api/health

# 数据库连接检查
curl -X GET http://localhost:3000/api/health/db

# Redis连接检查
curl -X GET http://localhost:3000/api/health/redis
```

### 性能测试

```bash
# 使用Apache Bench进行压力测试
ab -n 1000 -c 10 http://localhost:3000/api/health

# 使用wrk进行性能测试
wrk -t12 -c400 -d30s http://localhost:3000/api/health
```

## 📊 监控配置

### 系统监控

#### Prometheus配置
```yaml
# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'jiebanke-api'
    static_configs:
      - targets: ['localhost:3000']
    metrics_path: '/metrics'
```

#### Grafana仪表板
- **系统指标**：CPU、内存、磁盘使用率
- **应用指标**：QPS、响应时间、错误率
- **业务指标**：用户注册量、订单量、收入

### 日志管理

#### 日志收集配置
```yaml
# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /opt/jiebanke/logs/*.log
  fields:
    service: jiebanke
    environment: production

output.elasticsearch:
  hosts: ["elasticsearch:9200"]
```

## 🚨 故障排除

### 常见问题

#### 1. 数据库连接失败
```bash
# 检查数据库服务状态
docker-compose ps mysql

# 查看数据库日志
docker-compose logs mysql

# 测试数据库连接
mysql -h localhost -u jieban -p jiebandata
```

#### 2. Redis连接失败
```bash
# 检查Redis服务状态
docker-compose ps redis

# 测试Redis连接
redis-cli -h localhost -p 6379 ping
```

#### 3. 应用启动失败
```bash
# 查看应用日志
docker-compose logs api

# 检查环境变量
docker-compose exec api env

# 进入容器调试
docker-compose exec api sh
```

### 回滚操作

```bash
#!/bin/bash
# 回滚脚本 - rollback.sh

BACKUP_FILE=$1
DEPLOY_PATH="/opt/jiebanke"

if [ -z "$BACKUP_FILE" ]; then
    echo "请指定备份文件名"
    exit 1
fi

echo "开始回滚到版本: $BACKUP_FILE"

# 停止当前服务
docker-compose down

# 恢复备份
tar -xzf /opt/backups/$BACKUP_FILE -C $DEPLOY_PATH

# 启动服务
docker-compose up -d

echo "回滚完成！"
```

## 📞 技术支持

### 联系方式
- **技术支持邮箱**：tech-support@jiebanke.com
- **紧急联系电话**：400-xxx-xxxx
- **技术文档**：https://docs.jiebanke.com

### 支持时间
- **工作日**：9:00 - 18:00
- **紧急故障**：7×24小时响应

---

*文档版本：v1.0*  
*最后更新：2025年1月*