-
Notifications
You must be signed in to change notification settings - Fork 383
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
196 lines (186 loc) · 7.02 KB
/
docker-compose.yml
File metadata and controls
196 lines (186 loc) · 7.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
services:
# =========================================
# 1. PostgreSQL 数据库服务
# -----------------------------------------
# 作用:
# - 存储业务数据(用户、简历信息等)
# - 存储向量数据(基于 pgvector 插件),用于 RAG(检索增强生成)知识库检索
#
# 教程知识点:
# - 选用 pgvector/pgvector 镜像而不是标准的 postgres 镜像,是为了获得向量搜索能力。
# - 向量数据库是 LLM 应用开发中的核心基础设施。
# =========================================
postgres:
# 使用带有 pgvector 插件的 PostgreSQL 16 镜像
image: pgvector/pgvector:pg16
container_name: interview-postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
POSTGRES_DB: interview_guide
volumes:
# 数据持久化:确保容器重启或删除后,数据库数据不丢失
- postgres_data:/var/lib/postgresql/data
# 初始化脚本:容器首次启动时会自动执行 /docker-entrypoint-initdb.d/ 下的 .sql 文件
- ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
# 健康检查:
# 后端服务(app)需要等待数据库完全启动并准备好连接后才能启动。
# 这里通过 pg_isready 命令检测数据库状态。
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
# =========================================
# 2. Redis 缓存与消息队列服务
# -----------------------------------------
# 作用:
# - 缓存:存储 Session、临时数据,提升系统性能
# - 消息队列:利用 Redis Stream 实现异步任务处理(如简历分析、文档向量化)
#
# 教程知识点:
# - 在轻量级架构中,Redis Stream 是 Kafka/RabbitMQ 的优秀替代方案,运维成本更低。
# =========================================
redis:
image: redis:7
container_name: interview-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
# =========================================
# 3. MinIO 对象存储服务
# -----------------------------------------
# 作用:
# - 存储非结构化数据:用户上传的简历(PDF/Word)、头像、知识库文档等
#
# 教程知识点:
# - MinIO 兼容 AWS S3 协议,这意味着代码中使用 S3 SDK 即可无缝切换到云厂商的对象存储。
# - 端口说明:
# - 9000: API 端口,代码通过此端口上传/下载文件
# - 9001: 控制台端口,浏览器访问此端口管理文件
# =========================================
minio:
image: minio/minio
container_name: interview-minio
# 启动命令:指定数据目录和控制台地址
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 5s
timeout: 3s
retries: 5
# =========================================
# 4. MinIO 初始化任务 (Init Container Pattern)
# -----------------------------------------
# 作用:
# - 自动创建项目所需的存储桶 (Bucket)
# - 设置存储桶的访问权限
#
# 教程知识点:
# - "初始化容器"模式:这是一个短生命周期的容器,任务完成后自动退出。
# - 解决了"谁来创建 Bucket"的问题,实现了基础设施的自动化配置,无需手动操作。
# =========================================
createbuckets:
image: minio/mc
depends_on:
minio:
condition: service_healthy # 必须等待 MinIO 服务健康(不仅仅是启动)
entrypoint: >
/bin/sh -c "
# 1. 配置 MinIO 客户端别名 (myminio) 连接到 minio 服务
/usr/bin/mc alias set myminio http://minio:9000 minioadmin minioadmin;
# 2. 创建名为 interview-guide 的存储桶
/usr/bin/mc mb myminio/interview-guide;
# 3. 设置该存储桶为公共读权限(方便前端直接访问图片等资源)
/usr/bin/mc anonymous set public myminio/interview-guide;
exit 0;
"
# =========================================
# 5. 后端应用服务 (Spring Boot)
# -----------------------------------------
# 作用:
# - 提供 RESTful API
# - 处理核心业务逻辑(简历分析、模拟面试、RAG)
# =========================================
app:
build:
context: .
dockerfile: app/Dockerfile
container_name: interview-app
# 依赖管理:确保基础设施准备好后再启动后端
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
minio:
condition: service_healthy
createbuckets:
condition: service_completed_successfully # 等待初始化任务完成
environment:
# === 数据库连接 ===
# 使用服务名 'postgres' 作为主机名,Docker 内部 DNS 会自动解析
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: interview_guide
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
# === Redis 连接 ===
REDIS_HOST: redis
REDIS_PORT: 6379
# === 对象存储配置 ===
# 注意:后端在容器内访问 MinIO,使用 http://minio:9000
APP_STORAGE_ENDPOINT: http://minio:9000
APP_STORAGE_ACCESS_KEY: minioadmin
APP_STORAGE_SECRET_KEY: minioadmin
APP_STORAGE_BUCKET: interview-guide
APP_STORAGE_REGION: us-east-1
# === AI 模型配置 (必须配置) ===
# 这里的变量值来自宿主机的环境变量或 .env 文件
AI_BAILIAN_API_KEY: ${AI_BAILIAN_API_KEY}
AI_MODEL: ${AI_MODEL:-qwen-plus}
# === 面试参数配置 ===
APP_INTERVIEW_FOLLOW_UP_COUNT: ${APP_INTERVIEW_FOLLOW_UP_COUNT:-1}
APP_INTERVIEW_EVALUATION_BATCH_SIZE: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:-8}
ports:
- "8080:8080"
# =========================================
# 6. 前端应用服务 (Vue/React + Nginx)
# -----------------------------------------
# 作用:
# - 提供用户界面
# - 反向代理 API 请求(通常在 Nginx 配置中处理)
# =========================================
frontend:
build: ./frontend
container_name: interview-frontend
depends_on:
- app
ports:
- "80:80"
# =========================================
# 定义 Docker 卷 (Volumes)
# -----------------------------------------
# 作用:声明命名卷,用于数据持久化。
# 即使删除了容器 (docker-compose down),这些卷中的数据依然存在。
# =========================================
volumes:
postgres_data:
redis_data:
minio_data: