Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
124 lines (118 loc) · 3.5 KB
/
Copy pathdocker-compose.yml
File metadata and controls
124 lines (118 loc) · 3.5 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
services:
postgres:
image: postgres:16-alpine
container_name: blog-postgres
environment:
POSTGRES_USER: ${POSTGRES_USER:-blog}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-blog123}
POSTGRES_DB: ${POSTGRES_DB:-blog}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-blog}"]
interval: 5s
timeout: 3s
retries: 5
redis:
image: redis:7-alpine
container_name: blog-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
rabbitmq:
image: rabbitmq:3.13-management-alpine
container_name: blog-rabbitmq
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-guest}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-guest}
ports:
- "5672:5672" # AMQP 协议端口
- "15672:15672" # 管理面板
volumes:
- rabbitmq_data:/var/lib/rabbitmq
healthcheck:
test: ["CMD", "rabbitmqctl", "status"]
interval: 10s
timeout: 5s
retries: 5
elasticsearch:
image: elasticsearch:7.17.24
container_name: blog-elasticsearch
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms256m -Xmx256m
- xpack.security.enabled=false
ports:
- "9200:9200"
volumes:
- es_data:/usr/share/elasticsearch/data
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"]
interval: 10s
timeout: 5s
retries: 10
backend:
build:
context: ./backend
dockerfile: Dockerfile
container_name: blog-backend
ports:
- "8080:8080"
environment:
# JWT 密钥必须通过宿主机 .env 注入,缺失时 docker compose 将直接报错
- JWT_SECRET=${JWT_SECRET:?JWT_SECRET 未设置,请在 .env 中配置至少 32 位随机字符串}
# 是否启动时自动执行 schema 迁移(生产/多副本推荐关闭,改为手动跑 cmd/migrate)
- AUTO_MIGRATE_ON_STARTUP=${AUTO_MIGRATE_ON_STARTUP:-true}
# config.docker.yaml 里这些连接信息为空,必须由环境变量注入(与基础设施服务保持一致)
- POSTGRES_HOST=postgres
- POSTGRES_USER=${POSTGRES_USER:-blog}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-blog123}
- POSTGRES_DB=${POSTGRES_DB:-blog}
- REDIS_HOST=redis
- RABBITMQ_HOST=rabbitmq
- RABBITMQ_USER=${RABBITMQ_USER:-guest}
- RABBITMQ_PASSWORD=${RABBITMQ_PASSWORD:-guest}
- ELASTICSEARCH_URL=http://elasticsearch:9200
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
elasticsearch:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:8080/health || exit 1"]
interval: 10s
timeout: 5s
retries: 5
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
args:
- NEXT_PUBLIC_API_BASE=/api/v1
- BACKEND_URL=http://backend:8080
container_name: blog-frontend
environment:
# Next 侧 rewrites 的目标:服务端反向代理到后端容器
- BACKEND_URL=http://backend:8080
ports:
- "3000:3000"
depends_on:
backend:
condition: service_healthy
volumes:
postgres_data:
redis_data:
rabbitmq_data:
es_data: