main
yaml 466 lines 11.4 KB
Raw
1 # Non-secret AKS example. Replace every REPLACE_WITH_* value during release
2 # configuration; secret values belong in Key Vault and never in this file.
3 global:
4 environment: AZURE
5 springProfile: AZURE
6 imageRegistry: REPLACE_WITH_ACR_NAME.azurecr.io
7 imageTag: REPLACE_WITH_GIT_SHA
8 imagePullPolicy: IfNotPresent
9 imagePullSecrets: []
10 serviceAccount:
11 create: true
12 name: ai-investment-platform
13 annotations:
14 azure.workload.identity/client-id: REPLACE_WITH_WORKLOAD_IDENTITY_CLIENT_ID
15 azure.workload.identity/tenant-id: REPLACE_WITH_TENANT_ID
16 automountServiceAccountToken: false
17 azure:
18 workloadIdentity:
19 enabled: true
20 clientId: REPLACE_WITH_WORKLOAD_IDENTITY_CLIENT_ID
21 tenantId: REPLACE_WITH_TENANT_ID
22 workloads:
23 - api-gateway
24 - auth-service
25 - portfolio-service
26 - broker-service
27 - research-service
28 - research-engine
29 - mcp-gateway
30 containerSecurityContext:
31 allowPrivilegeEscalation: false
32 readOnlyRootFilesystem: true
33 capabilities:
34 drop: [ALL]
35 rolloutStrategy:
36 type: RollingUpdate
37 rollingUpdate:
38 maxUnavailable: 0
39 maxSurge: 1
40 topologySpread:
41 enabled: true
42 topologyKey: topology.kubernetes.io/zone
43 maxSkew: 1
44 whenUnsatisfiable: ScheduleAnyway
45 observability:
46 otel:
47 enabled: true
48 tracesEnabled: true
49 metricsEnabled: true
50 exporterOtlpEndpoint: https://REPLACE_WITH_OTEL_COLLECTOR:4317
51 exporterOtlpProtocol: grpc
52 resourceAttributes: cloud.provider=azure,cloud.platform=azure_aks
53 javaAgentInjection: false
54 pythonAgentInjection: false
55
56 database:
57 host: REPLACE_WITH_POSTGRES_FQDN.postgres.database.azure.com
58 port: 5432
59 name: investment
60 username: REPLACE_WITH_POSTGRES_USER
61 authMode: password
62 passwordSecretName: aip-postgresql
63 passwordSecretKey: DB_PASSWORD
64 sslMode: verify-full
65 connectTimeoutSeconds: 10
66 socketTimeoutSeconds: 30
67 pool:
68 maximumSize: 6
69 minimumIdle: 1
70 connectionTimeoutMs: 10000
71 idleTimeoutMs: 300000
72 maxLifetimeMs: 1500000
73
74 redis:
75 host: REPLACE_WITH_REDIS_FQDN
76 port: 6380
77 tlsEnabled: true
78 username: ""
79 passwordSecretName: aip-redis
80 passwordSecretKey: REDIS_PASSWORD
81 connectTimeout: 3s
82 readTimeout: 3s
83 pool:
84 maxActive: 8
85 maxIdle: 4
86 minIdle: 1
87 maxWait: 2s
88
89 kafka:
90 enabled: false
91 bootstrapServers: REPLACE_WITH_KAFKA_BOOTSTRAP_HOST:9093
92 securityProtocol: SASL_SSL
93 saslMechanism: PLAIN
94 username: REPLACE_WITH_KAFKA_USERNAME
95 consumerGroupPrefix: REPLACE_WITH_ENVIRONMENT_CONSUMER_GROUP_PREFIX
96 credentialSecretName: aip-kafka
97 passwordSecretKey: KAFKA_PASSWORD
98 # Leave empty when the provider uses a public CA. Set a Secret name only for
99 # an approved private CA bundle; the bundle is mounted as a file.
100 sslTruststoreSecretName: ""
101 sslTruststoreSecretKey: KAFKA_TRUSTSTORE
102 sslTruststoreType: PEM
103 clientDnsLookup: use_all_dns_ips
104 requestTimeoutMs: 30000
105 deliveryTimeoutMs: 120000
106 retries: 5
107
108 objectStorage:
109 enabled: false
110 provider: azure-blob
111 accountName: REPLACE_WITH_STORAGE_ACCOUNT_NAME
112 endpoint: https://REPLACE_WITH_STORAGE_ACCOUNT_NAME.blob.core.windows.net
113 container: REPLACE_WITH_CONTAINER_NAME
114 authMode: workloadIdentity
115 temporary:
116 enabled: false
117 ttlSeconds: 3600
118
119 keyVault:
120 enabled: true
121 name: REPLACE_WITH_KEY_VAULT_NAME
122 tenantId: REPLACE_WITH_TENANT_ID
123 clientId: REPLACE_WITH_WORKLOAD_IDENTITY_CLIENT_ID
124 secretProviderClassName: aip-key-vault
125 mountPath: /mnt/secrets-store
126 objects:
127 - objectName: postgresql-password
128 objectType: secret
129 objectAlias: postgresql-password
130 - objectName: redis-password
131 objectType: secret
132 objectAlias: redis-password
133 - objectName: kafka-password
134 objectType: secret
135 objectAlias: kafka-password
136 - objectName: auth-jwt-signing-key
137 objectType: secret
138 objectAlias: auth-jwt-signing-key
139 - objectName: smtp-username
140 objectType: secret
141 objectAlias: smtp-username
142 - objectName: smtp-password
143 objectType: secret
144 objectAlias: smtp-password
145 - objectName: research-provider-api-key
146 objectType: secret
147 objectAlias: research-provider-api-key
148 - objectName: broker-internal-token
149 objectType: secret
150 objectAlias: broker-internal-token
151 secretObjects:
152 - secretName: aip-postgresql
153 type: Opaque
154 data:
155 - objectName: postgresql-password
156 key: DB_PASSWORD
157 - secretName: aip-redis
158 type: Opaque
159 data:
160 - objectName: redis-password
161 key: REDIS_PASSWORD
162 - secretName: aip-kafka
163 type: Opaque
164 data:
165 - objectName: kafka-password
166 key: KAFKA_PASSWORD
167 - secretName: aip-auth-jwt
168 type: Opaque
169 data:
170 - objectName: auth-jwt-signing-key
171 key: jwt-secret
172 - secretName: auth-smtp-credentials
173 type: Opaque
174 data:
175 - objectName: smtp-username
176 key: SMTP_USERNAME
177 - objectName: smtp-password
178 key: SMTP_PASSWORD
179 - secretName: research-provider-credentials
180 type: Opaque
181 data:
182 - objectName: research-provider-api-key
183 key: api-key
184 - secretName: broker-runtime-credentials
185 type: Opaque
186 data:
187 - objectName: broker-internal-token
188 key: AIP_INTERNAL_TOKEN
189
190 devDependencies:
191 enabled: false
192 postgres:
193 persistence:
194 enabled: false
195 storageClass: ""
196
197 apiGateway:
198 cors:
199 allowedOrigins:
200 - https://REPLACE_WITH_PUBLIC_HOST
201 ingress:
202 enabled: true
203 className: REPLACE_WITH_INGRESS_CLASS
204 annotations:
205 cert-manager.io/cluster-issuer: REPLACE_WITH_CLUSTER_ISSUER
206 host: REPLACE_WITH_PUBLIC_HOST
207 path: /
208 pathType: Prefix
209 tls:
210 - secretName: aip-public-tls
211 hosts:
212 - REPLACE_WITH_PUBLIC_HOST
213
214 auth:
215 issuer: https://REPLACE_WITH_PUBLIC_HOST
216 devLoginEnabled: false
217 createDevSecret: false
218 devJwtSecret: ""
219 jwtSecretName: aip-auth-jwt
220 jwtSecretKey: jwt-secret
221 email:
222 mode: SMTP
223 smtpHost: REPLACE_WITH_SMTP_HOST
224 smtpPort: 587
225 smtpFrom: REPLACE_WITH_SMTP_FROM_ADDRESS
226 publicUrl: https://REPLACE_WITH_PUBLIC_HOST
227 credentialSecretName: auth-smtp-credentials
228
229 research:
230 liveEnabled: false
231 demoEnabled: false
232 persistence:
233 enabled: true
234 databaseBackend: postgres
235 databaseSchema: research
236 distributedLock:
237 # Process-local coordination is the only implemented backend today.
238 # Keep research-engine single-replica until a distributed backend exists.
239 backend: process
240 acquireTimeoutSeconds: 30
241 mcpAcquisition:
242 # Enable only after approving an endpoint and exact executable capabilities.
243 enabled: false
244 gatewayBaseUrl: http://mcp-gateway
245 timeoutSeconds: 10
246 serviceIdentity: research-engine
247 providers:
248 eodhdCredentialSecretName: research-provider-credentials
249 eodhdApiKeySecretKey: api-key
250 search:
251 enabled: false
252 provider: disabled
253 endpoint: ""
254 apiKeySecretName: research-provider-credentials
255 apiKeySecretKey: api-key
256
257 workloadOverrides:
258 api-gateway:
259 replicaCount: 2
260 autoscaling:
261 enabled: true
262 minReplicas: 2
263 maxReplicas: 4
264 targetCPUUtilizationPercentage: 70
265 pdb:
266 enabled: true
267 minAvailable: 1
268 auth-service:
269 replicaCount: 2
270 autoscaling:
271 enabled: true
272 minReplicas: 2
273 maxReplicas: 4
274 targetCPUUtilizationPercentage: 70
275 pdb:
276 enabled: true
277 minAvailable: 1
278 portfolio-service:
279 replicaCount: 1
280 rolloutStrategy:
281 type: Recreate
282 autoscaling:
283 enabled: false
284 minReplicas: 1
285 maxReplicas: 1
286 targetCPUUtilizationPercentage: 70
287 pdb:
288 enabled: false
289 minAvailable: 1
290 broker-service:
291 replicaCount: 1
292 rolloutStrategy:
293 type: Recreate
294 autoscaling:
295 enabled: false
296 minReplicas: 1
297 maxReplicas: 1
298 pdb:
299 enabled: false
300 minAvailable: 1
301 research-service:
302 replicaCount: 1
303 rolloutStrategy:
304 type: Recreate
305 autoscaling:
306 enabled: false
307 minReplicas: 1
308 maxReplicas: 1
309 pdb:
310 enabled: false
311 minAvailable: 1
312 research-engine:
313 replicaCount: 1
314 rolloutStrategy:
315 type: Recreate
316 autoscaling:
317 enabled: false
318 minReplicas: 1
319 maxReplicas: 1
320 targetCPUUtilizationPercentage: 70
321 pdb:
322 enabled: false
323 minAvailable: 1
324
325 frontend:
326 replicaCount: 2
327 service:
328 type: ClusterIP
329 autoscaling:
330 enabled: true
331 minReplicas: 2
332 maxReplicas: 4
333 targetCPUUtilizationPercentage: 70
334 pdb:
335 enabled: true
336 minAvailable: 1
337
338 networkPolicy:
339 enabled: true
340 allowSameNamespace: true
341 ingressController:
342 enabled: true
343 namespace: REPLACE_WITH_INGRESS_NAMESPACE
344 podLabels: {}
345 # Kubernetes NetworkPolicy cannot express provider FQDN allowlists. Keep
346 # egress policy off until the chosen CNI/firewall design supplies them.
347 egress:
348 enabled: false
349 allowDns: true
350
351 ibkr:
352 enabled: false
353 insecureTls: false
354 connectorRuntimeMode: LOCAL_AGENT
355 connectorInternalToken: ""
356 connectorInternalTokenSecretName: broker-runtime-credentials
357 connectorInternalTokenSecretKey: AIP_INTERNAL_TOKEN
358
359 ibkrConnector:
360 enabled: false
361 productionApproved: false
362 gatewayTlsVerify: true
363 internalToken: ""
364 internalTokenSecretName: broker-runtime-credentials
365 internalTokenSecretKey: AIP_INTERNAL_TOKEN
366 packageVolumeClaim: ""
367
368 ibkrRuntime:
369 mode: STATIC
370 image:
371 repository: ai-investment/ibkr-connector
372 tag: REPLACE_WITH_GIT_SHA
373 azure:
374 workloadIdentity:
375 enabled: true
376 clientId: REPLACE_WITH_WORKLOAD_IDENTITY_CLIENT_ID
377 gatewayPackage:
378 classification: DEV_ONLY
379 claimName: ""
380 internalToken:
381 secretName: broker-runtime-credentials
382 secretKey: AIP_INTERNAL_TOKEN
383
384 mcpGateway:
385 implemented: true
386 enabled: true
387 exposure: INTERNAL_ONLY
388 image: ai-investment/mcp-gateway
389 tag: latest
390 replicaCount: 2
391 transport: streamable-http
392 serviceIdentity: mcp-gateway
393 authenticationType: WORKLOAD_IDENTITY
394 localUserId: ""
395 externalProvidersEnabled: false
396 externalCallerIdentities:
397 - research-engine
398 yahooFinance:
399 enabled: false
400 transport: streamable-http
401 endpoint: http://yahoo-finance-mcp/mcp
402 stdioCommand: ""
403 stdioArgs: []
404 authType: NONE
405 authHeaderName: Authorization
406 authSecretName: ""
407 authSecretKey: ""
408 stdioTokenEnvName: ""
409 capabilities: []
410 timeoutSeconds: 8
411 maxRetries: 1
412 retryBackoffSeconds: 0.2
413 maxConcurrency: 4
414 allowedHosts:
415 - mcp-gateway
416 - mcp-gateway:*
417 allowedOrigins: []
418 service:
419 type: ClusterIP
420 port: 80
421 ingress:
422 enabled: false
423 autoscaling:
424 enabled: true
425 minReplicas: 2
426 maxReplicas: 4
427 targetCPUUtilizationPercentage: 70
428 pdb:
429 enabled: true
430 minAvailable: 1
431 networkPolicy:
432 enabled: true
433
434 yahooFinanceMcp:
435 # Production enablement remains gated on Yahoo data-rights and egress review.
436 enabled: false
437 exposure: INTERNAL_ONLY
438 image: ai-investment/yahoo-finance-mcp
439 tag: latest
440 replicaCount: 2
441 transport: streamable-http
442 service:
443 type: ClusterIP
444 port: 80
445 ingress:
446 enabled: false
447 autoscaling:
448 enabled: true
449 minReplicas: 2
450 maxReplicas: 4
451 targetCPUUtilizationPercentage: 70
452 pdb:
453 enabled: true
454 minAvailable: 1
455 networkPolicy:
456 enabled: true
457
458 featureFlags:
459 mcpEnabled: true
460 llmEnabled: false
461 scheduledJobsEnabled: false
462 globalResearchAcquisitionEnabled: false
463
464 marketData:
465 demoMode: false
466 quoteCacheMode: redis