5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
922 lines
30 KiB
YAML
922 lines
30 KiB
YAML
# Default values for opik public helm chart
|
|
# This is a YAML-formatted file.
|
|
# Declare variables to be passed into your templates.
|
|
|
|
global:
|
|
argocd: false
|
|
useHelmHooks: true
|
|
security:
|
|
allowInsecureImages: true
|
|
|
|
nameOverride: "opik"
|
|
fullnameOverride: ""
|
|
|
|
standalone: true
|
|
basicAuth: false
|
|
|
|
registry: ®istry ghcr.io/comet-ml/opik
|
|
|
|
localFEAddress: "host.minikube.internal:5174"
|
|
localFE: false
|
|
|
|
serviceAccount:
|
|
create: false
|
|
name: ""
|
|
annotations: {}
|
|
|
|
demoDataJob:
|
|
enabled: true
|
|
|
|
chartMigration:
|
|
# Enable this for the first upgrade that includes a migration from Bitnami charts and images
|
|
# After successful migration, set this back to false
|
|
enabled: true
|
|
image: "alpine/kubectl:1.35.0"
|
|
# Service account name (must have permissions to delete StatefulSets and Deployments)
|
|
serviceAccountName: ""
|
|
# Node selector for the migration job pod (falls back to global nodeSelector if not specified)
|
|
nodeSelector: {}
|
|
# Tolerations for the migration job pod (falls back to global tolerations if not specified)
|
|
tolerations: []
|
|
|
|
|
|
nodeSelector: {}
|
|
tolerations: []
|
|
affinity: {}
|
|
topologySpreadConstraints: []
|
|
|
|
caCerts:
|
|
# -- (list) Additional Certificate Authority Certificates to trust.
|
|
# Each list entry has two keys: `name` and `content`. `name` should be a
|
|
# unique identifier. content Should be PEM formated Public Certificate
|
|
# contents.
|
|
additionalCACerts:
|
|
|
|
# -- Certificates are Public Keys + Metadata, but some organizations may
|
|
# still prefer storing these in Secrets.
|
|
additionalCACertsInSecret: false
|
|
|
|
# -- If there is an existing ConfigMap containing the additional CA
|
|
# Certificates you can provide its name here instead of creatinga a new one.
|
|
# If `additionalCACertsInSecret` is `true` we will look for this name in
|
|
# Secrets.
|
|
existingAdditionalCACertsRef:
|
|
|
|
overwriteJavaCATrustStore:
|
|
# -- If enabled we will not inject additional CA Certificates to the Java
|
|
# TrustStore, but instead will mount a given volume containing a Java Trust
|
|
# Store to replace the default one in the containers.
|
|
enabled: false
|
|
# -- A Kubernetes Volume definition which will contain a valid Java Trust
|
|
# Store. See
|
|
# https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/volume/
|
|
# for valid parameters.
|
|
volume: {}
|
|
# -- The sub-path of the valid Java Trust Store to mount from the volume.
|
|
subPath: cacerts
|
|
|
|
|
|
# Opik MCP OAuth Authorization Server
|
|
mcpOAuth:
|
|
# -- Render nginx locations (AS endpoints, consent UI, discovery URL). Turn on together with
|
|
# opik-backend MCP_OAUTH_ENABLED=true and a path-prefix OPIK_BASE_URL (e.g. https://www.comet.com/opik).
|
|
enabled: false
|
|
|
|
|
|
component:
|
|
backend:
|
|
enabled: true
|
|
serviceAccount:
|
|
create: true
|
|
name: opik-backend
|
|
metrics:
|
|
enabled: false
|
|
image:
|
|
repository: opik-backend
|
|
pullPolicy: IfNotPresent
|
|
replicaCount: 1
|
|
autoscaling:
|
|
enabled: false
|
|
behavior:
|
|
scaleDown:
|
|
stabilizationWindowSeconds: 300
|
|
policies:
|
|
- type: Percent
|
|
value: 50
|
|
periodSeconds: 60
|
|
scaleUp:
|
|
stabilizationWindowSeconds: 60
|
|
policies:
|
|
- type: Pods
|
|
value: 2
|
|
periodSeconds: 60
|
|
selectPolicy: Max
|
|
backendConfigMap:
|
|
enabled: true
|
|
run_migration: true
|
|
# Resource requests/limits for the `backend-migrations` init container.
|
|
# Empty ({}) by default — no resources set.
|
|
run_migration_resources: {}
|
|
waitForClickhouse:
|
|
clickhouse:
|
|
host: clickhouse-opik-clickhouse
|
|
port: 8123
|
|
protocol: http
|
|
image:
|
|
registry: docker.io
|
|
repository: curlimages/curl
|
|
tag: 8.12.1
|
|
# Resource requests/limits for the `wait-for-clickhouse-service` init container.
|
|
# Empty ({}) by default — no resources set.
|
|
resources: {}
|
|
waitForMysql:
|
|
enabled: false
|
|
mysql:
|
|
host: opik-mysql
|
|
port: 3306
|
|
image:
|
|
registry: docker.io
|
|
repository: busybox
|
|
tag: 1.36
|
|
# Resource requests/limits for the `wait-for-mysql-service` init container.
|
|
# Empty ({}) by default — no resources set.
|
|
resources: {}
|
|
resources:
|
|
requests:
|
|
ephemeral-storage: 10Gi
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /health-check?name=all&type=alive
|
|
port: 8080
|
|
httpHeaders:
|
|
- name: Accept
|
|
value: application/json
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /health-check?name=all&type=ready
|
|
port: 8080
|
|
httpHeaders:
|
|
- name: Accept
|
|
value: application/json
|
|
initialDelaySeconds: 20
|
|
podDisruptionBudget:
|
|
enabled: false
|
|
env:
|
|
STATE_DB_PROTOCOL: "jdbc:mysql://"
|
|
STATE_DB_URL: "opik-mysql:3306/opik?rewriteBatchedStatements=true&connectionTimeZone=UTC&forceConnectionTimeZoneToSession=true"
|
|
STATE_DB_DATABASE_NAME: "opik"
|
|
STATE_DB_USER: opik
|
|
ANALYTICS_DB_MIGRATIONS_URL: "jdbc:clickhouse://clickhouse-opik-clickhouse:8123"
|
|
ANALYTICS_DB_MIGRATIONS_USER: "opik"
|
|
ANALYTICS_DB_PROTOCOL: "HTTP"
|
|
ANALYTICS_DB_HOST: "clickhouse-opik-clickhouse"
|
|
ANALYTICS_DB_PORT: "8123"
|
|
ANALYTICS_DB_USERNAME: "opik"
|
|
ANALYTICS_DB_DATABASE_NAME: "opik"
|
|
JAVA_OPTS: "-Dliquibase.propertySubstitutionEnabled=true -XX:+UseG1GC -XX:MaxRAMPercentage=80.0 -XX:MinRAMPercentage=75"
|
|
REDIS_URL: redis://:wFSuJX9nDBdCa25sKZG7bh@opik-redis-master:6379/
|
|
ANALYTICS_DB_MIGRATIONS_PASS: opik
|
|
ANALYTICS_DB_PASS: opik
|
|
STATE_DB_PASS: opik
|
|
OPIK_OTEL_SDK_ENABLED: false
|
|
OTEL_VERSION: 2.12.0
|
|
OTEL_PROPAGATORS: "tracecontext,baggage,b3"
|
|
OTEL_EXPERIMENTAL_EXPORTER_OTLP_RETRY_ENABLED: true
|
|
OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION: BASE2_EXPONENTIAL_BUCKET_HISTOGRAM
|
|
OTEL_EXPERIMENTAL_RESOURCE_DISABLED_KEYS: process.command_args
|
|
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: delta
|
|
PYTHON_EVALUATOR_URL: http://opik-python-backend:8000
|
|
UI_DEFAULT_PAGE_SIZE: "100"
|
|
# LLM model registry (see apps/opik-backend/config.yml:1309-1317).
|
|
# Remote CDN fetch is opt-in: self-hosted / OSS deployments serve
|
|
# the classpath YAML shipped with the release by default, no
|
|
# outbound traffic. Operators who want fresh models between
|
|
# releases can set LLM_MODEL_REGISTRY_REMOTE_ENABLED: "true" and
|
|
# point LLM_MODEL_REGISTRY_REMOTE_URL at their preferred source.
|
|
LLM_MODEL_REGISTRY_DEFAULT_RESOURCE: "llm-models-default.yaml"
|
|
LLM_MODEL_REGISTRY_LOCAL_OVERRIDE_PATH: ""
|
|
LLM_MODEL_REGISTRY_REMOTE_ENABLED: "false"
|
|
LLM_MODEL_REGISTRY_REMOTE_URL: ""
|
|
LLM_MODEL_REGISTRY_REFRESH_INTERVAL_SECONDS: "300"
|
|
envFrom:
|
|
- configMapRef:
|
|
name: opik-backend
|
|
service:
|
|
type: ClusterIP
|
|
ports:
|
|
- name: http
|
|
port: 8080
|
|
protocol: TCP
|
|
targetPort: 8080
|
|
- name: swagger
|
|
port: 3003
|
|
protocol: TCP
|
|
targetPort: 3003
|
|
ingress:
|
|
enabled: false
|
|
ingressClassName: ""
|
|
annotations: {}
|
|
hosts: []
|
|
tls:
|
|
enabled: false
|
|
hosts: []
|
|
secretName: ""
|
|
# @ignored
|
|
usesJavaTrustStore: true
|
|
|
|
python-backend:
|
|
enabled: true
|
|
serviceAccount:
|
|
create: true
|
|
name: opik-python-backend
|
|
metrics:
|
|
enabled: false
|
|
image:
|
|
repository: opik-python-backend
|
|
pullPolicy: IfNotPresent
|
|
replicaCount: 1
|
|
autoscaling:
|
|
enabled: false
|
|
behavior:
|
|
scaleDown:
|
|
stabilizationWindowSeconds: 300
|
|
policies:
|
|
- type: Percent
|
|
value: 50
|
|
periodSeconds: 60
|
|
scaleUp:
|
|
stabilizationWindowSeconds: 60
|
|
policies:
|
|
- type: Pods
|
|
value: 2
|
|
periodSeconds: 60
|
|
selectPolicy: Max
|
|
backendConfigMap:
|
|
enabled: true
|
|
podDisruptionBudget:
|
|
enabled: false
|
|
env:
|
|
PYTHON_CODE_EXECUTOR_IMAGE_REGISTRY: *registry
|
|
PYTHON_CODE_EXECUTOR_IMAGE_NAME: "opik-sandbox-executor-python"
|
|
# PYTHON_CODE_EXECUTOR_IMAGE_TAG defaults to Chart.AppVersion when not specified
|
|
PYTHON_CODE_EXECUTOR_STRATEGY: "process"
|
|
PYTHON_CODE_EXECUTOR_PARALLEL_NUM: "5"
|
|
PYTHON_CODE_EXECUTOR_EXEC_TIMEOUT_IN_SECS: "3"
|
|
PYTHON_CODE_EXECUTOR_ALLOW_NETWORK: "false"
|
|
PYTHON_CODE_EXECUTOR_CPU_SHARES: "512"
|
|
PYTHON_CODE_EXECUTOR_MEM_LIMIT: "256m"
|
|
# PYTHON_CODE_EXECUTOR_CPU_LIMIT: "0.5" # Hard CPU limit per executor container (in CPUs, e.g. "0.5" = half a core). Unset by default — no hard limit.
|
|
PYTHON_CODE_EXECUTOR_METRICS_INTERVAL_IN_SECONDS: "60"
|
|
OPIK_REVERSE_PROXY_URL: "http://opik-frontend:5173/api"
|
|
OTEL_SERVICE_NAME: "opik-python-backend"
|
|
OTEL_METRIC_EXPORT_INTERVAL: "60000"
|
|
OTEL_PROPAGATORS: "tracecontext,baggage"
|
|
OTEL_EXPERIMENTAL_EXPORTER_OTLP_RETRY_ENABLED: true
|
|
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: cumulative
|
|
# Opik SDK URL for optimizer to reach Java backend
|
|
OPIK_URL_OVERRIDE: "http://opik-backend:8080"
|
|
# Redis URL for Optimization Studio log streaming
|
|
REDIS_URL: redis://:wFSuJX9nDBdCa25sKZG7bh@opik-redis-master:6379/
|
|
|
|
# ============================================================
|
|
# Optimization Studio Configuration (optional)
|
|
# ============================================================
|
|
# The Optimization Studio RQ worker runs in this service by default
|
|
# (RQ_WORKER_ENABLED defaults to true). Set RQ_WORKER_ENABLED: "false"
|
|
# to run an executor-only python-backend without the worker.
|
|
# Maximum number of concurrent optimization jobs (default: 5)
|
|
# Each job runs in a separate worker thread with isolated subprocess
|
|
# OPTSTUDIO_MAX_CONCURRENT_JOBS: "5"
|
|
# Number of dataset items to sample for optimization (default: 1000)
|
|
# Limits memory usage for large datasets
|
|
# OPTSTUDIO_DATASET_SAMPLES: "1000"
|
|
# Terminal width for Rich log output formatting (default: 80)
|
|
# OPTSTUDIO_LOG_TERM_WIDTH: "150"
|
|
# Execution timeout for optimization jobs in seconds (default: 86400 = 24 hours)
|
|
# OPTSTUDIO_EXECUTION_TIMEOUT: "86400"
|
|
# Log level for the opik-optimizer SDK (default: DEBUG)
|
|
# OPIK_OPTIMIZER_LOG_LEVEL: "DEBUG"
|
|
# TTL for optimization logs in Redis in seconds (default: 86400 = 24 hours)
|
|
# OPTSTUDIO_LOG_REDIS_TTL: "86400"
|
|
# Default max output tokens for optimizer LLM calls (default: 8192)
|
|
# Prevents truncation of structured JSON outputs from LLM
|
|
# OPTSTUDIO_LLM_MAX_TOKENS: "8192"
|
|
# TTL for failed RQ jobs in Redis in seconds (default: 86400 = 1 day)
|
|
# RQ_WORKER_TTL_FAILURE: "86400"
|
|
|
|
# LLM provider API keys are no longer injected via environment variables.
|
|
# Configure them per workspace in the Opik UI under "AI Providers" — the
|
|
# backend resolves the key from workspace settings when the Optimization
|
|
# Studio and Playground make LLM calls.
|
|
#
|
|
# Optional: Reference external Kubernetes secrets for other sensitive
|
|
# configuration (e.g. AWS credentials, DB credentials) from external secret
|
|
# managers (AWS Secrets Manager, GCP Secret Manager, Azure Key Vault).
|
|
#
|
|
# Customers can create secrets using:
|
|
# - ExternalSecret Operator (recommended for production)
|
|
# - Kubernetes Secrets CSI Driver
|
|
# - Manual kubectl create secret
|
|
#
|
|
# Each secretRef will be added as an envFrom entry, making all key-value pairs
|
|
# from the secret available as environment variables in the python-backend pod.
|
|
#
|
|
# Example configuration:
|
|
# secretRefs:
|
|
# - name: "opik-aws-credentials" # Contains AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
|
|
secretRefs: []
|
|
|
|
envFrom:
|
|
- configMapRef:
|
|
name: opik-python-backend
|
|
|
|
securityContext:
|
|
privileged: true
|
|
networkPolicy:
|
|
enabled: false
|
|
annotations: {}
|
|
additionalRules: []
|
|
# example networks to block
|
|
# # Allow egress to public internet, excluding private / reserved ranges
|
|
# - to:
|
|
# - ipBlock:
|
|
# cidr: 0.0.0.0/0
|
|
# except:
|
|
# # Standard RFC1918 Private Ranges
|
|
# - 10.0.0.0/8
|
|
# - 172.16.0.0/12
|
|
# - 192.168.0.0/16
|
|
# # EKS / Carrier Grade NAT
|
|
# - 100.64.0.0/10
|
|
# # AWS Metadata & Link Local (Very Important)
|
|
# - 169.254.0.0/16
|
|
# # Loopback range
|
|
# - 127.0.0.0/8
|
|
# # Reserved / Protocol Ranges
|
|
# - 192.0.0.0/24
|
|
# - 198.18.0.0/15
|
|
# # Multicast ranges
|
|
# - 224.0.0.0/4
|
|
# # Broadcast address
|
|
# - 255.255.255.255/32
|
|
|
|
service:
|
|
type: ClusterIP
|
|
ports:
|
|
- name: http
|
|
port: 8000
|
|
protocol: TCP
|
|
targetPort: 8000
|
|
|
|
ingress:
|
|
enabled: false
|
|
ingressClassName: ""
|
|
annotations: {}
|
|
hosts: []
|
|
tls:
|
|
enabled: false
|
|
hosts: []
|
|
secretName: ""
|
|
|
|
frontend:
|
|
enabled: true
|
|
serviceAccount:
|
|
create: true
|
|
name: opik-frontend
|
|
metrics:
|
|
enabled: false
|
|
image:
|
|
repository: opik-frontend
|
|
pullPolicy: IfNotPresent
|
|
replicaCount: 1
|
|
autoscaling:
|
|
enabled: false
|
|
behavior:
|
|
scaleDown:
|
|
stabilizationWindowSeconds: 300
|
|
policies:
|
|
- type: Percent
|
|
value: 50
|
|
periodSeconds: 60
|
|
scaleUp:
|
|
stabilizationWindowSeconds: 60
|
|
policies:
|
|
- type: Pods
|
|
value: 2
|
|
periodSeconds: 60
|
|
selectPolicy: Max
|
|
backendConfigMap:
|
|
enabled: false
|
|
resources:
|
|
requests:
|
|
ephemeral-storage: 10Gi
|
|
service:
|
|
type: ClusterIP
|
|
ports:
|
|
- name: http
|
|
port: 5173
|
|
protocol: TCP
|
|
targetPort: 5173
|
|
ingress:
|
|
enabled: false
|
|
ingressClassName: ""
|
|
annotations: {}
|
|
hosts: []
|
|
# - host: opik.example.com
|
|
# paths:
|
|
# - path: /
|
|
# port: 5173
|
|
# pathType: Prefix
|
|
# - path: /api
|
|
# port: 5173
|
|
# pathType: Prefix
|
|
# - path: /opik-ai
|
|
# port: 5173
|
|
# pathType: Prefix
|
|
tls:
|
|
enabled: false
|
|
hosts: []
|
|
secretName: ""
|
|
# throttled locations
|
|
throttling: {}
|
|
# map variables for use with throttling and other places
|
|
maps: []
|
|
# use internal aws resolvr on vpc
|
|
awsResolver: false
|
|
# Enable HSTS header (only enable when running behind HTTPS termination)
|
|
# DEPRECATED: Use extraServerHeaders instead for more flexibility
|
|
hstsEnabled: false
|
|
# Cache control configuration for static assets
|
|
# Defines max-age values for different file types based on deployment frequency
|
|
# List of pattern/value pairs - order matters! First match wins in nginx map.
|
|
# Patterns are evaluated in the order defined here.
|
|
cacheControl:
|
|
# JavaScript and CSS - 7 days cache (frequent deployments with versioned/hashed filenames)
|
|
- pattern: "~assets/.*\\.(js|css)$"
|
|
value: "public, max-age=604800, immutable"
|
|
# Images - 30 days cache (static assets, but may update)
|
|
- pattern: "~(images/.*|assets/.*)\\.(jpg|jpeg|png|gif|svg|webp|ico)$"
|
|
value: "public, max-age=2592000"
|
|
# Fonts - 30 days cache (rarely change, but shorter for frequent updates)
|
|
- pattern: "~assets/.*\\.(woff|woff2|ttf|eot)$"
|
|
value: "public, max-age=2592000"
|
|
# JSON/data files - 1 day cache (may update frequently)
|
|
- pattern: "~assets/.*\\.json$"
|
|
value: "public, max-age=86400"
|
|
# HTML files and everything else - always revalidate to get fresh content
|
|
- pattern: "default"
|
|
value: "no-cache, must-revalidate"
|
|
# Extra server-level headers to add to all responses
|
|
# Use this to add custom security headers or override defaults
|
|
# Key is the header name, value can be a string or list of strings
|
|
# If list, multiple add_header directives will be generated
|
|
extraServerHeaders:
|
|
# OWASP recommended security headers (defaults)
|
|
X-Content-Type-Options: "nosniff"
|
|
X-Frame-Options: "DENY"
|
|
X-XSS-Protection: "0"
|
|
# Add custom headers or override defaults:
|
|
# X-Custom-Header: "custom-value"
|
|
# Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload"
|
|
# Multiple values example (list):
|
|
# Link:
|
|
# - "</style.css>; rel=preload; as=style"
|
|
# - "</script.js>; rel=preload; as=script"
|
|
# Content Security Policy (CSP) configuration
|
|
# Customize these lists to allow additional external services (analytics, CDNs, etc.)
|
|
# Note: The legacy 'csp.enabled' flag is still honored for backward compatibility.
|
|
# If you previously set 'csp.enabled: false', CSP headers will not be added.
|
|
contentSecurityPolicy:
|
|
# Default source for all directives
|
|
default-src:
|
|
- "'self'"
|
|
# Scripts allowed to execute
|
|
script-src:
|
|
- "'self'"
|
|
- "'unsafe-inline'"
|
|
- "'unsafe-eval'"
|
|
# Add external services here, e.g.:
|
|
# - "https://cdn.example.com"
|
|
# Styles allowed to load
|
|
style-src:
|
|
- "'self'"
|
|
- "'unsafe-inline'"
|
|
- "https://fonts.googleapis.com"
|
|
# Images allowed to load
|
|
img-src:
|
|
- "'self'"
|
|
- "data:"
|
|
- "blob:"
|
|
- "https:"
|
|
- "http:"
|
|
# Media (audio/video) allowed to load
|
|
media-src:
|
|
- "'self'"
|
|
- "data:"
|
|
- "blob:"
|
|
- "https:"
|
|
- "http:"
|
|
# Fonts allowed to load
|
|
font-src:
|
|
- "'self'"
|
|
- "data:"
|
|
- "https://fonts.gstatic.com"
|
|
# XHR/Fetch/WebSocket connections allowed
|
|
connect-src:
|
|
- "'self'"
|
|
- "ws:"
|
|
- "wss:"
|
|
- "https:"
|
|
# Add external API endpoints here, e.g.:
|
|
# - "https://api.example.com"
|
|
# Objects/plugins (Flash, Java, etc.)
|
|
object-src:
|
|
- "'none'"
|
|
# Base URI for relative URLs
|
|
base-uri:
|
|
- "'self'"
|
|
# Frame ancestors (who can embed this site)
|
|
frame-ancestors:
|
|
- "'none'"
|
|
# Child frames/workers
|
|
child-src:
|
|
- "'self'"
|
|
- https://cdn.comet.com
|
|
# Form submission targets
|
|
form-action:
|
|
- "'self'"
|
|
# Manifest files
|
|
manifest-src:
|
|
- "'self'"
|
|
# Worker, shared worker, service worker sources
|
|
worker-src:
|
|
- "'self'"
|
|
- "blob:"
|
|
upstreamConfig: {}
|
|
# proxy_read_timeout: 60
|
|
# proxy_connect_timeout: 60
|
|
# proxy_send_timeout: 60
|
|
# proxy_buffering: 'on'
|
|
# proxy_request_buffering: 'on'
|
|
# Cost Intelligence (cost-api): when enabled, the frontend nginx routes the
|
|
# ai-spend subset (<rootPath>/api/v1/private/ai-spend/*) to the standalone
|
|
# ai-cost-backend service instead of opik-backend, served same-origin so the
|
|
# platform session cookie still reaches it. Off by default; the consuming
|
|
# deployment turns it on the same way on both comet.com (comet-helm) and
|
|
# single-tenant SaaS (comet-ml-helm-chart). rootPath-aware, so it works
|
|
# whether opik is served at the root or under /opik.
|
|
aiSpendBackend:
|
|
enabled: false
|
|
host: ai-cost-backend
|
|
port: 8000
|
|
# cost-api's ROOT_PATH — the rewrite target prefix. A request to
|
|
# <rootPath>/api/v1/private/ai-spend/X is proxied as <costApiRootPath>/v1/private/ai-spend/X.
|
|
costApiRootPath: /cost-api
|
|
podDisruptionBudget:
|
|
enabled: false
|
|
|
|
mysql:
|
|
enabled: true
|
|
fullnameOverride: opik-mysql
|
|
auth:
|
|
rootPassword: "opik"
|
|
initdbScripts:
|
|
createdb.sql: |-
|
|
CREATE DATABASE IF NOT EXISTS opik DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
|
|
CREATE USER IF NOT EXISTS 'opik'@'%' IDENTIFIED BY 'opik';
|
|
GRANT ALL ON `opik`.* TO 'opik'@'%';
|
|
FLUSH PRIVILEGES;
|
|
primary:
|
|
# Use Bitnami MySQL data directory path for compatibility
|
|
dataDir: /bitnami/mysql/data
|
|
persistence:
|
|
enabled: true
|
|
size: 20Gi
|
|
|
|
minio:
|
|
enabled: true
|
|
image:
|
|
registry: docker.io
|
|
repository: cloudpirates/image-minio
|
|
tag: "RELEASE.2025-10-15T17-29-55Z-hardened"
|
|
imagePullPolicy: IfNotPresent
|
|
replicaCount: 1
|
|
config:
|
|
browserEnabled: false
|
|
persistence:
|
|
enabled: true
|
|
size: 50Gi
|
|
auth:
|
|
rootUser: "THAAIOSFODNN7EXAMPLE"
|
|
rootPassword: "LESlrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
|
|
defaultBuckets: "public:download"
|
|
fullnameOverride: opik-minio
|
|
|
|
|
|
redis:
|
|
enabled: true
|
|
# Use bitnami redis fullnameOverride for compatibility
|
|
fullnameOverride: opik-redis-master
|
|
architecture: standalone
|
|
metrics:
|
|
enabled: false
|
|
auth:
|
|
enabled: true
|
|
password: "wFSuJX9nDBdCa25sKZG7bh"
|
|
image:
|
|
registry: docker.io
|
|
repository: redis/redis-stack-server
|
|
tag: "7.2.0-v10"
|
|
pullPolicy: IfNotPresent
|
|
resources:
|
|
requests:
|
|
cpu: 15m
|
|
memory: 105M
|
|
limits:
|
|
memory: 1Gi
|
|
config:
|
|
content: |
|
|
# Redis Stack configuration
|
|
dir /data
|
|
maxmemory 105M
|
|
maxmemory-policy allkeys-lru
|
|
# Redis Stack modules are automatically loaded by the redis-stack-server image
|
|
persistence:
|
|
enabled: true
|
|
size: 8Gi
|
|
|
|
altinity-clickhouse-operator:
|
|
enabled: true
|
|
metrics:
|
|
enabled: false
|
|
serviceMonitor:
|
|
enabled: false
|
|
interval: '' # workaround for https://github.com/Altinity/clickhouse-operator/issues/1759
|
|
|
|
clickhouse:
|
|
enabled: true
|
|
shardsCount: 1
|
|
replicasCount: 1
|
|
image: altinity/clickhouse-server:25.8.16.10002.altinitystable
|
|
storage: 50Gi
|
|
logsLevel: information
|
|
# Custom health checks with longer timeouts for major version upgrades
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /ping
|
|
port: 8123
|
|
initialDelaySeconds: 60
|
|
periodSeconds: 30
|
|
timeoutSeconds: 5
|
|
failureThreshold: 10
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /ping
|
|
port: 8123
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 30
|
|
configuration:
|
|
files:
|
|
conf.d/memory.xml: |
|
|
<yandex>
|
|
<max_server_memory_usage_to_ram_ratio>0.85</max_server_memory_usage_to_ram_ratio>
|
|
</yandex>
|
|
conf.d/profiles.xml: |
|
|
<clickhouse>
|
|
<profiles>
|
|
<default>
|
|
<max_bytes_ratio_before_external_sort>0.2</max_bytes_ratio_before_external_sort>
|
|
<max_bytes_ratio_before_external_group_by>0.2</max_bytes_ratio_before_external_group_by>
|
|
<!-- CH 25.8 made the experimental Time type opt-in; required for fresh installs to replay migration 000030. -->
|
|
<enable_time_time64_type>1</enable_time_time64_type>
|
|
<!-- the new CH 25.x default (1) makes FINAL reads on skip-indexed tables over-read massively; our queries already prune on the PK/project_id, so exact mode isn't needed. -->
|
|
<use_skip_indexes_if_final_exact_mode>0</use_skip_indexes_if_final_exact_mode>
|
|
</default>
|
|
</profiles>
|
|
</clickhouse>
|
|
# Remove or add TTL to system tables that are not needed
|
|
conf.d/system_tables.xml: |
|
|
<clickhouse>
|
|
<opentelemetry_span_log remove="1"/>
|
|
<asynchronous_metric_log remove="1"/>
|
|
<processors_profile_log remove="1"/>
|
|
<text_log remove="1"/>
|
|
<trace_log remove="1"/>
|
|
<blob_storage_log remove="1"/>
|
|
<error_log>
|
|
<engine>
|
|
ENGINE MergeTree
|
|
PARTITION BY toYYYYMM(event_date)
|
|
ORDER BY (event_date, event_time)
|
|
TTL event_date + toIntervalDay(30)
|
|
SETTINGS index_granularity = 8192
|
|
</engine>
|
|
<database>system</database>
|
|
<table>error_log</table>
|
|
</error_log>
|
|
<latency_log>
|
|
<engine>
|
|
ENGINE = MergeTree
|
|
PARTITION BY toYYYYMM(event_date)
|
|
ORDER BY (event_date, event_time)
|
|
TTL event_date + toIntervalDay(30)
|
|
SETTINGS index_granularity = 8192
|
|
</engine>
|
|
<database>system</database>
|
|
<table>latency_log</table>
|
|
</latency_log>
|
|
<metric_log>
|
|
<engine>
|
|
ENGINE = MergeTree
|
|
PARTITION BY toYYYYMM(event_date)
|
|
ORDER BY (event_date, event_time)
|
|
TTL event_date + toIntervalDay(30)
|
|
SETTINGS index_granularity = 8192
|
|
</engine>
|
|
<database>system</database>
|
|
<table>metric_log</table>
|
|
</metric_log>
|
|
<query_metric_log>
|
|
<engine>
|
|
ENGINE = MergeTree
|
|
PARTITION BY toYYYYMM(event_date)
|
|
ORDER BY (event_date, event_time)
|
|
TTL event_date + toIntervalDay(30)
|
|
SETTINGS index_granularity = 8192
|
|
</engine>
|
|
<database>system</database>
|
|
<table>query_metric_log</table>
|
|
</query_metric_log>
|
|
</clickhouse>
|
|
service:
|
|
serviceTemplate: clickhouse-cluster-svc-template
|
|
templates:
|
|
podTemplate: clickhouse-cluster-pod-template
|
|
replicaServiceTemplate: clickhouse-replica-svc-template
|
|
serviceTemplate: clickhouse-cluster-svc-template
|
|
volumeClaimTemplate: storage-vc-template
|
|
extraServiceTemplates: []
|
|
extraPodTemplates: []
|
|
extraVolumeClaimTemplates: []
|
|
# -- (list) Additional volume mounts for the ClickHouse server container.
|
|
# Use this to mount volumes that ClickHouse server needs direct access to,
|
|
# such as a backup disk for embedded backups (BACKUP TO Disk(...)).
|
|
# The mount name can reference a CHI volumeClaimTemplate defined in
|
|
# `clickhouse.extraVolumeClaimTemplates` (matched by name automatically by
|
|
# the ClickHouse operator), or a volume defined in `clickhouse.extraVolumes`.
|
|
extraVolumeMounts: []
|
|
# -- (list) Additional pod-level volumes for the ClickHouse pod, independent
|
|
# of the backup server sidecar. Use this for non-PVC volume types (configMap,
|
|
# secret, emptyDir, hostPath, etc.) that should be available to the ClickHouse
|
|
# server container. For persistent storage, prefer defining a CHI-managed PVC
|
|
# via `clickhouse.extraVolumeClaimTemplates` and referencing it by name in
|
|
# `extraVolumeMounts` above.
|
|
extraVolumes: []
|
|
adminUser:
|
|
useSecret:
|
|
enabled: false
|
|
username: opik
|
|
password: opik
|
|
serviceAccount:
|
|
annotations: {}
|
|
create: false
|
|
name: ""
|
|
zookeeper:
|
|
host: opik-zookeeper
|
|
backup:
|
|
enabled: false
|
|
successfulJobsHistoryLimit: 1
|
|
serviceAccount:
|
|
annotations: {}
|
|
create: false
|
|
name: ""
|
|
schedule: "0 0 * * *" # daily at midnight
|
|
extraEnv: {}
|
|
command:
|
|
- /bin/bash
|
|
- '-cx'
|
|
- |-
|
|
export backupname=backup$(date +'%Y%m%d%H%M')
|
|
echo "BACKUP ALL EXCEPT DATABASE system TO S3('${CLICKHOUSE_BACKUP_BUCKET}/${backupname}/', '$ACCESS_KEY', '$SECRET_KEY');" > /tmp/backQuery.sql
|
|
clickhouse-client -h clickhouse-opik-clickhouse --send_timeout 600000 --receive_timeout 600000 --port 9000 --queries-file=/tmp/backQuery.sql
|
|
backupServer:
|
|
enabled: false
|
|
image: altinity/clickhouse-backup:2.6.39
|
|
port: 7171
|
|
monitoring:
|
|
enabled: false
|
|
additionalLabels: {}
|
|
annotations: {}
|
|
service:
|
|
type: ClusterIP
|
|
ports:
|
|
- name: ch-backup-rest
|
|
port: 80
|
|
targetPort: 7171
|
|
serviceMonitor:
|
|
enabled: false
|
|
additionalLabels: {}
|
|
annotations: {}
|
|
namespace: ""
|
|
portName: ""
|
|
interval: "60s"
|
|
scrapeTimeout: "30s"
|
|
relabelings: []
|
|
metricRelabelings: []
|
|
podTargetLabels: []
|
|
honorLabels: false
|
|
# -- (list) Additional volumes to add to the ClickHouse pod when the backup
|
|
# server is enabled. Use this for non-PVC volume types (emptyDir, configMap,
|
|
# secret, hostPath, etc.). For persistent storage, prefer using
|
|
# `clickhouse.extraVolumeClaimTemplates` to define a CHI-managed PVC and
|
|
# reference its name directly in `extraVolumeMounts` below (the clickhouse
|
|
# operator matches volumeMount names to volumeClaimTemplate names
|
|
# automatically). Note that `clickhouse-backup` writes local backups to
|
|
# `/var/lib/clickhouse/backup/` by default (on the same filesystem as
|
|
# ClickHouse data to preserve hard links). Mounting a separate volume at
|
|
# that path will cause backups to use full copies instead of hard links.
|
|
extraVolumes: []
|
|
# -- (list) Additional volume mounts for the `clickhouse-backup` container.
|
|
# The mount name can reference a CHI `volumeClaimTemplate` defined in
|
|
# `clickhouse.extraVolumeClaimTemplates` (matched by name), or a volume
|
|
# defined in `extraVolumes` above.
|
|
extraVolumeMounts: []
|
|
env:
|
|
LOG_LEVEL: info
|
|
ALLOW_EMPTY_BACKUPS: true
|
|
API_LISTEN: 0.0.0.0:7171
|
|
API_CREATE_INTEGRATION_TABLES: true
|
|
monitoring:
|
|
enabled: false
|
|
username: opikmon # readonly user
|
|
password: opikmon
|
|
useSecret:
|
|
enabled: false
|
|
# resources:
|
|
# requests:
|
|
# cpu: 300m
|
|
# memory: 1Gi
|
|
# limits:
|
|
# memory: 1Gi
|
|
additionalLabels: {}
|
|
annotations: {}
|
|
port: 9363
|
|
service:
|
|
type: ClusterIP
|
|
ports:
|
|
- name: prometheus-metrics
|
|
port: 80
|
|
targetPort: 9363
|
|
serviceMonitor:
|
|
enabled: false
|
|
additionalLabels: {}
|
|
annotations: {}
|
|
namespace: ""
|
|
portName: ""
|
|
interval: "60s"
|
|
scrapeTimeout: "30s"
|
|
relabelings: []
|
|
metricRelabelings: []
|
|
podTargetLabels: []
|
|
honorLabels: false
|
|
namespaceDomainPattern: ""
|
|
|
|
zookeeper:
|
|
enabled: true
|
|
fullnameOverride: opik-zookeeper
|
|
# Server ID offset for Zookeeper cluster. Default is 1 for compatibility with
|
|
# previous Bitnami-based installations. Set to 0 only for fresh installs.
|
|
serverIdOffset: 1
|
|
image:
|
|
registry: docker.io
|
|
repository: zookeeper
|
|
tag: "3.9.4"
|
|
imagePullPolicy: IfNotPresent
|
|
replicaCount: 1
|
|
podDisruptionBudget:
|
|
enabled: true
|
|
persistence:
|
|
# Use bitnami zookeeper data directory path for compatibility
|
|
mountPath: /bitnami/zookeeper
|
|
dataDir: /bitnami/zookeeper/data
|
|
enabled: true
|
|
size: "50Gi"
|
|
headless:
|
|
publishNotReadyAddresses: true
|
|
extraEnvVars:
|
|
- name: ZK_HEAP_SIZE
|
|
value: "512M"
|
|
- name: ZOO_DATA_DIR
|
|
value: "/bitnami/zookeeper/data"
|
|
commonLabels:
|
|
app.kubernetes.io/name: zookeeper-opik
|
|
|
|
# resources:
|
|
# requests:
|
|
# cpu: 300m
|
|
# memory: 1500Mi
|
|
# limits:
|
|
# memory: 2Gi
|