Repository navigation
Expand file tree
/
Copy pathcompose.yaml
More file actions
182 lines (175 loc) · 6.38 KB
/
Copy pathcompose.yaml
File metadata and controls
182 lines (175 loc) · 6.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
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
# Vortex production compose configuration.
# Images for api, app, and worker are pulled from manifold.omni.dev (private).
# To build from source instead, use the dev override:
# docker compose -f compose.yaml -f compose.dev.yaml up --build
services:
db:
image: postgres:18-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME:-vortex}
POSTGRES_USER: ${DB_USER:-postgres}
POSTGRES_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required}
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres}"]
interval: 5s
timeout: 5s
retries: 5
ports:
- "${DB_PORT:-5432}:5432"
cache:
image: docker.io/valkey/valkey:8-alpine
restart: unless-stopped
command: ["valkey-server", "--requirepass", "${CACHE_PASSWORD:?CACHE_PASSWORD is required}"]
volumes:
- cache_data:/data
healthcheck:
test: ["CMD-SHELL", "REDISCLI_AUTH=${CACHE_PASSWORD} valkey-cli ping"]
interval: 5s
timeout: 5s
retries: 5
ports:
- "${CACHE_PORT:-6379}:6379"
events:
image: apache/iggy:0.7.0
restart: unless-stopped
cap_add:
- SYS_NICE
security_opt:
- seccomp:unconfined
ulimits:
memlock:
soft: -1
hard: -1
environment:
IGGY_ROOT_USERNAME: ${IGGY_USERNAME:?IGGY_USERNAME is required}
IGGY_ROOT_PASSWORD: ${IGGY_PASSWORD:?IGGY_PASSWORD is required}
IGGY_TCP_ADDRESS: "0.0.0.0:8090"
IGGY_HTTP_ADDRESS: "0.0.0.0:3000"
IGGY_HTTP_ENABLED: "true"
volumes:
- events_data:/local_data
healthcheck:
test: ["CMD-SHELL", "sh -c 'echo -n > /dev/tcp/localhost/8090' 2>/dev/null || exit 1"]
interval: 5s
timeout: 5s
retries: 5
start_period: 5s
ports:
- "${EVENTS_TCP_PORT:-8090}:8090"
api:
image: manifold.omni.dev/omnidotdev/vortex-api:latest
restart: unless-stopped
environment:
DATABASE_URL: postgres://${DB_USER:-postgres}:${DB_PASSWORD}@db:5432/${DB_NAME:-vortex}
CACHE_URL: redis://default:${CACHE_PASSWORD}@cache:6379
EVENTS_URL: iggy://events:8090
IGGY_USERNAME: ${IGGY_USERNAME:?IGGY_USERNAME is required}
IGGY_PASSWORD: ${IGGY_PASSWORD:?IGGY_PASSWORD is required}
# Server-side only: used for JWKS, userinfo, and API key verification
# against Gatekeeper (identity provider). Must point to a reachable
# Gatekeeper instance, not the vortex-app service.
AUTH_BASE_URL: ${AUTH_BASE_URL:?AUTH_BASE_URL is required (Gatekeeper URL)}
HATCHET_CLIENT_TOKEN: ${HATCHET_CLIENT_TOKEN:?HATCHET_CLIENT_TOKEN is required}
HATCHET_CLIENT_TLS_STRATEGY: ${HATCHET_CLIENT_TLS_STRATEGY:-none}
ENCRYPTION_KEY: ${ENCRYPTION_KEY:?ENCRYPTION_KEY is required}
PORT: "4000"
HOST: "0.0.0.0"
NODE_ENV: production
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost:3000}
WORKER_URL: http://worker:8080
INTERNAL_API_SECRET: ${INTERNAL_API_SECRET:?INTERNAL_API_SECRET is required}
PLATFORM_ORG_ID: ${PLATFORM_ORG_ID:-}
depends_on:
db:
condition: service_healthy
cache:
condition: service_healthy
events:
condition: service_healthy
ports:
- "${API_PORT:-4000}:4000"
healthcheck:
test: ["CMD", "bun", "-e", "fetch('http://localhost:4000/health').then(r=>{if(!r.ok)throw 1}).catch(()=>process.exit(1))"]
interval: 10s
timeout: 5s
retries: 3
start_period: 15s
app:
image: manifold.omni.dev/omnidotdev/vortex-app:latest
restart: unless-stopped
environment:
NODE_ENV: production
VITE_BASE_URL: http://localhost:${APP_PORT:-3000}
VITE_API_BASE_URL: http://localhost:${API_PORT:-4000}
API_INTERNAL_URL: http://api:4000
AUTH_SECRET: ${AUTH_SECRET:?AUTH_SECRET is required}
CACHE_URL: redis://default:${CACHE_PASSWORD}@cache:6379
# OAuth providers (optional)
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-}
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-}
GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID:-}
GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET:-}
OIDC_ISSUER: ${OIDC_ISSUER:-}
OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:-}
OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET:-}
depends_on:
api:
condition: service_healthy
cache:
condition: service_healthy
ports:
- "${APP_PORT:-3000}:3000"
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://localhost:3000/api/_health || exit 1"]
interval: 10s
timeout: 5s
retries: 3
start_period: 15s
worker:
image: manifold.omni.dev/omnidotdev/vortex-worker:latest
restart: unless-stopped
environment:
NODE_ENV: production
DATABASE_URL: postgres://${DB_USER:-postgres}:${DB_PASSWORD}@db:5432/${DB_NAME:-vortex}
CACHE_URL: redis://default:${CACHE_PASSWORD}@cache:6379
EVENTS_URL: iggy://events:8090
HATCHET_CLIENT_TOKEN: ${HATCHET_CLIENT_TOKEN:?HATCHET_CLIENT_TOKEN is required}
HATCHET_CLIENT_TLS_STRATEGY: ${HATCHET_CLIENT_TLS_STRATEGY:-none}
ENCRYPTION_KEY: ${ENCRYPTION_KEY:?ENCRYPTION_KEY is required}
HEALTH_PORT: "8080"
INTERNAL_API_SECRET: ${INTERNAL_API_SECRET:?INTERNAL_API_SECRET is required}
VORTEX_API_URL: http://api:4000
VORTEX_PUBLIC_URL: ${VORTEX_PUBLIC_URL:-http://localhost:4000}
VORTEX_CALLBACK_BASE_URL: ${VORTEX_CALLBACK_BASE_URL:-http://localhost:3000}
MANTLE_API_URL: ${MANTLE_API_URL:-}
MANTLE_SERVICE_KEY: ${MANTLE_SERVICE_KEY:-}
AUTH_API_URL: ${AUTH_API_URL:-}
EMAIL_RENDER_SECRET: ${EMAIL_RENDER_SECRET:-}
HERALD_API_URL: ${HERALD_API_URL:-}
HERALD_API_KEY: ${HERALD_API_KEY:-}
HERALD_SENDER_EMAIL_ADDRESS: ${HERALD_SENDER_EMAIL_ADDRESS:-}
HERALD_SEND_ENABLED: ${HERALD_SEND_ENABLED:-}
IGGY_USERNAME: ${IGGY_USERNAME:?IGGY_USERNAME is required}
IGGY_PASSWORD: ${IGGY_PASSWORD:?IGGY_PASSWORD is required}
depends_on:
db:
condition: service_healthy
cache:
condition: service_healthy
events:
condition: service_healthy
api:
condition: service_healthy
healthcheck:
test: ["CMD", "bun", "-e", "fetch('http://localhost:8080/health').then(r=>{if(!r.ok)throw 1}).catch(()=>process.exit(1))"]
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
volumes:
db_data:
cache_data:
events_data: