-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.scaleout.yml
More file actions
107 lines (102 loc) · 4.38 KB
/
Copy pathdocker-compose.scaleout.yml
File metadata and controls
107 lines (102 loc) · 4.38 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
# Multi-Replica-Scale-out-Harness (ADR-0006): 2 API-Replicas + 1 Postgres
# + nginx-Load-Balancer. Bewusst SEPARAT vom Root-docker-compose.yml — das
# bleibt der SQLite-Single-Instance-Dev-Stack (`make dev`). Dieser Stack
# belegt den optionalen Postgres-Store und dient dem Scale-out-Lasttest
# (R-26 c) sowie dem Multi-Replica-Boot-Smoke (`make smoke-scaleout`).
# Teilt das api-Image-Build mit dem Root-Compose (build: ./apps/api).
#
# Connection-Budget (Vorbehalt für den Lasttest): N Replicas × database/sql-
# Pool + Startup/Migration + Readback-psql müssen unter Postgres'
# max_connections (Default 100) bleiben — bei 2 Replicas mit reichlich
# Headroom, beim Hochskalieren ggf. pool_size begrenzen oder pgbouncer.
name: mtrace-scaleout
services:
postgres:
image: postgres:17-alpine
environment:
POSTGRES_USER: mtrace
POSTGRES_PASSWORD: mtrace-scaleout
POSTGRES_DB: mtrace
# track_commit_timestamp=on ist die R-27-Wasserzeichen-Voraussetzung
# (ADR-0006): OpenPostgres bricht beim Boot fail-loud ab, wenn es aus ist.
command: ["postgres", "-c", "track_commit_timestamp=on"]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U mtrace -d mtrace"]
interval: 2s
timeout: 3s
retries: 40
# Shared Ingest-Limiter-Backend (R-26 b): nur vom Fairness-Modus des
# Scale-out-Lasttests genutzt (MTRACE_RATE_LIMIT_BACKEND=redis) — der
# R-26-c-Durchsatzpfad läuft weiter ohne Redis (Default memory).
# BEWUSST keine depends_on-Kante von den api-Replicas hierher: die
# Nicht-Fairness-Pfade (Boot-Smoke, R-26-c-Lasttest) nutzen Redis nie
# und sollen nicht an einem Redis-Pull/-Healthcheck scheitern können;
# der Fairness-Smoke wartet selbst auf redis-cli ping.
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 2s
timeout: 3s
retries: 40
api-1:
build:
context: ./apps/api
target: runtime
image: m-trace-api:0.1.2
depends_on:
postgres:
condition: service_healthy
environment:
MTRACE_API_LISTEN_ADDR: ":8080"
MTRACE_PERSISTENCE: "postgres"
MTRACE_POSTGRES_DSN: "postgres://mtrace:mtrace-scaleout@postgres:5432/mtrace?sslmode=disable"
# Issuance-Limiter: memory (Default). SQLite-Issuance ist auf Postgres
# inkompatibel; ein repliken-übergreifend fairer Limiter (Redis) ist
# R-26-b-Scope, nicht Teil des R-26-c-Durchsatznachweises.
MTRACE_AUTH_LAB_DEFAULT: "1"
ANALYZER_BASE_URL: ""
MTRACE_RATE_LIMIT_CAPACITY: "${MTRACE_RATE_LIMIT_CAPACITY:-}"
MTRACE_RATE_LIMIT_REFILL: "${MTRACE_RATE_LIMIT_REFILL:-}"
# R-26 b (Fairness-Modus): shared Redis-Ingest-Limiter + Multi-
# Tenant-Seeding + XFF-Trust. Leer = Default (memory, nur demo).
MTRACE_RATE_LIMIT_BACKEND: "${MTRACE_RATE_LIMIT_BACKEND:-}"
MTRACE_REDIS_ADDR: "${MTRACE_REDIS_ADDR:-}"
MTRACE_LAB_PROJECTS: "${MTRACE_LAB_PROJECTS:-}"
MTRACE_TRUST_FORWARDED_FOR: "${MTRACE_TRUST_FORWARDED_FOR:-}"
ports:
# api-1 direkt erreichbar für die 1-Replica-Durchsatz-Baseline des
# Scale-out-Lasttests (Phase A); Phase B lastet über den LB beide.
- "${SCALEOUT_API1_PORT:-8089}:8080"
api-2:
build:
context: ./apps/api
target: runtime
image: m-trace-api:0.1.2
depends_on:
postgres:
condition: service_healthy
environment:
MTRACE_API_LISTEN_ADDR: ":8080"
MTRACE_PERSISTENCE: "postgres"
MTRACE_POSTGRES_DSN: "postgres://mtrace:mtrace-scaleout@postgres:5432/mtrace?sslmode=disable"
MTRACE_AUTH_LAB_DEFAULT: "1"
ANALYZER_BASE_URL: ""
MTRACE_RATE_LIMIT_CAPACITY: "${MTRACE_RATE_LIMIT_CAPACITY:-}"
MTRACE_RATE_LIMIT_REFILL: "${MTRACE_RATE_LIMIT_REFILL:-}"
MTRACE_RATE_LIMIT_BACKEND: "${MTRACE_RATE_LIMIT_BACKEND:-}"
MTRACE_REDIS_ADDR: "${MTRACE_REDIS_ADDR:-}"
MTRACE_LAB_PROJECTS: "${MTRACE_LAB_PROJECTS:-}"
MTRACE_TRUST_FORWARDED_FOR: "${MTRACE_TRUST_FORWARDED_FOR:-}"
lb:
image: nginx:1.27-alpine
depends_on:
- api-1
- api-2
volumes:
# Default: korrektes strip+append-XFF. Der R-26-b-Fairness-Modus
# mountet stattdessen die Pass-through-Variante (SCALEOUT_NGINX_CONF
# → scripts/scaleout-nginx-fairness.conf, gesetzt vom Smoke).
- "${SCALEOUT_NGINX_CONF:-./scripts/scaleout-nginx.conf}:/etc/nginx/nginx.conf:ro"
ports:
- "${SCALEOUT_LB_PORT:-8088}:8080"