-
Notifications
You must be signed in to change notification settings - Fork 110
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
133 lines (125 loc) · 4.12 KB
/
Copy pathdocker-compose.yml
File metadata and controls
133 lines (125 loc) · 4.12 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
services:
# Dev database for `wrangler dev` (the Hyperdrive localConnectionString in
# each worker's wrangler.jsonc points here). Port 5499 dodges any host
# Postgres. vitest does NOT need this — tests run embedded PGlite.
postgres:
image: postgres:17-alpine
# wal_level=logical is a runtime GUC (not initdb-time), so flipping it on an
# existing volume needs no reset. Electric tails the WAL via logical
# replication to serve shapes.
command: ["postgres", "-c", "wal_level=logical"]
ports:
- "5499:5432"
environment:
POSTGRES_USER: maple
POSTGRES_PASSWORD: maple
POSTGRES_DB: maple
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U maple -d maple"]
interval: 5s
timeout: 3s
retries: 5
# ElectricSQL sync service — tails Postgres logical replication and serves
# per-table "shapes" over HTTP. The web app never talks to it directly; the
# apps/api shape proxy (/api/sync/shape) authenticates and org-scopes every
# request. ELECTRIC_MANUAL_TABLE_PUBLISHING mirrors prod (PlanetScale can't
# reassign table ownership, so the publication is managed by a Drizzle
# migration rather than by Electric).
electric:
image: electricsql/electric:latest
ports:
- "3473:3000"
environment:
DATABASE_URL: postgresql://maple:maple@postgres:5432/maple?sslmode=disable
ELECTRIC_INSECURE: "true"
ELECTRIC_MANUAL_TABLE_PUBLISHING: "true"
depends_on:
postgres:
condition: service_healthy
api:
build:
context: .
dockerfile: apps/api/Dockerfile
ports:
- "3472:3472"
env_file: .env
environment:
PORT: 3472
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3472/health"]
interval: 10s
timeout: 5s
retries: 3
web:
build:
context: .
dockerfile: apps/web/Dockerfile
args:
VITE_API_BASE_URL: ${VITE_API_BASE_URL:-http://localhost:3472}
VITE_MAPLE_AUTH_MODE: ${MAPLE_AUTH_MODE:-self_hosted}
ports:
- "3471:80"
ingest:
build:
context: .
dockerfile: apps/ingest/Dockerfile
ports:
- "3474:3474"
env_file: .env
environment:
INGEST_PORT: 3474
INGEST_FORWARD_OTLP_ENDPOINT: http://otel-collector:4318
INGEST_FORWARD_TIMEOUT_MS: 10000
INGEST_MAX_REQUEST_BODY_BYTES: 20971520
INGEST_REQUIRE_TLS: "false"
depends_on:
otel-collector:
condition: service_started
alerting:
build:
context: .
dockerfile: apps/alerting/Dockerfile
env_file: .env
environment:
MAPLE_APP_BASE_URL: ${MAPLE_APP_BASE_URL:-http://web}
depends_on:
api:
condition: service_healthy
ingest:
condition: service_started
scraper:
build:
context: .
dockerfile: apps/scraper/Dockerfile
ports:
- "3475:3475"
env_file: .env
environment:
PORT: 3475
MAPLE_API_URL: http://api:3472
MAPLE_INGEST_URL: http://ingest:3474
SD_INTERNAL_TOKEN: ${SD_INTERNAL_TOKEN:-maple-sd-dev-token}
depends_on:
api:
condition: service_healthy
ingest:
condition: service_started
otel-collector:
build:
context: .
dockerfile: otel/Dockerfile
ports:
- "4317:4317"
- "4318:4318"
- "13133:13133"
env_file: .env
volumes:
- otel-queue-data:/var/lib/otelcol/file_storage
depends_on:
api:
condition: service_healthy
volumes:
otel-queue-data:
postgres-data: