-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
175 lines (161 loc) · 5.81 KB
/
Copy pathdocker-compose.yml
File metadata and controls
175 lines (161 loc) · 5.81 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
# 一脉 Axon 统一运维控制面 —— 本地全栈编排(T0.8)
# 一键拉起:postgres / redis / 后端(api+worker+beat+flower)/ 前端 /
# prometheus / grafana / alertmanager。生产部署另行裁剪,勿直接用于线上。
# 显式项目名:仓库目录名含中文,compose 无法从目录推导,须固定
name: yimai-axon
# 构建期代理透传:部分部署环境(如内网服务器)容器无直连外网能力(DNS 亦不通),
# npm/uv 装依赖必须经宿主机代理出网。HTTP_PROXY 等为 Docker 预定义 build-arg,
# 无需在 Dockerfile 声明 ARG 即注入 RUN 步骤,且不写入镜像历史。
# 直连网络环境下变量为空,行为等同未设置,两端通用。
# 仅构建期生效;运行期容器间互访(api→prometheus 等)不得走代理,故不进 environment。
x-build-proxy: &build-proxy
HTTP_PROXY: ${HTTP_PROXY:-}
HTTPS_PROXY: ${HTTPS_PROXY:-}
NO_PROXY: ${NO_PROXY:-}
services:
postgres:
image: postgres:15-alpine
environment:
POSTGRES_USER: ${POSTGRES_USER:-yimai}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-yimai}
POSTGRES_DB: ${POSTGRES_DB:-yimai}
ports:
- "${POSTGRES_PORT:-5432}:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-yimai} -d ${POSTGRES_DB:-yimai}"]
interval: 5s
timeout: 3s
retries: 10
redis:
image: redis:7-alpine
command: ["redis-server", "--appendonly", "yes"]
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
# 迁移先跑一次,API/worker 依赖其成功完成再启动,避免竞态建表
migrate:
build:
context: ./backend
args: *build-proxy
environment:
YIMAI_DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-yimai}:${POSTGRES_PASSWORD:-yimai}@postgres:5432/${POSTGRES_DB:-yimai}
# 首次部署灌种子管理员;可在 .env 覆盖,默认 admin/admin(登录后请立即改密)
YIMAI_SEED_ADMIN_USER: ${YIMAI_SEED_ADMIN_USER:-admin}
YIMAI_SEED_ADMIN_PASSWORD: ${YIMAI_SEED_ADMIN_PASSWORD:-admin}
# 建表后灌种子;seed 幂等(账号已存在则跳过),重复执行安全
command: ["sh", "-c", "alembic upgrade head && python -m app.cli.seed"]
depends_on:
postgres:
condition: service_healthy
restart: "no"
api:
build:
context: ./backend
args: *build-proxy
environment:
YIMAI_DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-yimai}:${POSTGRES_PASSWORD:-yimai}@postgres:5432/${POSTGRES_DB:-yimai}
YIMAI_REDIS_URL: redis://redis:6379/0
YIMAI_JWT_SECRET: ${YIMAI_JWT_SECRET:-change-me-in-prod-please-32bytes-min}
YIMAI_SECRET_MASTER_KEY: ${YIMAI_SECRET_MASTER_KEY:-}
YIMAI_LOG_JSON: "true"
YIMAI_PROMETHEUS_BASE_URL: http://prometheus:9090
# node_exporter 自举写 file_sd 的目标文件(T1.13);与 prometheus 共享同一挂载
YIMAI_PROMETHEUS_TARGETS_FILE: /etc/prometheus/targets/nodes.json
ports:
- "${API_PORT:-8000}:8000"
volumes:
# 控制面写 file_sd 目标,prometheus 只读消费(见 prometheus 服务挂载)
- ./ops/prometheus/targets:/etc/prometheus/targets
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
migrate:
condition: service_completed_successfully
command:
["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
worker:
build:
context: ./backend
args: *build-proxy
environment:
YIMAI_DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-yimai}:${POSTGRES_PASSWORD:-yimai}@postgres:5432/${POSTGRES_DB:-yimai}
YIMAI_REDIS_URL: redis://redis:6379/0
depends_on:
redis:
condition: service_healthy
migrate:
condition: service_completed_successfully
command: ["celery", "-A", "app.workers.celery_app", "worker", "--loglevel=info"]
beat:
build:
context: ./backend
args: *build-proxy
environment:
YIMAI_DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-yimai}:${POSTGRES_PASSWORD:-yimai}@postgres:5432/${POSTGRES_DB:-yimai}
YIMAI_REDIS_URL: redis://redis:6379/0
depends_on:
redis:
condition: service_healthy
command: ["celery", "-A", "app.workers.celery_app", "beat", "--loglevel=info"]
flower:
build:
context: ./backend
args: *build-proxy
environment:
YIMAI_REDIS_URL: redis://redis:6379/0
ports:
- "${FLOWER_PORT:-5555}:5555"
depends_on:
redis:
condition: service_healthy
command: ["celery", "-A", "app.workers.celery_app", "flower", "--port=5555"]
frontend:
build:
context: ./frontend
args: *build-proxy
ports:
- "${FRONTEND_PORT:-5173}:80"
depends_on:
- api
prometheus:
image: prom/prometheus:v2.54.1
volumes:
- ./ops/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./ops/prometheus/targets:/etc/prometheus/targets:ro
- prometheus_data:/prometheus
ports:
- "${PROMETHEUS_PORT:-9090}:9090"
alertmanager:
image: prom/alertmanager:v0.27.0
volumes:
- ./ops/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
ports:
- "${ALERTMANAGER_PORT:-9093}:9093"
grafana:
image: grafana/grafana:11.2.0
environment:
GF_SECURITY_ADMIN_USER: ${GRAFANA_USER:-admin}
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin}
GF_USERS_ALLOW_SIGN_UP: "false"
volumes:
- ./ops/grafana/provisioning:/etc/grafana/provisioning:ro
- grafana_data:/var/lib/grafana
ports:
- "${GRAFANA_PORT:-3000}:3000"
depends_on:
- prometheus
volumes:
postgres_data:
redis_data:
prometheus_data:
grafana_data: