Files
jiebanke/docs/部署指南.md

13 KiB
Raw Blame History

📦 结伴客系统部署指南

📋 部署概述

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

🛠️ 环境要求

系统要求

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

软件依赖

基础软件

  • Node.js16.x 或 18.x LTS版本
  • npm8.x+ 或 yarn 1.22+
  • Git2.30+
  • Docker20.10+
  • Docker Compose2.0+

数据库

  • MySQL8.0+
  • Redis6.0+(可选,用于缓存)

其他工具

  • Nginx1.18+(用于反向代理)
  • PM25.0+(用于进程管理)
  • 微信开发者工具:最新版本

🚀 快速部署

一键部署脚本

#!/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一键部署

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

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

🏗️ 开发环境部署

1. 环境准备

安装Node.js

# 使用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

# 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. 项目配置

克隆项目代码

git clone https://github.com/your-org/jiebanke.git
cd jiebanke

安装项目依赖

# 后端依赖
cd backend
npm install

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

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

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

配置环境变量

# 复制环境变量模板
cd backend
cp .env.example .env

# 编辑环境变量
vim .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. 数据库初始化

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

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

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

4. 启动开发服务

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

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

# 启动官网(新终端)
cd website
npm run dev

5. 验证部署

访问以下地址验证部署是否成功:

🧪 测试环境部署

1. 服务器配置

服务器信息

  • 主机192.168.0.240
  • 操作系统Ubuntu 20.04
  • 用户deploy
  • 部署路径/var/www/jiebanke

环境变量配置

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. 自动化部署脚本

#!/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

高可用架构

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
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配置

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.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. 生产环境部署脚本

#!/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 "部署完成!"

🔍 部署验证

健康检查

# 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

性能测试

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

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

📊 监控配置

系统监控

Prometheus配置

# prometheus.yml
global:
  scrape_interval: 15s

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

Grafana仪表板

  • 系统指标CPU、内存、磁盘使用率
  • 应用指标QPS、响应时间、错误率
  • 业务指标:用户注册量、订单量、收入

日志管理

日志收集配置

# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /opt/jiebanke/logs/*.log
  fields:
    service: jiebanke
    environment: production

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

🚨 故障排除

常见问题

1. 数据库连接失败

# 检查数据库服务状态
docker-compose ps mysql

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

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

2. Redis连接失败

# 检查Redis服务状态
docker-compose ps redis

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

3. 应用启动失败

# 查看应用日志
docker-compose logs api

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

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

回滚操作

#!/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 "回滚完成!"

📞 技术支持

联系方式

支持时间

  • 工作日9:00 - 18:00
  • 紧急故障7×24小时响应

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