Files
niumalll/docs/部署运维文档.md

19 KiB

活牛采购智能数字化系统 - 部署运维文档

概述

本文档详细描述了活牛采购智能数字化系统的部署流程、运维管理、监控告警和故障处理等内容,为系统的稳定运行提供完整的运维指南。

环境要求

硬件要求

最小配置

  • CPU: 2核心
  • 内存: 4GB RAM
  • 存储: 50GB SSD
  • 网络: 10Mbps带宽

推荐配置

  • CPU: 4核心以上
  • 内存: 8GB RAM以上
  • 存储: 100GB SSD以上
  • 网络: 100Mbps带宽以上

生产环境配置

  • CPU: 8核心以上
  • 内存: 16GB RAM以上
  • 存储: 500GB SSD以上
  • 网络: 1Gbps带宽以上

软件要求

操作系统

  • Linux: Ubuntu 20.04+ / CentOS 8+ / RHEL 8+
  • macOS: 10.15+ (仅开发环境)
  • Windows: Windows 10+ (仅开发环境)

运行环境

  • Node.js: 18.x LTS
  • npm: 8.x+
  • MySQL: 8.0+
  • Redis: 6.x+ (可选)
  • Nginx: 1.18+ (生产环境)

容器环境

  • Docker: 20.10+
  • Docker Compose: 2.0+

部署架构

单机部署架构

┌─────────────────────────────────────────┐
│              服务器 (单机)               │
├─────────────────────────────────────────┤
│  Nginx (反向代理 + 静态文件服务)        │
├─────────────────────────────────────────┤
│  Node.js 应用 (PM2管理)                 │
├─────────────────────────────────────────┤
│  MySQL 数据库                           │
├─────────────────────────────────────────┤
│  Redis 缓存 (可选)                      │
└─────────────────────────────────────────┘

集群部署架构

┌─────────────┐    ┌─────────────────────────────────┐    ┌─────────────┐
│  负载均衡器  │    │         应用服务器集群          │    │  数据库集群  │
│   (Nginx)   │◄──►│  ┌─────────┐  ┌─────────┐      │◄──►│   (MySQL)   │
│             │    │  │ Node.js │  │ Node.js │      │    │             │
│             │    │  │  App1   │  │  App2   │      │    │  主从复制   │
└─────────────┘    │  └─────────┘  └─────────┘      │    │             │
                   │  ┌─────────┐  ┌─────────┐      │    └─────────────┘
                   │  │ Redis   │  │ 文件存储 │      │
                   │  │ 缓存    │  │ (NFS)   │      │
                   │  └─────────┘  └─────────┘      │
                   └─────────────────────────────────┘

部署流程

1. 环境准备

1.1 系统更新

# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y

# CentOS/RHEL
sudo yum update -y

1.2 安装Node.js

# 使用NodeSource仓库安装
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# 验证安装
node --version
npm --version

1.3 安装MySQL

# Ubuntu/Debian
sudo apt install mysql-server -y

# 启动并设置开机自启
sudo systemctl start mysql
sudo systemctl enable mysql

# 安全配置
sudo mysql_secure_installation

1.4 安装Nginx

# Ubuntu/Debian
sudo apt install nginx -y

# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

1.5 安装PM2

# 全局安装PM2
sudo npm install -g pm2

# 设置PM2开机自启
pm2 startup
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u $USER --hp $HOME

2. 代码部署

2.1 创建部署目录

sudo mkdir -p /var/www/niumall
sudo chown $USER:$USER /var/www/niumall
cd /var/www/niumall

2.2 克隆代码

# 从Git仓库克隆
git clone https://github.com/your-org/niumall.git .

# 或者上传代码包
# scp -r ./niumall user@server:/var/www/

2.3 安装依赖

# 后端依赖
cd backend
npm install --production

# 前端构建
cd ../frontend
npm install
npm run build

3. 数据库配置

3.1 创建数据库

-- 登录MySQL
mysql -u root -p

