# 若依项目 Docker 部署指南

## 概述

本文档说明如何使用 Docker 和 Docker Compose 部署若依项目，并通过子路径 `/ashai-wecom-test` 访问。

## 前提条件

- Docker 已安装（版本 20.10+）
- Docker Compose 已安装（版本 1.29+）
- 服务器 80 端口已被占用，需要使用其他端口（如 8081）

## 项目结构

```
wecom-dashboards/
├── Dockerfile.backend          # 后端 Dockerfile
├── docker-compose.yml          # Docker Compose 编排文件
├── ruoyi-ui/
│   ├── Dockerfile              # 前端 Dockerfile
│   └── nginx.conf              # Nginx 配置文件
├── ruoyi-admin/
│   └── src/main/resources/
│       ├── application.yml     # 后端主配置
│       └── application-prod.yml # 生产环境配置
└── sql/                        # 数据库初始化脚本
```

## 配置说明

### 1. 前端配置

前端已配置为使用子路径 `/ashai-wecom-test`：

- **vue.config.js**: `publicPath` 设置为 `/ashai-wecom-test`
- **.env.production**: `VUE_APP_BASE_API` 设置为 `/prod-api`
- **nginx.conf**: 配置了子路径访问和 API 代理

### 2. 后端配置

后端配置支持环境变量注入：

- **数据库连接**: 通过环境变量 `SPRING_DATASOURCE_URL`、`SPRING_DATASOURCE_USERNAME`、`SPRING_DATASOURCE_PASSWORD`
- **Redis 连接**: 通过环境变量 `SPRING_REDIS_HOST`、`SPRING_REDIS_PORT`
- **上传路径**: 使用 Docker 卷挂载 `/home/ruoyi/uploadPath`

### 3. Docker Compose 配置

包含以下服务：

- **mysql**: MySQL 5.7 数据库
- **redis**: Redis 6 缓存
- **backend**: Spring Boot 后端服务
- **frontend**: Nginx 前端服务

## 部署步骤

### 步骤 1: 准备数据库脚本

确保 `sql/` 目录下有数据库初始化脚本：

```bash
cd Ruoyi-Vue-2/wecom-dashboards
ls sql/
# 应该包含: ry_20250522.sql, quartz.sql, schema.sql 等
```

### 步骤 2: 修改配置（可选）

如果需要修改数据库密码或其他配置，编辑 `docker-compose.yml`：

```yaml
services:
  mysql:
    environment:
      MYSQL_ROOT_PASSWORD: your_password  # 修改数据库密码

  backend:
    environment:
      SPRING_DATASOURCE_PASSWORD: your_password  # 同步修改
```

### 步骤 3: 构建和启动服务

```bash
# 进入项目目录
cd Ruoyi-Vue-2/wecom-dashboards

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

# 查看服务状态
docker-compose ps

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

### 步骤 4: 等待服务启动

首次启动需要等待：

1. MySQL 初始化数据库（约 1-2 分钟）
2. 后端服务启动（约 30 秒）
3. 前端服务启动（约 10 秒）

查看后端日志确认启动成功：

```bash
docker-compose logs -f backend
# 看到 "Started RuoYiApplication" 表示启动成功
```

### 步骤 5: 访问应用

前端服务运行在 8081 端口，通过以下 URL 访问：

```
http://your-server-ip:8081/ashai-wecom-test
```

默认登录账号：
- 用户名: `admin`
- 密码: `admin123`

## 集成到现有 Nginx

如果你的服务器 80 端口已经有 Nginx 在运行，可以通过反向代理将请求转发到容器：

### 方案 1: Nginx 反向代理（推荐）

在你现有的 Nginx 配置中添加：

```nginx
# /etc/nginx/conf.d/ruoyi.conf 或在主配置文件中添加

server {
    listen 80;
    server_name your-domain.com;  # 替换为你的域名

    # 其他现有配置...

    # 若依项目代理
    location /ashai-wecom-test {
        proxy_pass http://localhost:8081/ashai-wecom-test;
        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 600;
        proxy_read_timeout 600;
    }
}
```

重启 Nginx：

```bash
nginx -t  # 测试配置
nginx -s reload  # 重新加载配置
```

现在可以通过以下 URL 访问：

```
http://your-domain.com/ashai-wecom-test
```

### 方案 2: 修改 Docker Compose 端口映射

如果不想使用反向代理，可以修改 `docker-compose.yml` 中的端口映射：

```yaml
services:
  frontend:
    ports:
      - "8081:80"  # 改为其他未占用的端口
```

## 常用命令

```bash
# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 重启服务
docker-compose restart

# 查看日志
docker-compose logs -f [service_name]

# 进入容器
docker-compose exec backend bash
docker-compose exec frontend sh

# 重新构建并启动
docker-compose up -d --build

# 清理所有数据（包括数据库）
docker-compose down -v
```

## 数据持久化

Docker Compose 配置了以下数据卷：

- `mysql-data`: MySQL 数据库文件
- `redis-data`: Redis 持久化数据
- `upload-data`: 文件上传目录

数据会持久化保存，即使容器重启也不会丢失。

## 备份和恢复

### 备份数据库

```bash
docker-compose exec mysql mysqldump -uroot -ppassword ruoyi > backup.sql
```

### 恢复数据库

```bash
docker-compose exec -T mysql mysql -uroot -ppassword ruoyi < backup.sql
```

### 备份上传文件

```bash
docker cp ruoyi-backend:/home/ruoyi/uploadPath ./uploadPath_backup
```

## 故障排查

### 1. 前端无法访问

检查前端容器日志：

```bash
docker-compose logs frontend
```

确认 Nginx 配置正确：

```bash
docker-compose exec frontend cat /etc/nginx/conf.d/default.conf
```

### 2. 后端无法连接数据库

检查后端日志：

```bash
docker-compose logs backend
```

确认 MySQL 已启动：

```bash
docker-compose ps mysql
```

进入 MySQL 容器检查：

```bash
docker-compose exec mysql mysql -uroot -ppassword -e "SHOW DATABASES;"
```

### 3. API 请求失败

检查 Nginx 代理配置：

```bash
docker-compose exec frontend cat /etc/nginx/conf.d/default.conf
```

确认后端服务可访问：

```bash
curl http://localhost:8080/
```

### 4. 前端静态资源 404

确认前端构建时 `publicPath` 配置正确：

```bash
# 检查 vue.config.js
cat ruoyi-ui/vue.config.js | grep publicPath
```

确认 Nginx 中的文件路径：

```bash
docker-compose exec frontend ls -la /usr/share/nginx/html/ashai-wecom-test
```

## 性能优化

### 1. 调整 JVM 参数

修改 `Dockerfile.backend`，在 `ENTRYPOINT` 中添加 JVM 参数：

```dockerfile
ENTRYPOINT ["java", "-Xms512m", "-Xmx1024m", "-jar", "app.jar"]
```

### 2. 启用 Nginx Gzip

前端 Dockerfile 已配置 gzip 压缩，确保 Nginx 配置中启用：

```nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
```

### 3. 调整数据库连接池

修改 `application-prod.yml` 中的 Druid 配置。

## 安全建议

1. **修改默认密码**: 修改 MySQL root 密码和应用管理员密码
2. **配置 Redis 密码**: 在生产环境中为 Redis 设置密码
3. **使用 HTTPS**: 配置 SSL 证书，使用 HTTPS 访问
4. **限制端口访问**: 使用防火墙限制数据库和 Redis 端口的外部访问
5. **定期备份**: 设置定时任务定期备份数据库和文件

## 更新部署

当代码更新后，重新部署：

```bash
# 拉取最新代码
git pull

# 重新构建并启动
docker-compose up -d --build

# 查看日志确认启动成功
docker-compose logs -f
```

## 联系支持

如有问题，请查看：

- 若依官方文档: http://doc.ruoyi.vip
- Docker 官方文档: https://docs.docker.com
- 项目 README: ./README.md
