2025-09-19 18:30:34 +08:00
|
|
|
# 活牛采购智能数字化系统 - 部署运维指南
|
|
|
|
|
|
|
|
|
|
## 版本历史
|
|
|
|
|
| 版本 | 日期 | 作者 | 变更说明 |
|
|
|
|
|
|------|------|------|----------|
|
|
|
|
|
| v1.0 | 2024-12-20 | 运维团队 | 初版部署运维指南 |
|
|
|
|
|
|
|
|
|
|
## 1. 环境要求
|
|
|
|
|
|
|
|
|
|
### 1.1 硬件要求
|
|
|
|
|
|
|
|
|
|
#### 生产环境最低配置
|
|
|
|
|
| 组件 | CPU | 内存 | 存储 | 网络 |
|
|
|
|
|
|------|-----|------|------|------|
|
|
|
|
|
| Web服务器 | 4核 | 8GB | 100GB SSD | 1Gbps |
|
|
|
|
|
| 应用服务器 | 8核 | 16GB | 200GB SSD | 1Gbps |
|
|
|
|
|
| 数据库服务器 | 8核 | 32GB | 500GB SSD | 1Gbps |
|
|
|
|
|
| Redis缓存 | 4核 | 8GB | 50GB SSD | 1Gbps |
|
|
|
|
|
| 文件存储 | 4核 | 8GB | 2TB HDD | 1Gbps |
|
|
|
|
|
|
|
|
|
|
#### 推荐配置
|
|
|
|
|
| 组件 | CPU | 内存 | 存储 | 网络 |
|
|
|
|
|
|------|-----|------|------|------|
|
|
|
|
|
| Web服务器 | 8核 | 16GB | 200GB SSD | 10Gbps |
|
|
|
|
|
| 应用服务器 | 16核 | 32GB | 500GB SSD | 10Gbps |
|
|
|
|
|
| 数据库服务器 | 16核 | 64GB | 1TB SSD | 10Gbps |
|
|
|
|
|
| Redis缓存 | 8核 | 16GB | 100GB SSD | 10Gbps |
|
|
|
|
|
| 文件存储 | 8核 | 16GB | 5TB SSD | 10Gbps |
|
|
|
|
|
|
|
|
|
|
### 1.2 软件要求
|
|
|
|
|
|
|
|
|
|
#### 操作系统
|
|
|
|
|
- **推荐**: Ubuntu 20.04 LTS / CentOS 8 / RHEL 8
|
|
|
|
|
- **最低**: Ubuntu 18.04 LTS / CentOS 7
|
|
|
|
|
|
|
|
|
|
#### 基础软件
|
|
|
|
|
```bash
|
|
|
|
|
# 必需软件版本
|
|
|
|
|
Node.js >= 18.0.0
|
|
|
|
|
npm >= 8.0.0
|
|
|
|
|
MySQL >= 8.0
|
|
|
|
|
Redis >= 6.0
|
|
|
|
|
Nginx >= 1.18
|
|
|
|
|
Docker >= 20.10
|
|
|
|
|
Docker Compose >= 2.0
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 2. 快速部署
|
|
|
|
|
|
|
|
|
|
### 2.1 一键部署脚本
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
# quick_deploy.sh - 活牛采购系统一键部署脚本
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
echo "开始部署活牛采购智能数字化系统..."
|
|
|
|
|
|
|
|
|
|
# 检查系统
|
|
|
|
|
if [[ "$OSTYPE" != "linux-gnu"* ]]; then
|
|
|
|
|
echo "错误: 仅支持Linux系统"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# 更新系统
|
|
|
|
|
sudo apt update && sudo apt upgrade -y
|
|
|
|
|
|
|
|
|
|
# 安装基础依赖
|
|
|
|
|
sudo apt install -y curl wget git vim htop tree unzip
|
|
|
|
|
|
|
|
|
|
# 安装Node.js 18
|
|
|
|
|
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
|
|
|
|
sudo apt install -y nodejs
|
|
|
|
|
|
|
|
|
|
# 安装Docker
|
|
|
|
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
|
|
|
sudo sh get-docker.sh
|
|
|
|
|
sudo usermod -aG docker $USER
|
|
|
|
|
|
|
|
|
|
# 安装Docker Compose
|
|
|
|
|
sudo curl -L "https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
|
|
|
sudo chmod +x /usr/local/bin/docker-compose
|
|
|
|
|
|
|
|
|
|
# 创建应用目录
|
|
|
|
|
sudo mkdir -p /opt/niumall
|
|
|
|
|
sudo chown -R $USER:$USER /opt/niumall
|
|
|
|
|
|
|
|
|
|
# 克隆代码
|
|
|
|
|
cd /opt/niumall
|
|
|
|
|
git clone https://github.com/your-org/niumall.git .
|
|
|
|
|
|
|
|
|
|
# 启动服务
|
|
|
|
|
docker-compose up -d
|
|
|
|
|
|
|
|
|
|
echo "部署完成!"
|
|
|
|
|
echo "API服务: http://localhost:3000"
|
|
|
|
|
echo "管理后台: http://localhost"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.2 Docker Compose配置
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
# docker-compose.yml
|
|
|
|
|
version: '3.8'
|
|
|
|
|
|
|
|
|
|
services:
|
|
|
|
|
# MySQL数据库
|
|
|
|
|
mysql:
|
|
|
|
|
image: mysql:8.0
|
|
|
|
|
container_name: niumall-mysql
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
environment:
|
|
|
|
|
MYSQL_ROOT_PASSWORD: root_password
|
|
|
|
|
MYSQL_DATABASE: niumall
|
|
|
|
|
MYSQL_USER: niumall_user
|
|
|
|
|
MYSQL_PASSWORD: user_password
|
|
|
|
|
volumes:
|
|
|
|
|
- mysql_data:/var/lib/mysql
|
|
|
|
|
ports:
|
|
|
|
|
- "3306:3306"
|
|
|
|
|
networks:
|
|
|
|
|
- niumall-network
|
|
|
|
|
|
|
|
|
|
# Redis缓存
|
|
|
|
|
redis:
|
|
|
|
|
image: redis:7-alpine
|
|
|
|
|
container_name: niumall-redis
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
command: redis-server --requirepass redis_password
|
|
|
|
|
volumes:
|
|
|
|
|
- redis_data:/data
|
|
|
|
|
ports:
|
|
|
|
|
- "6379:6379"
|
|
|
|
|
networks:
|
|
|
|
|
- niumall-network
|
|
|
|
|
|
|
|
|
|
# 后端API服务
|
|
|
|
|
api:
|
|
|
|
|
build:
|
|
|
|
|
context: ./backend
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
container_name: niumall-api
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
environment:
|
|
|
|
|
NODE_ENV: production
|
|
|
|
|
DB_HOST: mysql
|
|
|
|
|
REDIS_HOST: redis
|
|
|
|
|
ports:
|
|
|
|
|
- "3000:3000"
|
|
|
|
|
networks:
|
|
|
|
|
- niumall-network
|
|
|
|
|
depends_on:
|
|
|
|
|
- mysql
|
|
|
|
|
- redis
|
|
|
|
|
|
|
|
|
|
# 管理后台
|
|
|
|
|
admin:
|
|
|
|
|
build:
|
|
|
|
|
context: ./admin-system
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
container_name: niumall-admin
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
ports:
|
|
|
|
|
- "80:80"
|
|
|
|
|
networks:
|
|
|
|
|
- niumall-network
|
|
|
|
|
depends_on:
|
|
|
|
|
- api
|
|
|
|
|
|
|
|
|
|
volumes:
|
|
|
|
|
mysql_data:
|
|
|
|
|
redis_data:
|
|
|
|
|
|
|
|
|
|
networks:
|
|
|
|
|
niumall-network:
|
|
|
|
|
driver: bridge
|
|
|
|
|
```
|
|
|
|
|
|
2025-09-20 15:19:59 +08:00
|
|
|
## 3. 域名配置
|
|
|
|
|
|
|
|
|
|
### 3.1 域名配置总览
|
|
|
|
|
|
|
|
|
|
| 域名类型 | 域名地址 | 用途 | 环境 |
|
|
|
|
|
|---------|---------|------|------|
|
|
|
|
|
| 后端API | `wapi.nanniwan.com` | 提供RESTful API服务 | 生产环境 |
|
|
|
|
|
| 管理后台 | `ad.nanniwan.com` | 管理员后台管理系统 | 生产环境 |
|
|
|
|
|
| 官方网站 | `www.nanniwan.com` | 产品官网和文档 | 生产环境 |
|
|
|
|
|
| 开发环境 | `localhost:3000` | 本地开发测试 | 开发环境 |
|
|
|
|
|
| 开发环境 | `localhost:5173` | Vite开发服务器 | 开发环境 |
|
|
|
|
|
|
|
|
|
|
### 3.2 配置文件更新
|
|
|
|
|
|
|
|
|
|
#### 后端配置更新
|
|
|
|
|
**文件:** `backend/src/config/config.js`
|
|
|
|
|
```javascript
|
|
|
|
|
const domainConfig = {
|
|
|
|
|
backend: 'wapi.nanniwan.com',
|
|
|
|
|
admin: 'ad.nanniwan.com',
|
|
|
|
|
website: 'www.nanniwan.com'
|
|
|
|
|
};
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### CORS配置更新
|
|
|
|
|
**文件:** `backend/src/main.js`
|
|
|
|
|
```javascript
|
|
|
|
|
app.use(cors({
|
|
|
|
|
origin: [
|
|
|
|
|
'http://localhost:3000',
|
|
|
|
|
'http://localhost:5173',
|
|
|
|
|
'https://wapi.nanniwan.com',
|
|
|
|
|
'https://ad.nanniwan.com',
|
|
|
|
|
'https://www.nanniwan.com'
|
|
|
|
|
],
|
|
|
|
|
credentials: true
|
|
|
|
|
}));
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 4. 监控与维护
|
2025-09-19 18:30:34 +08:00
|
|
|
|
2025-09-20 15:19:59 +08:00
|
|
|
### 4.1 健康检查脚本
|
2025-09-19 18:30:34 +08:00
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
# health_check.sh
|
|
|
|
|
|
|
|
|
|
echo "=== 系统健康检查 $(date) ==="
|
|
|
|
|
|
|
|
|
|
# 检查服务状态
|
|
|
|
|
services=("mysql" "redis" "api" "admin")
|
|
|
|
|
for service in "${services[@]}"; do
|
|
|
|
|
if docker ps | grep -q "niumall-$service"; then
|
|
|
|
|
echo "$service: ✓ 运行中"
|
|
|
|
|
else
|
|
|
|
|
echo "$service: ✗ 已停止"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# 检查API健康状态
|
|
|
|
|
if curl -f -s http://localhost:3000/health > /dev/null; then
|
|
|
|
|
echo "API服务: ✓ 健康"
|
|
|
|
|
else
|
|
|
|
|
echo "API服务: ✗ 异常"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# 检查系统资源
|
|
|
|
|
echo "CPU使用率: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)"
|
|
|
|
|
echo "内存使用率: $(free -m | awk 'NR==2{printf "%.2f%%\n", $3*100/$2}')"
|
|
|
|
|
echo "磁盘使用率: $(df -h | awk '$NF=="/"{printf "%s\n", $5}')"
|
|
|
|
|
|
|
|
|
|
echo "=== 检查完成 ==="
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.2 备份脚本
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
# backup.sh
|
|
|
|
|
|
|
|
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
|
|
|
BACKUP_DIR="/backup"
|
|
|
|
|
|
|
|
|
|
mkdir -p $BACKUP_DIR
|
|
|
|
|
|
|
|
|
|
# 数据库备份
|
|
|
|
|
echo "开始数据库备份..."
|
|
|
|
|
docker exec niumall-mysql mysqldump -u root -proot_password niumall > $BACKUP_DIR/niumall_$DATE.sql
|
|
|
|
|
gzip $BACKUP_DIR/niumall_$DATE.sql
|
|
|
|
|
|
|
|
|
|
# 删除7天前的备份
|
|
|
|
|
find $BACKUP_DIR -name "niumall_*.sql.gz" -mtime +7 -delete
|
|
|
|
|
|
|
|
|
|
echo "备份完成: niumall_$DATE.sql.gz"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.3 日志查看
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 查看所有服务日志
|
|
|
|
|
docker-compose logs
|
|
|
|
|
|
|
|
|
|
# 查看特定服务日志
|
|
|
|
|
docker-compose logs api
|
|
|
|
|
docker-compose logs mysql
|
|
|
|
|
|
|
|
|
|
# 实时查看日志
|
|
|
|
|
docker-compose logs -f api
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 4. 故障排除
|
|
|
|
|
|
|
|
|
|
### 4.1 常见问题
|
|
|
|
|
|
|
|
|
|
#### 服务无法启动
|
|
|
|
|
```bash
|
|
|
|
|
# 检查容器状态
|
|
|
|
|
docker-compose ps
|
|
|
|
|
|
|
|
|
|
# 查看错误日志
|
|
|
|
|
docker-compose logs [service_name]
|
|
|
|
|
|
|
|
|
|
# 重启服务
|
|
|
|
|
docker-compose restart [service_name]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 数据库连接失败
|
|
|
|
|
```bash
|
|
|
|
|
# 检查MySQL容器
|
|
|
|
|
docker exec -it niumall-mysql mysql -u root -p
|
|
|
|
|
|
|
|
|
|
# 检查网络连接
|
|
|
|
|
docker network ls
|
|
|
|
|
docker network inspect niumall_niumall-network
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 端口冲突
|
|
|
|
|
```bash
|
|
|
|
|
# 检查端口占用
|
|
|
|
|
sudo netstat -tulpn | grep :3000
|
|
|
|
|
sudo netstat -tulpn | grep :3306
|
|
|
|
|
|
|
|
|
|
# 修改docker-compose.yml中的端口映射
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 4.2 紧急恢复
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
# emergency_recovery.sh
|
|
|
|
|
|
|
|
|
|
echo "开始紧急恢复..."
|
|
|
|
|
|
|
|
|
|
# 停止所有服务
|
|
|
|
|
docker-compose down
|
|
|
|
|
|
|
|
|
|
# 清理容器和网络
|
|
|
|
|
docker system prune -f
|
|
|
|
|
|
|
|
|
|
# 重新启动服务
|
|
|
|
|
docker-compose up -d
|
|
|
|
|
|
|
|
|
|
# 等待服务启动
|
|
|
|
|
sleep 30
|
|
|
|
|
|
|
|
|
|
# 健康检查
|
|
|
|
|
./health_check.sh
|
|
|
|
|
|
|
|
|
|
echo "紧急恢复完成"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 5. 性能优化
|
|
|
|
|
|
|
|
|
|
### 5.1 数据库优化
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
-- 查看慢查询
|
|
|
|
|
SHOW VARIABLES LIKE 'slow_query_log';
|
|
|
|
|
SHOW VARIABLES LIKE 'long_query_time';
|
|
|
|
|
|
|
|
|
|
-- 分析表
|
|
|
|
|
ANALYZE TABLE orders, users, transport_tasks;
|
|
|
|
|
|
|
|
|
|
-- 优化表
|
|
|
|
|
OPTIMIZE TABLE orders, users, transport_tasks;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 5.2 缓存优化
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Redis内存使用情况
|
|
|
|
|
docker exec niumall-redis redis-cli info memory
|
|
|
|
|
|
|
|
|
|
# 清理过期键
|
|
|
|
|
docker exec niumall-redis redis-cli --scan --pattern "*" | xargs docker exec niumall-redis redis-cli del
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 6. 安全配置
|
|
|
|
|
|
|
|
|
|
### 6.1 防火墙设置
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 安装ufw
|
|
|
|
|
sudo apt install ufw
|
|
|
|
|
|
|
|
|
|
# 基本规则
|
|
|
|
|
sudo ufw default deny incoming
|
|
|
|
|
sudo ufw default allow outgoing
|
|
|
|
|
|
|
|
|
|
# 允许必要端口
|
|
|
|
|
sudo ufw allow ssh
|
|
|
|
|
sudo ufw allow 80
|
|
|
|
|
sudo ufw allow 443
|
|
|
|
|
|
|
|
|
|
# 启用防火墙
|
|
|
|
|
sudo ufw enable
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 6.2 SSL证书
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 安装Certbot
|
|
|
|
|
sudo apt install certbot
|
|
|
|
|
|
|
|
|
|
# 获取证书
|
|
|
|
|
sudo certbot certonly --standalone -d api.niumall.com -d admin.niumall.com
|
|
|
|
|
|
|
|
|
|
# 自动续期
|
|
|
|
|
echo "0 12 * * * /usr/bin/certbot renew --quiet" | sudo crontab -
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 7. 维护计划
|
|
|
|
|
|
|
|
|
|
### 7.1 定时任务
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 编辑crontab
|
|
|
|
|
crontab -e
|
|
|
|
|
|
|
|
|
|
# 添加定时任务
|
|
|
|
|
# 每天凌晨2点备份数据库
|
|
|
|
|
0 2 * * * /opt/niumall/scripts/backup.sh
|
|
|
|
|
|
|
|
|
|
# 每小时检查系统健康状态
|
|
|
|
|
0 * * * * /opt/niumall/scripts/health_check.sh >> /var/log/niumall/health.log
|
|
|
|
|
|
|
|
|
|
# 每周日凌晨清理日志
|
|
|
|
|
0 0 * * 0 docker system prune -f
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 7.2 更新流程
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
# update.sh
|
|
|
|
|
|
|
|
|
|
echo "开始更新系统..."
|
|
|
|
|
|
|
|
|
|
# 拉取最新代码
|
|
|
|
|
git pull origin main
|
|
|
|
|
|
|
|
|
|
# 重新构建镜像
|
|
|
|
|
docker-compose build
|
|
|
|
|
|
|
|
|
|
# 滚动更新
|
|
|
|
|
docker-compose up -d --no-deps api
|
|
|
|
|
docker-compose up -d --no-deps admin
|
|
|
|
|
|
|
|
|
|
# 健康检查
|
|
|
|
|
sleep 30
|
|
|
|
|
./health_check.sh
|
|
|
|
|
|
|
|
|
|
echo "更新完成"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 8. 联系信息
|
|
|
|
|
|
|
|
|
|
### 8.1 技术支持
|
|
|
|
|
|
|
|
|
|
- **运维团队**: ops@niumall.com
|
|
|
|
|
- **开发团队**: dev@niumall.com
|
|
|
|
|
- **紧急联系**: +86-138-0000-0000
|
|
|
|
|
|
|
|
|
|
### 8.2 相关文档
|
|
|
|
|
|
|
|
|
|
- [项目总览](./项目总览.md)
|
|
|
|
|
- [产品需求文档](./产品需求文档.md)
|
|
|
|
|
- [系统架构设计](./系统架构设计.md)
|
|
|
|
|
- [数据库设计](./数据库设计.md)
|
|
|
|
|
- [API接口文档](./API接口文档.md)
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
**注意**: 请根据实际环境调整配置参数,确保系统安全稳定运行。
|