-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
179 lines (172 loc) · 6.49 KB
/
docker-compose.yml
File metadata and controls
179 lines (172 loc) · 6.49 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
version: "2.1"
services:
# =========================================
# 1. PostgreSQL 数据库服务
# -----------------------------------------
# 作用:
# - 存储业务数据(用户、简历信息等)
# - 存储向量数据(基于 pgvector 插件),用于 RAG(检索增强生成)知识库检索
#
# 教程知识点:
# - 选用 pgvector/pgvector 镜像而不是标准的 postgres 镜像,是为了获得向量搜索能力。
# - 向量数据库是 LLM 应用开发中的核心基础设施。
# =========================================
postgres:
# 使用带有 pgvector 插件的 PostgreSQL 16 镜像
image: ${POSTGRES_IMAGE:-pgvector/pgvector:pg16}
container_name: ruici-postgres
env_file:
- .env
environment:
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-302304}
POSTGRES_DB: ${POSTGRES_DB:-ruici_ai_platform}
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_USER:-postgres}"]
interval: 5s
timeout: 5s
retries: 5
# =========================================
# 2. Redis 缓存与消息队列服务
# -----------------------------------------
# 作用:
# - 缓存:存储 Session、临时数据,提升系统性能
# - 消息队列:利用 Redis Stream 实现异步任务处理(如简历分析、文档向量化)
#
# 教程知识点:
# - 在轻量级架构中,Redis Stream 是 Kafka/RabbitMQ 的优秀替代方案,运维成本更低。
# =========================================
redis:
image: ${REDIS_IMAGE:-redis:6.2.14}
container_name: ruici-redis
env_file:
- .env
command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD:-302304}"]
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD-SHELL", "redis-cli -a ${REDIS_PASSWORD:-302304} ping | grep PONG"]
interval: 5s
timeout: 3s
retries: 5
# =========================================
# 3. MinIO 对象存储服务
# -----------------------------------------
# 作用:
# - 存储非结构化数据:用户上传的简历(PDF/Word)、头像、知识库文档等
#
# 教程知识点:
# - MinIO 兼容 AWS S3 协议,这意味着代码中使用 S3 SDK 即可无缝切换到云厂商的对象存储。
# - 端口说明:
# - 9000: API 端口,代码通过此端口上传/下载文件
# - 9001: 控制台端口,浏览器访问此端口管理文件
# =========================================
minio:
image: ${MINIO_IMAGE:-minio/minio}
container_name: ruici-minio
command: ["server", "/data", "--console-address", ":9001"]
env_file:
- .env
environment:
MINIO_ROOT_USER: ${APP_STORAGE_ACCESS_KEY:-minioadmin}
MINIO_ROOT_PASSWORD: ${APP_STORAGE_SECRET_KEY:-minioadmin}
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
# =========================================
# 4. 对象存储初始化任务 (Init Container Pattern)
# -----------------------------------------
# 作用:
# - 自动创建项目所需的存储桶 (Bucket)
# - 设置存储桶的访问权限
#
# 教程知识点:
# - "初始化容器"模式:这是一个短生命周期的容器,任务完成后自动退出。
# - 解决了"谁来创建 Bucket"的问题,实现了基础设施的自动化配置,无需手动操作。
# =========================================
createbuckets:
image: ${MINIO_MC_IMAGE:-minio/mc}
env_file:
- .env
depends_on:
- minio
entrypoint: >
/bin/sh -c "
# 1. 配置 S3 客户端别名连接对象存储
/usr/bin/mc alias set mys3 http://minio:9000 ${APP_STORAGE_ACCESS_KEY:-minioadmin} ${APP_STORAGE_SECRET_KEY:-minioadmin};
# 2. 创建名为 ruici-ai-platform 的存储桶
/usr/bin/mc mb --ignore-existing mys3/${APP_STORAGE_BUCKET:-ruici-ai-platform};
# 3. 设置该存储桶为公共读权限(方便前端直接访问图片等资源)
/usr/bin/mc anonymous set public mys3/${APP_STORAGE_BUCKET:-ruici-ai-platform};
exit 0;
"
# =========================================
# 5. 后端应用服务 (Spring Boot)
# -----------------------------------------
# 作用:
# - 提供 RESTful API
# - 处理核心业务逻辑(简历分析、模拟面试、RAG)
# =========================================
app:
build:
context: .
dockerfile: Dockerfile
args:
BUILDER_IMAGE: ${BACKEND_BUILDER_IMAGE:-maven:3.9.11-eclipse-temurin-21}
RUNTIME_IMAGE: ${BACKEND_RUNTIME_IMAGE:-eclipse-temurin:21-jre}
container_name: ruici-app
env_file:
- .env
# 依赖管理:确保基础设施准备好后再启动后端
depends_on:
- postgres
- redis
- minio
volumes:
- ./.env:/app/.env:ro
ports:
- "8080:8080"
# =========================================
# 6. 前端应用服务 (Vue/React + Nginx)
# -----------------------------------------
# 作用:
# - 提供用户界面
# - 反向代理 API 请求(通常在 Nginx 配置中处理)
# =========================================
frontend:
build:
context: ./frontend
args:
BUILDER_IMAGE: ${FRONTEND_BUILDER_IMAGE:-node:20-alpine}
RUNTIME_IMAGE: ${FRONTEND_RUNTIME_IMAGE:-nginx:alpine}
NPM_REGISTRY: ${FRONTEND_NPM_REGISTRY:-https://registry.npmjs.org/}
FRONTEND_NODE_OPTIONS: ${FRONTEND_NODE_OPTIONS:---max-old-space-size=512}
container_name: ruici-frontend
depends_on:
- app
ports:
- "80:80"
# =========================================
# 定义 Docker 卷 (Volumes)
# -----------------------------------------
# 作用:声明命名卷,用于数据持久化。
# 即使删除了容器 (docker-compose down),这些卷中的数据依然存在。
# =========================================
volumes:
postgres_data:
redis_data:
minio_data: