13 KiB
13 KiB
📦 结伴客系统部署指南
📋 部署概述
本文档详细说明了结伴客项目的完整部署流程,包括开发环境、测试环境和生产环境的部署配置。项目采用容器化部署方式,支持快速部署和弹性扩容。
🛠️ 环境要求
系统要求
- 操作系统: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+(用于进程管理)
- 微信开发者工具:最新版本
🚀 快速部署
一键部署脚本
#!/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 "回滚完成!"
📞 技术支持
联系方式
- 技术支持邮箱:tech-support@jiebanke.com
- 紧急联系电话:400-xxx-xxxx
- 技术文档:https://docs.jiebanke.com
支持时间
- 工作日:9:00 - 18:00
- 紧急故障:7×24小时响应
文档版本:v1.0
最后更新:2025年1月