wecom-dashboards/deploy/TROUBLESHOOTING.md

185 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 后端启动配置问题修复
## 问题描述
后端启动时报错:
```
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。