# 后端启动配置问题修复

## 问题描述

后端启动时报错：
```
Could not resolve placeholder 'spring.datasource.druid.initialSize'
```

## 原因分析

若依项目使用了 Druid 数据源，配置在 `application-druid.yml` 中。环境变量无法直接覆盖 Druid 的嵌套配置属性。

## 解决方案

### 1. 创建启动脚本

已创建 [entrypoint.sh](backend/entrypoint.sh)，使用 Java 系统属性覆盖配置：

```bash
#!/bin/sh

exec java \
    -Dspring.profiles.active=prod \
    -Dspring.datasource.druid.master.url="${SPRING_DATASOURCE_URL}" \
    -Dspring.datasource.druid.master.username="${SPRING_DATASOURCE_USERNAME}" \
    -Dspring.datasource.druid.master.password="${SPRING_DATASOURCE_PASSWORD}" \
    -Dspring.redis.host="${SPRING_REDIS_HOST}" \
    -Dspring.redis.port="${SPRING_REDIS_PORT}" \
    -jar app.jar
```

### 2. 修改 Dockerfile

已修改 [backend/Dockerfile](backend/Dockerfile)，使用启动脚本：

```dockerfile
# 复制启动脚本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# 启动应用
ENTRYPOINT ["/entrypoint.sh"]
```

## 重新部署

### 1. 停止并删除旧容器
```bash
docker stop wecom-backend
docker rm wecom-backend
```

### 2. 重新构建并启动
```bash
cd deploy
docker compose up -d --build backend
```

### 3. 查看日志
```bash
docker compose logs -f backend
```

## 验证启动成功

查看日志中是否有以下内容：
```
Started RuoYiApplication in X seconds
```

## 其他可能的问题

### 1. 数据库连接失败

检查 MySQL 容器是否允许远程连接：
```bash
docker exec -it mysql-jijin-test mysql -uroot -p

# 授权远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'jiong1114';
FLUSH PRIVILEGES;
```

### 2. 数据库不存在

创建数据库：
```bash
docker exec -it mysql-jijin-test mysql -uroot -pjiong1114

CREATE DATABASE IF NOT EXISTS `ry-vue` DEFAULT CHARACTER SET utf8mb4;
```

### 3. Redis 连接失败

检查 Redis 是否允许远程连接：
```bash
docker exec -it redis redis-cli CONFIG GET bind

# 如果绑定了 127.0.0.1，需要修改
docker exec -it redis redis-cli CONFIG SET bind "0.0.0.0"
```

### 4. 端口配置不匹配

注意 docker-compose.yml 中配置的是 8888 端口：
```yaml
ports:
  - "8888:8888"  # 宿主机:容器
```

但 Dockerfile 暴露的是 8080 端口。需要修改其中一个保持一致。

#### 方案 A: 修改 docker-compose.yml（推荐）
```yaml
ports:
  - "8888:8080"  # 宿主机 8888 映射到容器 8080
```

#### 方案 B: 修改应用端口
在 docker-compose.yml 中添加环境变量：
```yaml
environment:
  - SERVER_PORT=8888
```

## 完整的 docker-compose.yml 配置

```yaml
version: '3.8'

services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: wecom-backend
    restart: always
    ports:
      - "8888:8080"  # 宿主机 8888 映射到容器 8080
    volumes:
      - upload_data:/home/ruoyi/uploadPath
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - TZ=Asia/Shanghai
      - SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3316/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=jiong1114
      - SPRING_REDIS_HOST=host.docker.internal
      - SPRING_REDIS_PORT=6379
      - SPRING_REDIS_PASSWORD=
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - wecom-network
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/"]
      interval: 30s
      timeout: 10s
      retries: 3

  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    container_name: wecom-frontend
    restart: always
    ports:
      - "8889:80"
    depends_on:
      - backend
    networks:
      - wecom-network

volumes:
  upload_data:
    driver: local

networks:
  wecom-network:
    driver: bridge
```

注意 healthcheck 中使用的是容器内部端口 8080。