-- 创建数据库
CREATE DATABASE niumall CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户
CREATE USER 'niumall'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON niumall.* TO 'niumall'@'localhost';
FLUSH PRIVILEGES;

3.2 配置环境变量

# 创建环境配置文件
cd /var/www/niumall/backend
cp .env.example .env

# 编辑配置文件
nano .env
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=niumall
DB_PASSWORD=your_password
DB_NAME=niumall

# JWT配置
JWT_SECRET=your_jwt_secret_key
JWT_EXPIRES_IN=24h

# 应用配置
NODE_ENV=production
PORT=3000

3.3 初始化数据库

# 运行数据库迁移
cd /var/www/niumall/backend
npm run migrate

# 创建管理员用户
node create_admin.js

4. Nginx配置

4.1 创建站点配置

sudo nano /etc/nginx/sites-available/niumall
server {
    listen 80;
    server_name your-domain.com;
    
    # 前端静态文件
    location / {
        root /var/www/niumall/frontend/dist;
        try_files $uri $uri/ /index.html;
        
        # 缓存静态资源
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
    
    # API代理
    location /api/ {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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_cache_bypass $http_upgrade;
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
    
    # 文件上传大小限制
    client_max_body_size 10M;
    
    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
}

4.2 启用站点

# 创建软链接
sudo ln -s /etc/nginx/sites-available/niumall /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重载配置
sudo systemctl reload nginx

5. SSL证书配置

5.1 安装Certbot

# Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx -y

5.2 获取SSL证书

# 自动配置SSL
sudo certbot --nginx -d your-domain.com

# 设置自动续期
sudo crontab -e
# 添加以下行
0 12 * * * /usr/bin/certbot renew --quiet

6. 应用启动

6.1 PM2配置文件

cd /var/www/niumall/backend
nano ecosystem.config.js
module.exports = {
  apps: [{
    name: 'niumall-api',
    script: 'src/main.js',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: '/var/log/niumall/error.log',
    out_file: '/var/log/niumall/out.log',
    log_file: '/var/log/niumall/combined.log',
    time: true,
    max_memory_restart: '1G',
    node_args: '--max_old_space_size=1024'
  }]
};

6.2 启动应用

# 创建日志目录
sudo mkdir -p /var/log/niumall
sudo chown $USER:$USER /var/log/niumall

# 启动应用
pm2 start ecosystem.config.js

# 保存PM2配置
pm2 save

容器化部署

1. Docker部署

1.1 Dockerfile配置

后端Dockerfile

# backend/Dockerfile
FROM node:18-alpine

WORKDIR /app

# 复制package文件
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制源代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动应用
CMD ["npm", "start"]

前端Dockerfile

# frontend/Dockerfile
FROM node:18-alpine as builder

WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

1.2 Docker Compose配置

# docker-compose.yml
version: '3.8'

services:
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    networks:
      - niumall-network

  backend:
    build: ./backend
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=database
      - DB_PORT=3306
      - DB_USERNAME=niumall
      - DB_PASSWORD=password
      - DB_NAME=niumall
      - JWT_SECRET=your_jwt_secret
    depends_on:
      - database
    networks:
      - niumall-network
    volumes:
      - ./logs:/app/logs

  database:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=niumall
      - MYSQL_USER=niumall
      - MYSQL_PASSWORD=password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - niumall-network

  redis:
    image: redis:6-alpine
    ports:
      - "6379:6379"
    networks:
      - niumall-network

volumes:
  mysql_data:

networks:
  niumall-network:
    driver: bridge

1.3 部署命令

# 构建并启动服务
docker-compose up -d

# 查看服务状态
docker-compose ps

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

2. Kubernetes部署

2.1 命名空间

# k8s/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: niumall

2.2 配置映射

# k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: niumall-config
  namespace: niumall
data:
  NODE_ENV: "production"
  DB_HOST: "mysql-service"
  DB_PORT: "3306"
  DB_NAME: "niumall"

2.3 密钥

# k8s/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: niumall-secret
  namespace: niumall
type: Opaque
data:
  DB_PASSWORD: <base64-encoded-password>
  JWT_SECRET: <base64-encoded-jwt-secret>

2.4 部署配置

# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: niumall-backend
  namespace: niumall
spec:
  replicas: 3
  selector:
    matchLabels:
      app: niumall-backend
  template:
    metadata:
      labels:
        app: niumall-backend
    spec:
      containers:
      - name: backend
        image: niumall/backend:latest
        ports:
        - containerPort: 3000
        envFrom:
        - configMapRef:
            name: niumall-config
        - secretRef:
            name: niumall-secret
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"

监控和日志

1. 应用监控

1.1 PM2监控

# 查看应用状态
pm2 status

# 查看详细信息
pm2 show niumall-api

# 查看日志
pm2 logs niumall-api

# 重启应用
pm2 restart niumall-api

# 重载应用(零停机)
pm2 reload niumall-api

1.2 系统监控

# 安装htop
sudo apt install htop -y

# 查看系统资源
htop

# 查看磁盘使用
df -h

# 查看内存使用
free -h

# 查看网络连接
netstat -tulpn

2. 日志管理

2.1 日志轮转配置

# 创建logrotate配置
sudo nano /etc/logrotate.d/niumall
/var/log/niumall/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 $USER $USER
    postrotate
        pm2 reloadLogs
    endscript
}

2.2 日志分析

# 查看错误日志
tail -f /var/log/niumall/error.log

# 分析访问日志
tail -f /var/log/nginx/access.log

# 统计API调用
grep "POST /api" /var/log/nginx/access.log | wc -l

3. 性能监控

3.1 安装监控工具

# 安装Node.js性能监控
npm install -g clinic

# 使用clinic监控
clinic doctor -- node src/main.js

3.2 数据库监控

-- 查看慢查询
SHOW VARIABLES LIKE 'slow_query_log';
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

-- 查看连接数
SHOW STATUS LIKE 'Threads_connected';

-- 查看查询缓存
SHOW STATUS LIKE 'Qcache%';

备份和恢复

1. 数据库备份

1.1 自动备份脚本

#!/bin/bash
# backup.sh

# 配置变量
DB_NAME="niumall"
DB_USER="niumall"
DB_PASS="password"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/niumall_$DATE.sql

# 压缩备份文件
gzip $BACKUP_DIR/niumall_$DATE.sql

# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete

echo "Backup completed: niumall_$DATE.sql.gz"

1.2 设置定时备份

# 添加执行权限
chmod +x backup.sh

# 设置定时任务
crontab -e
# 每天凌晨2点执行备份
0 2 * * * /path/to/backup.sh

2. 文件备份

2.1 代码备份

#!/bin/bash
# backup_code.sh

APP_DIR="/var/www/niumall"
BACKUP_DIR="/var/backups/code"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# 打包代码
tar -czf $BACKUP_DIR/niumall_code_$DATE.tar.gz -C $APP_DIR .

# 删除30天前的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

3. 数据恢复

3.1 数据库恢复

# 解压备份文件
gunzip niumall_20240101_020000.sql.gz

# 恢复数据库
mysql -u niumall -p niumall < niumall_20240101_020000.sql

3.2 代码恢复

# 停止应用
pm2 stop niumall-api

# 备份当前代码
mv /var/www/niumall /var/www/niumall.bak

# 解压备份代码
mkdir /var/www/niumall
tar -xzf niumall_code_20240101_020000.tar.gz -C /var/www/niumall

# 重启应用
pm2 start niumall-api

安全配置

1. 防火墙配置

1.1 UFW配置

# 启用UFW
sudo ufw enable

# 允许SSH
sudo ufw allow ssh

# 允许HTTP和HTTPS
sudo ufw allow 80
sudo ufw allow 443

# 查看状态
sudo ufw status

1.2 iptables配置

# 基本规则
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -j DROP

# 保存规则
sudo iptables-save > /etc/iptables/rules.v4

2. 系统安全

2.1 SSH安全配置

# 编辑SSH配置
sudo nano /etc/ssh/sshd_config

# 禁用root登录
PermitRootLogin no

# 修改默认端口
Port 2222

# 禁用密码认证(使用密钥认证)
PasswordAuthentication no

# 重启SSH服务
sudo systemctl restart sshd

2.2 系统更新

# 设置自动安全更新
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades

3. 应用安全

3.1 文件权限

# 设置应用目录权限
sudo chown -R www-data:www-data /var/www/niumall
sudo chmod -R 755 /var/www/niumall

# 保护配置文件
sudo chmod 600 /var/www/niumall/backend/.env

3.2 Nginx安全配置

# 隐藏Nginx版本
server_tokens off;

# 限制请求大小
client_max_body_size 10M;

# 限制请求频率
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req zone=api burst=20 nodelay;

# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;

故障处理

1. 常见问题

1.1 应用无法启动

# 检查端口占用
sudo netstat -tulpn | grep :3000

# 检查PM2状态
pm2 status

# 查看错误日志
pm2 logs niumall-api --err

# 检查环境变量
pm2 env 0

1.2 数据库连接失败

# 检查MySQL状态
sudo systemctl status mysql

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

# 检查数据库配置
cat /var/www/niumall/backend/.env

1.3 Nginx配置错误

# 测试Nginx配置
sudo nginx -t

# 查看Nginx错误日志
sudo tail -f /var/log/nginx/error.log

# 重载Nginx配置
sudo systemctl reload nginx

2. 性能问题

2.1 内存不足

# 查看内存使用
free -h

# 查看进程内存使用
ps aux --sort=-%mem | head

# 重启应用释放内存
pm2 restart niumall-api

2.2 磁盘空间不足

# 查看磁盘使用
df -h

# 清理日志文件
sudo journalctl --vacuum-time=7d

# 清理临时文件
sudo apt autoremove -y
sudo apt autoclean

3. 应急处理

3.1 服务降级

# 停止非关键服务
pm2 stop non-critical-service

# 启用维护模式
sudo cp maintenance.html /var/www/html/index.html

3.2 快速回滚

# 回滚到上一个版本
pm2 stop niumall-api
git checkout HEAD~1
npm install
pm2 start niumall-api

运维脚本

1. 健康检查脚本

#!/bin/bash
# health_check.sh

# 检查应用状态
if ! pm2 describe niumall-api > /dev/null 2>&1; then
    echo "Application is down, restarting..."
    pm2 restart niumall-api
fi

# 检查数据库连接
if ! mysqladmin ping -h localhost --silent; then
    echo "Database is down, please check MySQL service"
    sudo systemctl restart mysql
fi

# 检查磁盘空间
DISK_USAGE=$(df / | grep -vE '^Filesystem' | awk '{print $5}' | sed 's/%//g')
if [ $DISK_USAGE -gt 80 ]; then
    echo "Disk usage is above 80%: ${DISK_USAGE}%"
fi

2. 部署脚本

#!/bin/bash
# deploy.sh

set -e

APP_DIR="/var/www/niumall"
BACKUP_DIR="/var/backups/deployments"
DATE=$(date +%Y%m%d_%H%M%S)

echo "Starting deployment..."

# 创建备份
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/niumall_$DATE.tar.gz -C $APP_DIR .

# 拉取最新代码
cd $APP_DIR
git pull origin main

# 安装依赖
cd backend
npm install --production

# 运行数据库迁移
npm run migrate

# 构建前端
cd ../frontend
npm install
npm run build

# 重启应用
pm2 reload niumall-api

echo "Deployment completed successfully!"

总结

本文档提供了活牛采购智能数字化系统的完整部署和运维指南,包括环境准备、代码部署、监控告警、备份恢复、安全配置和故障处理等各个方面。通过遵循本文档的指导,可以确保系统的稳定运行和高效维护。

在实际运维过程中,建议:

  1. 定期检查系统状态和性能指标
  2. 及时更新系统和应用补丁
  3. 定期测试备份和恢复流程
  4. 建立完善的监控告警机制
  5. 制定详细的应急响应预案

通过持续的运维优化和改进,可以不断提升系统的可靠性和性能表现。