-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathdocker-compose.release.yml
More file actions
304 lines (295 loc) · 11.5 KB
/
docker-compose.release.yml
File metadata and controls
304 lines (295 loc) · 11.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
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
name: cordum
services:
nats:
image: nats:2.10-alpine
restart: unless-stopped
command: ["-c", "/etc/nats/nats.release.conf"]
# No host port exposure — internal service accessible via Docker network only.
volumes:
- ./config/nats.release.conf:/etc/nats/nats.release.conf:ro
- "${CORDUM_TLS_DIR:?error: CORDUM_TLS_DIR is not set}:/etc/cordum/tls:ro"
- nats_data:/data
healthcheck:
test: ["CMD-SHELL", "nc -z localhost 4222"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
redis:
image: redis:7-alpine
restart: unless-stopped
command:
[
"redis-server",
"--appendonly",
"yes",
"--port",
"0",
"--tls-port",
"6379",
"--tls-cert-file",
"/etc/cordum/tls/server/tls.crt",
"--tls-key-file",
"/etc/cordum/tls/server/tls.key",
"--tls-ca-cert-file",
"/etc/cordum/tls/ca/ca.crt",
"--tls-auth-clients",
"yes",
"--requirepass",
"${REDIS_PASSWORD:?error: REDIS_PASSWORD is not set}",
"--aclfile",
"/etc/redis/acl.conf",
]
# No host port exposure — internal service accessible via Docker network only.
volumes:
- "${CORDUM_TLS_DIR:?error: CORDUM_TLS_DIR is not set}:/etc/cordum/tls:ro"
- "${CORDUM_REDIS_ACL_FILE:-./config/redis/acl-prod.conf}:/etc/redis/acl.conf:ro"
- redis_data:/data
healthcheck:
test: ["CMD-SHELL", "redis-cli --tls --cacert /etc/cordum/tls/ca/ca.crt --cert /etc/cordum/tls/client/tls.crt --key /etc/cordum/tls/client/tls.key -a \"$REDIS_PASSWORD\" ping | grep -q PONG"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
context-engine:
image: ghcr.io/cordum-io/cordum/context-engine:${CORDUM_VERSION:-latest}
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
environment:
CORDUM_ENV: production
REDIS_URL: "rediss://:${REDIS_PASSWORD:?error: REDIS_PASSWORD is not set}@redis:6379"
REDIS_TLS_CA: /etc/cordum/tls/ca/ca.crt
REDIS_TLS_CERT: /etc/cordum/tls/client/tls.crt
REDIS_TLS_KEY: /etc/cordum/tls/client/tls.key
REDIS_TLS_SERVER_NAME: redis
CONTEXT_ENGINE_ADDR: ":50070"
CONTEXT_ENGINE_METRICS_ADDR: ":9094"
CONTEXT_ENGINE_METRICS_PUBLIC: "true"
CONTEXT_ENGINE_TLS_CERT: /etc/cordum/tls/server/tls.crt
CONTEXT_ENGINE_TLS_KEY: /etc/cordum/tls/server/tls.key
volumes:
- "${CORDUM_TLS_DIR:?error: CORDUM_TLS_DIR is not set}:/etc/cordum/tls:ro"
# No host port exposure — internal gRPC service accessible via Docker network only.
healthcheck:
test: ["CMD-SHELL", "nc -z localhost 50070"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
safety-kernel:
image: ghcr.io/cordum-io/cordum/safety-kernel:${CORDUM_VERSION:-latest}
restart: unless-stopped
depends_on:
nats:
condition: service_healthy
environment:
CORDUM_ENV: production
NATS_URL: "tls://nats:4222"
NATS_TLS_CA: /etc/cordum/tls/ca/ca.crt
NATS_TLS_CERT: /etc/cordum/tls/client/tls.crt
NATS_TLS_KEY: /etc/cordum/tls/client/tls.key
NATS_TLS_SERVER_NAME: nats
REDIS_URL: "rediss://:${REDIS_PASSWORD:?error: REDIS_PASSWORD is not set}@redis:6379"
REDIS_TLS_CA: /etc/cordum/tls/ca/ca.crt
REDIS_TLS_CERT: /etc/cordum/tls/client/tls.crt
REDIS_TLS_KEY: /etc/cordum/tls/client/tls.key
REDIS_TLS_SERVER_NAME: redis
SAFETY_KERNEL_ADDR: ":50051"
SAFETY_POLICY_PATH: /etc/cordum/safety.yaml
# Policy signing trust store. The legacy SAFETY_POLICY_PUBLIC_KEY
# is still accepted for one-release migration; prefer the
# per-key-id form CORDUM_POLICY_PUBLIC_KEY_<ID>=<base64> so key
# rotation does not require restart. See docs/deployment/policy-signing.md.
SAFETY_POLICY_PUBLIC_KEY: "${SAFETY_POLICY_PUBLIC_KEY:?error: SAFETY_POLICY_PUBLIC_KEY is not set}"
SAFETY_POLICY_SIGNATURE: "${SAFETY_POLICY_SIGNATURE:?error: SAFETY_POLICY_SIGNATURE is not set}"
# Strict mode: off | warn (default) | enforce. Set to enforce
# once every bundle verifies clean in warn. See policy-signing.md
# for the staged rollout procedure.
CORDUM_POLICY_STRICT: "${CORDUM_POLICY_STRICT:-warn}"
SAFETY_KERNEL_TLS_CERT: /etc/cordum/tls/server/tls.crt
SAFETY_KERNEL_TLS_KEY: /etc/cordum/tls/server/tls.key
volumes:
- ./config/safety.yaml:/etc/cordum/safety.yaml:ro
- "${CORDUM_TLS_DIR:?error: CORDUM_TLS_DIR is not set}:/etc/cordum/tls:ro"
# No host port exposure — internal gRPC service accessible via Docker network only.
healthcheck:
test: ["CMD-SHELL", "nc -z localhost 50051"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
scheduler:
image: ghcr.io/cordum-io/cordum/scheduler:${CORDUM_VERSION:-latest}
restart: unless-stopped
depends_on:
nats:
condition: service_healthy
redis:
condition: service_healthy
safety-kernel:
condition: service_healthy
environment:
CORDUM_ENV: production
NATS_URL: "tls://nats:4222"
NATS_TLS_CA: /etc/cordum/tls/ca/ca.crt
NATS_TLS_CERT: /etc/cordum/tls/client/tls.crt
NATS_TLS_KEY: /etc/cordum/tls/client/tls.key
NATS_TLS_SERVER_NAME: nats
NATS_USE_JETSTREAM: "1"
REDIS_URL: "rediss://:${REDIS_PASSWORD:?error: REDIS_PASSWORD is not set}@redis:6379"
REDIS_TLS_CA: /etc/cordum/tls/ca/ca.crt
REDIS_TLS_CERT: /etc/cordum/tls/client/tls.crt
REDIS_TLS_KEY: /etc/cordum/tls/client/tls.key
REDIS_TLS_SERVER_NAME: redis
SAFETY_KERNEL_ADDR: "safety-kernel:50051"
SAFETY_KERNEL_TLS_CA: /etc/cordum/tls/ca/ca.crt
OUTPUT_POLICY_ENABLED: "${OUTPUT_POLICY_ENABLED:-true}"
POOL_CONFIG_PATH: /etc/cordum/pools.yaml
TIMEOUT_CONFIG_PATH: /etc/cordum/timeouts.yaml
JOB_META_TTL: "168h"
WORKER_SNAPSHOT_INTERVAL: "5s"
# Metrics (exposed on Docker network for Prometheus):
SCHEDULER_METRICS_ADDR: ":9090"
SCHEDULER_METRICS_PUBLIC: "true"
volumes:
- ./config/pools.yaml:/etc/cordum/pools.yaml:ro
- ./config/timeouts.yaml:/etc/cordum/timeouts.yaml:ro
- "${CORDUM_TLS_DIR:?error: CORDUM_TLS_DIR is not set}:/etc/cordum/tls:ro"
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:9090/health"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
api-gateway:
image: ghcr.io/cordum-io/cordum/api-gateway:${CORDUM_VERSION:-latest}
restart: unless-stopped
networks:
default:
aliases:
- cordum-api-gateway
depends_on:
nats:
condition: service_healthy
redis:
condition: service_healthy
scheduler:
condition: service_healthy
environment:
CORDUM_ENV: production
NATS_URL: "tls://nats:4222"
NATS_TLS_CA: /etc/cordum/tls/ca/ca.crt
NATS_TLS_CERT: /etc/cordum/tls/client/tls.crt
NATS_TLS_KEY: /etc/cordum/tls/client/tls.key
NATS_TLS_SERVER_NAME: nats
NATS_USE_JETSTREAM: "1"
REDIS_URL: "rediss://:${REDIS_PASSWORD:?error: REDIS_PASSWORD is not set}@redis:6379"
REDIS_TLS_CA: /etc/cordum/tls/ca/ca.crt
REDIS_TLS_CERT: /etc/cordum/tls/client/tls.crt
REDIS_TLS_KEY: /etc/cordum/tls/client/tls.key
REDIS_TLS_SERVER_NAME: redis
SAFETY_KERNEL_ADDR: "safety-kernel:50051"
SAFETY_KERNEL_TLS_CA: /etc/cordum/tls/ca/ca.crt
CONTEXT_ENGINE_ADDR: "context-engine:50070"
CONTEXT_ENGINE_TLS_CA: /etc/cordum/tls/ca/ca.crt
CORDUM_API_KEY: "${CORDUM_API_KEY:?error: CORDUM_API_KEY is not set}"
# Wired so the gateway's startup-side guard refuses to boot in
# production when this flag is on (release.yml is the production
# path). Default `false` — never set to `true` in release.
CORDUM_DASHBOARD_EMBED_API_KEY: "${CORDUM_DASHBOARD_EMBED_API_KEY:-false}"
TENANT_ID: default
API_RATE_LIMIT_RPS: "50"
API_RATE_LIMIT_BURST: "100"
REDIS_DATA_TTL: "24h"
JOB_META_TTL: "168h"
# Metrics (exposed on Docker network for Prometheus):
GATEWAY_METRICS_ADDR: ":9092"
GATEWAY_METRICS_PUBLIC: "true"
GRPC_TLS_CERT: /etc/cordum/tls/server/tls.crt
GRPC_TLS_KEY: /etc/cordum/tls/server/tls.key
GATEWAY_HTTP_TLS_CERT: /etc/cordum/tls/server/tls.crt
GATEWAY_HTTP_TLS_KEY: /etc/cordum/tls/server/tls.key
# Policy signing. Populate CORDUM_POLICY_SIGNING_KEY (Ed25519 PEM
# or base64) when CORDUM_POLICY_STRICT is warn or enforce.
# See docs/deployment/policy-signing.md for key generation and
# the staged off→warn→enforce rollout.
CORDUM_POLICY_SIGNING_KEY: "${CORDUM_POLICY_SIGNING_KEY:-}"
CORDUM_POLICY_SIGNING_KEY_ID: "${CORDUM_POLICY_SIGNING_KEY_ID:-default}"
CORDUM_POLICY_STRICT: "${CORDUM_POLICY_STRICT:-warn}"
volumes:
- "${CORDUM_TLS_DIR:?error: CORDUM_TLS_DIR is not set}:/etc/cordum/tls:ro"
ports:
- "8080:8080"
- "8081:8081"
# Metrics port (9092) not exposed — use internal Docker network or kubectl port-forward.
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "--no-check-certificate", "https://127.0.0.1:8081/health"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
workflow-engine:
image: ghcr.io/cordum-io/cordum/workflow-engine:${CORDUM_VERSION:-latest}
restart: unless-stopped
depends_on:
nats:
condition: service_healthy
redis:
condition: service_healthy
scheduler:
condition: service_healthy
environment:
CORDUM_ENV: production
NATS_URL: "tls://nats:4222"
NATS_TLS_CA: /etc/cordum/tls/ca/ca.crt
NATS_TLS_CERT: /etc/cordum/tls/client/tls.crt
NATS_TLS_KEY: /etc/cordum/tls/client/tls.key
NATS_TLS_SERVER_NAME: nats
NATS_USE_JETSTREAM: "1"
REDIS_URL: "rediss://:${REDIS_PASSWORD:?error: REDIS_PASSWORD is not set}@redis:6379"
REDIS_TLS_CA: /etc/cordum/tls/ca/ca.crt
REDIS_TLS_CERT: /etc/cordum/tls/client/tls.crt
REDIS_TLS_KEY: /etc/cordum/tls/client/tls.key
REDIS_TLS_SERVER_NAME: redis
WORKFLOW_ENGINE_HTTP_ADDR: ":9093"
WORKFLOW_ENGINE_SCAN_INTERVAL: "5s"
WORKFLOW_ENGINE_RUN_SCAN_LIMIT: "200"
volumes:
- "${CORDUM_TLS_DIR:?error: CORDUM_TLS_DIR is not set}:/etc/cordum/tls:ro"
# No host port exposure — internal service accessible via Docker network only.
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:9093/health"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
dashboard:
image: ghcr.io/cordum-io/cordum/dashboard:${CORDUM_VERSION:-latest}
restart: unless-stopped
depends_on:
api-gateway:
condition: service_healthy
environment:
CORDUM_API_BASE_URL: "${CORDUM_API_BASE_URL:-}"
CORDUM_API_KEY: "${CORDUM_API_KEY:-}"
CORDUM_DASHBOARD_EMBED_API_KEY: "${CORDUM_DASHBOARD_EMBED_API_KEY:-false}"
CORDUM_TENANT_ID: "${CORDUM_TENANT_ID:-default}"
CORDUM_PRINCIPAL_ID: "${CORDUM_PRINCIPAL_ID:-}"
CORDUM_PRINCIPAL_ROLE: "${CORDUM_PRINCIPAL_ROLE:-}"
# Proxy to gateway over HTTPS in production.
CORDUM_API_UPSTREAM_SCHEME: https
volumes:
- "${CORDUM_TLS_DIR:?error: CORDUM_TLS_DIR is not set}:/etc/cordum/tls:ro"
ports:
- "8082:8080"
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:8080/healthz"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
volumes:
nats_data:
redis_data: