diff --git a/README.md b/README.md index 82306d9..6ea5141 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ These services require building custom Docker images from source. | [Odoo](./src/odoo) | 19.0 | | [Ollama](./src/ollama) | 0.14.3 | | [Open WebUI](./src/open-webui) | main | -| [Phoenix (Arize)](./src/phoenix) | 12.35.0-nonroot | +| [Phoenix (Arize)](./src/phoenix) | 13.3.0 | | [Pingora Proxy Manager](./src/pingora-proxy-manager) | v1.0.3 | | [Open WebUI Rust](./src/open-webui-rust) | latest | | [OpenCode](./src/opencode) | 1.1.27 | @@ -113,6 +113,7 @@ These services require building custom Docker images from source. | [OpenCut](./src/opencut) | latest | | [OpenList](./src/openlist) | latest | | [OpenLIT](./apps/openlit) | latest | +| [Opik](./apps/opik) | 1.10.23 | | [OpenSandbox](./apps/opensandbox) | v1.0.5 | | [OpenObserve](./apps/openobserve) | v0.50.0 | | [OpenSearch](./src/opensearch) | 2.19.0 | diff --git a/README.zh.md b/README.zh.md index 7eddb96..75fbba1 100644 --- a/README.zh.md +++ b/README.zh.md @@ -105,7 +105,7 @@ Compose Anything 通过提供一组高质量的 Docker Compose 配置文件, | [Odoo](./src/odoo) | 19.0 | | [Ollama](./src/ollama) | 0.14.3 | | [Open WebUI](./src/open-webui) | main | -| [Phoenix (Arize)](./src/phoenix) | 12.35.0-nonroot | +| [Phoenix (Arize)](./src/phoenix) | 13.3.0 | | [Pingora Proxy Manager](./src/pingora-proxy-manager) | v1.0.3 | | [Open WebUI Rust](./src/open-webui-rust) | latest | | [OpenCode](./src/opencode) | 1.1.27 | @@ -113,6 +113,7 @@ Compose Anything 通过提供一组高质量的 Docker Compose 配置文件, | [OpenCut](./src/opencut) | latest | | [OpenList](./src/openlist) | latest | | [OpenLIT](./apps/openlit) | latest | +| [Opik](./apps/opik) | 1.10.23 | | [OpenSandbox](./apps/opensandbox) | v1.0.5 | | [OpenObserve](./apps/openobserve) | v0.50.0 | | [OpenSearch](./src/opensearch) | 2.19.0 | diff --git a/apps/opik/.env.example b/apps/opik/.env.example new file mode 100644 index 0000000..f9f655a --- /dev/null +++ b/apps/opik/.env.example @@ -0,0 +1,127 @@ +# Global Settings +GLOBAL_REGISTRY= +TZ=UTC + +# Opik Version +OPIK_VERSION=1.10.23 + +# Opik Frontend Port +OPIK_PORT_OVERRIDE=5173 +OPIK_BACKEND_PORT_OVERRIDE=3003 + +# MySQL Configuration +MYSQL_VERSION=8.4.2 +MYSQL_ROOT_PASSWORD=opik +MYSQL_DATABASE=opik +MYSQL_USER=opik +MYSQL_PASSWORD=opik + +# Redis Configuration +REDIS_VERSION=7.2.4-alpine3.19 +REDIS_PASSWORD=opik + +# ClickHouse Configuration +CLICKHOUSE_VERSION=25.3.6.56-alpine +CLICKHOUSE_DB=opik +CLICKHOUSE_USER=opik +CLICKHOUSE_PASSWORD=opik + +# ZooKeeper Configuration +ZOOKEEPER_VERSION=3.9.4 + +# MinIO Configuration +MINIO_VERSION=RELEASE.2025-03-12T18-04-18Z +MINIO_MC_VERSION=RELEASE.2025-03-12T17-29-24Z +MINIO_ROOT_USER=opikminio +MINIO_ROOT_PASSWORD=opikminio123 +MINIO_PORT_OVERRIDE=9000 +MINIO_CONSOLE_PORT_OVERRIDE=9090 + +# Alpine Version (for init containers) +ALPINE_VERSION=latest + +# Opik Feature Toggles +OPIK_USAGE_REPORT_ENABLED=true +TOGGLE_OPIK_AI_ENABLED=false +TOGGLE_GUARDRAILS_ENABLED=false +TOGGLE_WELCOME_WIZARD_ENABLED=true +CORS=false + +# Attachment Settings +ATTACHMENTS_STRIP_MIN_SIZE=256000 +JACKSON_MAX_STRING_LENGTH=104857600 + +# Python Backend Configuration +PYTHON_BACKEND_PORT=8000 +PYTHON_CODE_EXECUTOR_STRATEGY=process +PYTHON_CODE_EXECUTOR_CONTAINERS_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 + +# Optimization Studio Settings +OPTSTUDIO_MAX_CONCURRENT_JOBS=5 +OPTSTUDIO_LOG_LEVEL=INFO +OPTSTUDIO_LLM_MAX_TOKENS=8192 + +# RQ Worker Settings +RQ_WORKER_ENABLED=true +RQ_WORKER_TTL_FAILURE=86400 + +# LLM API Keys (Optional - for AI features) +OPENAI_API_KEY= +ANTHROPIC_API_KEY= +OPENROUTER_API_KEY= + +# Nginx Configuration +NGINX_PORT=5173 +NGINX_CONF_SUFFIX=local + +# Resource Limits - MySQL +MYSQL_CPU_LIMIT=1.0 +MYSQL_MEMORY_LIMIT=1G +MYSQL_CPU_RESERVATION=0.5 +MYSQL_MEMORY_RESERVATION=512M + +# Resource Limits - Redis +REDIS_CPU_LIMIT=0.5 +REDIS_MEMORY_LIMIT=512M +REDIS_CPU_RESERVATION=0.25 +REDIS_MEMORY_RESERVATION=256M + +# Resource Limits - ZooKeeper +ZOOKEEPER_CPU_LIMIT=0.5 +ZOOKEEPER_MEMORY_LIMIT=1G +ZOOKEEPER_CPU_RESERVATION=0.25 +ZOOKEEPER_MEMORY_RESERVATION=512M + +# Resource Limits - ClickHouse +CLICKHOUSE_CPU_LIMIT=2.0 +CLICKHOUSE_MEMORY_LIMIT=4G +CLICKHOUSE_CPU_RESERVATION=0.5 +CLICKHOUSE_MEMORY_RESERVATION=1G + +# Resource Limits - MinIO +MINIO_CPU_LIMIT=1.0 +MINIO_MEMORY_LIMIT=1G +MINIO_CPU_RESERVATION=0.25 +MINIO_MEMORY_RESERVATION=512M + +# Resource Limits - Backend +BACKEND_CPU_LIMIT=2.0 +BACKEND_MEMORY_LIMIT=2G +BACKEND_CPU_RESERVATION=0.5 +BACKEND_MEMORY_RESERVATION=1G + +# Resource Limits - Python Backend +PYTHON_BACKEND_CPU_LIMIT=1.0 +PYTHON_BACKEND_MEMORY_LIMIT=1G +PYTHON_BACKEND_CPU_RESERVATION=0.5 +PYTHON_BACKEND_MEMORY_RESERVATION=512M + +# Resource Limits - Frontend +FRONTEND_CPU_LIMIT=0.5 +FRONTEND_MEMORY_LIMIT=512M +FRONTEND_CPU_RESERVATION=0.25 +FRONTEND_MEMORY_RESERVATION=256M diff --git a/apps/opik/README.md b/apps/opik/README.md new file mode 100644 index 0000000..f7e13ab --- /dev/null +++ b/apps/opik/README.md @@ -0,0 +1,157 @@ +# Opik + +[English](./README.md) | [中文](./README.zh.md) + +This service deploys [Opik](https://github.com/comet-ml/opik), an open-source platform for LLM observability, evaluation, and optimization. Opik helps you debug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards. + +## Services + +- **frontend**: Opik web UI (Nginx) +- **backend**: Main Opik backend API service (Java/Dropwizard) +- **python-backend**: Python backend for code execution and AI features +- **mysql**: MySQL database for state persistence +- **clickhouse**: ClickHouse analytics database for trace storage +- **redis**: Redis for caching and job queues +- **zookeeper**: ZooKeeper for ClickHouse coordination +- **minio**: S3-compatible object storage for attachments + +## Quick Start + +1. Copy `.env.example` to `.env`: + + ```bash + cp .env.example .env + ``` + +2. Update critical secrets in `.env` (optional for local development): + + ```bash + # Generate secure passwords if needed + MYSQL_ROOT_PASSWORD=your-secure-password + MYSQL_PASSWORD=your-secure-password + REDIS_PASSWORD=your-secure-password + CLICKHOUSE_PASSWORD=your-secure-password + MINIO_ROOT_PASSWORD=your-secure-password + ``` + +3. Start the services: + + ```bash + docker compose up -d + ``` + +4. Access Opik at `http://localhost:5173` + +## Core Environment Variables + +| Variable | Description | Default | +| ------------------------------- | -------------------------------- | --------- | +| `OPIK_VERSION` | Opik container image version | `1.10.23` | +| `OPIK_PORT_OVERRIDE` | Web UI port | `5173` | +| `OPIK_BACKEND_PORT_OVERRIDE` | Backend API port | `3003` | +| `OPIK_USAGE_REPORT_ENABLED` | Enable anonymous usage reporting | `true` | +| `TOGGLE_WELCOME_WIZARD_ENABLED` | Show welcome wizard on first run | `true` | + +## Database Configuration + +| Variable | Description | Default | +| --------------------- | ------------------------ | ------------------ | +| `MYSQL_VERSION` | MySQL version | `8.4.2` | +| `MYSQL_ROOT_PASSWORD` | MySQL root password | `opik` | +| `MYSQL_DATABASE` | MySQL database name | `opik` | +| `MYSQL_USER` | MySQL username | `opik` | +| `MYSQL_PASSWORD` | MySQL password | `opik` | +| `CLICKHOUSE_VERSION` | ClickHouse version | `25.3.6.56-alpine` | +| `CLICKHOUSE_DB` | ClickHouse database name | `opik` | +| `CLICKHOUSE_USER` | ClickHouse username | `opik` | +| `CLICKHOUSE_PASSWORD` | ClickHouse password | `opik` | + +## Storage & Cache Configuration + +| Variable | Description | Default | +| ----------------------------- | -------------------- | ------------------ | +| `REDIS_VERSION` | Redis version | `7.2.4-alpine3.19` | +| `REDIS_PASSWORD` | Redis password | `opik` | +| `MINIO_ROOT_USER` | MinIO admin username | `opikminio` | +| `MINIO_ROOT_PASSWORD` | MinIO admin password | `opikminio123` | +| `MINIO_PORT_OVERRIDE` | MinIO API port | `9000` | +| `MINIO_CONSOLE_PORT_OVERRIDE` | MinIO console port | `9090` | + +## AI Features Configuration (Optional) + +| Variable | Description | Default | +| --------------------------- | ---------------------------------- | ------- | +| `TOGGLE_OPIK_AI_ENABLED` | Enable Opik AI features | `false` | +| `TOGGLE_GUARDRAILS_ENABLED` | Enable guardrails | `false` | +| `OPENAI_API_KEY` | OpenAI API key for AI features | `` | +| `ANTHROPIC_API_KEY` | Anthropic API key for AI features | `` | +| `OPENROUTER_API_KEY` | OpenRouter API key for AI features | `` | + +## Python Backend Configuration + +| Variable | Description | Default | +| ------------------------------------------- | ------------------------------------------- | --------- | +| `PYTHON_CODE_EXECUTOR_STRATEGY` | Code execution strategy (process/container) | `process` | +| `PYTHON_CODE_EXECUTOR_CONTAINERS_NUM` | Number of executor containers | `5` | +| `PYTHON_CODE_EXECUTOR_EXEC_TIMEOUT_IN_SECS` | Code execution timeout | `3` | +| `PYTHON_CODE_EXECUTOR_ALLOW_NETWORK` | Allow network access in code execution | `false` | +| `OPTSTUDIO_MAX_CONCURRENT_JOBS` | Max concurrent optimization jobs | `5` | +| `OPTSTUDIO_LOG_LEVEL` | Optimization studio log level | `INFO` | +| `OPTSTUDIO_LLM_MAX_TOKENS` | Max tokens for LLM calls | `8192` | + +## Volumes + +- `mysql_data`: MySQL database files +- `redis_data`: Redis persistence data +- `zookeeper_data`: ZooKeeper data +- `clickhouse_data`: ClickHouse data files +- `clickhouse_logs`: ClickHouse logs +- `clickhouse_config`: ClickHouse configuration +- `minio_data`: MinIO object storage data + +## Resource Limits + +All services have configurable CPU and memory limits: + +| Service | CPU Limit | Memory Limit | +| -------------- | --------- | ------------ | +| frontend | 0.5 | 512M | +| backend | 2.0 | 2G | +| python-backend | 1.0 | 1G | +| mysql | 1.0 | 1G | +| clickhouse | 2.0 | 4G | +| redis | 0.5 | 512M | +| zookeeper | 0.5 | 1G | +| minio | 1.0 | 1G | + +## SDK Configuration + +To use the Opik Python SDK with this local deployment: + +```python +import opik + +# Configure for local deployment +opik.configure(use_local=True) + +# Or set environment variables +import os +os.environ["OPIK_URL_OVERRIDE"] = "http://localhost:5173/api" +os.environ["OPIK_API_KEY"] = "" # Leave empty for local deployment + +# Start tracing +@opik.track +def my_llm_function(user_question: str) -> str: + # Your LLM code here + return "Hello" +``` + +## Documentation + +- [Opik Documentation](https://www.comet.com/docs/opik/) +- [Python SDK Reference](https://www.comet.com/docs/opik/python-sdk-reference/) +- [GitHub Repository](https://github.com/comet-ml/opik) + +## License + +Opik is licensed under the Apache 2.0 License. diff --git a/apps/opik/README.zh.md b/apps/opik/README.zh.md new file mode 100644 index 0000000..330b00f --- /dev/null +++ b/apps/opik/README.zh.md @@ -0,0 +1,157 @@ +# Opik + +[English](./README.md) | [中文](./README.zh.md) + +本服务部署 [Opik](https://github.com/comet-ml/opik),一个开源的 LLM 可观测性、评估和优化平台。Opik 帮助你调试、评估和监控 LLM 应用程序、RAG 系统和智能体工作流,提供全面的追踪、自动化评估和生产级仪表板。 + +## 服务组件 + +- **frontend**:Opik Web 界面(Nginx) +- **backend**:Opik 主后端 API 服务(Java/Dropwizard) +- **python-backend**:Python 后端,用于代码执行和 AI 功能 +- **mysql**:MySQL 数据库,用于状态持久化 +- **clickhouse**:ClickHouse 分析数据库,用于追踪数据存储 +- **redis**:Redis,用于缓存和任务队列 +- **zookeeper**:ZooKeeper,用于 ClickHouse 协调 +- **minio**:兼容 S3 的对象存储,用于附件 + +## 快速开始 + +1. 复制 `.env.example` 到 `.env`: + + ```bash + cp .env.example .env + ``` + +2. 更新 `.env` 中的关键密钥(本地开发可选): + + ```bash + # 如需生成安全密码 + MYSQL_ROOT_PASSWORD=your-secure-password + MYSQL_PASSWORD=your-secure-password + REDIS_PASSWORD=your-secure-password + CLICKHOUSE_PASSWORD=your-secure-password + MINIO_ROOT_PASSWORD=your-secure-password + ``` + +3. 启动服务: + + ```bash + docker compose up -d + ``` + +4. 访问 Opik:`http://localhost:5173` + +## 核心环境变量 + +| 变量名 | 描述 | 默认值 | +| ------------------------------- | ---------------------- | --------- | +| `OPIK_VERSION` | Opik 容器镜像版本 | `1.10.23` | +| `OPIK_PORT_OVERRIDE` | Web UI 端口 | `5173` | +| `OPIK_BACKEND_PORT_OVERRIDE` | 后端 API 端口 | `3003` | +| `OPIK_USAGE_REPORT_ENABLED` | 启用匿名使用报告 | `true` | +| `TOGGLE_WELCOME_WIZARD_ENABLED` | 首次运行时显示欢迎向导 | `true` | + +## 数据库配置 + +| 变量名 | 描述 | 默认值 | +| --------------------- | ------------------- | ------------------ | +| `MYSQL_VERSION` | MySQL 版本 | `8.4.2` | +| `MYSQL_ROOT_PASSWORD` | MySQL root 密码 | `opik` | +| `MYSQL_DATABASE` | MySQL 数据库名 | `opik` | +| `MYSQL_USER` | MySQL 用户名 | `opik` | +| `MYSQL_PASSWORD` | MySQL 密码 | `opik` | +| `CLICKHOUSE_VERSION` | ClickHouse 版本 | `25.3.6.56-alpine` | +| `CLICKHOUSE_DB` | ClickHouse 数据库名 | `opik` | +| `CLICKHOUSE_USER` | ClickHouse 用户名 | `opik` | +| `CLICKHOUSE_PASSWORD` | ClickHouse 密码 | `opik` | + +## 存储与缓存配置 + +| 变量名 | 描述 | 默认值 | +| ----------------------------- | ------------------ | ------------------ | +| `REDIS_VERSION` | Redis 版本 | `7.2.4-alpine3.19` | +| `REDIS_PASSWORD` | Redis 密码 | `opik` | +| `MINIO_ROOT_USER` | MinIO 管理员用户名 | `opikminio` | +| `MINIO_ROOT_PASSWORD` | MinIO 管理员密码 | `opikminio123` | +| `MINIO_PORT_OVERRIDE` | MinIO API 端口 | `9000` | +| `MINIO_CONSOLE_PORT_OVERRIDE` | MinIO 控制台端口 | `9090` | + +## AI 功能配置(可选) + +| 变量名 | 描述 | 默认值 | +| --------------------------- | ------------------- | ------- | +| `TOGGLE_OPIK_AI_ENABLED` | 启用 Opik AI 功能 | `false` | +| `TOGGLE_GUARDRAILS_ENABLED` | 启用护栏功能 | `false` | +| `OPENAI_API_KEY` | OpenAI API 密钥 | `` | +| `ANTHROPIC_API_KEY` | Anthropic API 密钥 | `` | +| `OPENROUTER_API_KEY` | OpenRouter API 密钥 | `` | + +## Python 后端配置 + +| 变量名 | 描述 | 默认值 | +| ------------------------------------------- | --------------------------------- | --------- | +| `PYTHON_CODE_EXECUTOR_STRATEGY` | 代码执行策略(process/container) | `process` | +| `PYTHON_CODE_EXECUTOR_CONTAINERS_NUM` | 执行器容器数量 | `5` | +| `PYTHON_CODE_EXECUTOR_EXEC_TIMEOUT_IN_SECS` | 代码执行超时时间 | `3` | +| `PYTHON_CODE_EXECUTOR_ALLOW_NETWORK` | 允许代码执行访问网络 | `false` | +| `OPTSTUDIO_MAX_CONCURRENT_JOBS` | 最大并发优化任务数 | `5` | +| `OPTSTUDIO_LOG_LEVEL` | 优化工作室日志级别 | `INFO` | +| `OPTSTUDIO_LLM_MAX_TOKENS` | LLM 调用最大令牌数 | `8192` | + +## 数据卷 + +- `mysql_data`:MySQL 数据库文件 +- `redis_data`:Redis 持久化数据 +- `zookeeper_data`:ZooKeeper 数据 +- `clickhouse_data`:ClickHouse 数据文件 +- `clickhouse_logs`:ClickHouse 日志 +- `clickhouse_config`:ClickHouse 配置 +- `minio_data`:MinIO 对象存储数据 + +## 资源限制 + +所有服务都有可配置的 CPU 和内存限制: + +| 服务 | CPU 限制 | 内存限制 | +| -------------- | -------- | -------- | +| frontend | 0.5 | 512M | +| backend | 2.0 | 2G | +| python-backend | 1.0 | 1G | +| mysql | 1.0 | 1G | +| clickhouse | 2.0 | 4G | +| redis | 0.5 | 512M | +| zookeeper | 0.5 | 1G | +| minio | 1.0 | 1G | + +## SDK 配置 + +要将 Opik Python SDK 与此本地部署一起使用: + +```python +import opik + +# 配置为本地部署 +opik.configure(use_local=True) + +# 或设置环境变量 +import os +os.environ["OPIK_URL_OVERRIDE"] = "http://localhost:5173/api" +os.environ["OPIK_API_KEY"] = "" # 本地部署留空 + +# 开始追踪 +@opik.track +def my_llm_function(user_question: str) -> str: + # 你的 LLM 代码 + return "Hello" +``` + +## 文档 + +- [Opik 文档](https://www.comet.com/docs/opik/) +- [Python SDK 参考](https://www.comet.com/docs/opik/python-sdk-reference/) +- [GitHub 仓库](https://github.com/comet-ml/opik) + +## 许可证 + +Opik 采用 Apache 2.0 许可证。 diff --git a/apps/opik/docker-compose.yaml b/apps/opik/docker-compose.yaml new file mode 100644 index 0000000..5f37503 --- /dev/null +++ b/apps/opik/docker-compose.yaml @@ -0,0 +1,351 @@ +# Opik - Open-source LLM Observability, Evaluation, and Optimization Platform +# https://github.com/comet-ml/opik + +x-defaults: &defaults + restart: unless-stopped + logging: + driver: json-file + options: + max-size: 100m + max-file: '3' + +services: + mysql: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}mysql:${MYSQL_VERSION:-8.4.2} + hostname: mysql + environment: + TZ: ${TZ:-UTC} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-opik} + MYSQL_DATABASE: ${MYSQL_DATABASE:-opik} + MYSQL_USER: ${MYSQL_USER:-opik} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:-opik} + volumes: + - mysql_data:/var/lib/mysql + healthcheck: + test: [CMD, mysqladmin, ping, -h, 127.0.0.1, --silent] + interval: 5s + timeout: 5s + retries: 30 + start_period: 30s + deploy: + resources: + limits: + cpus: ${MYSQL_CPU_LIMIT:-1.0} + memory: ${MYSQL_MEMORY_LIMIT:-1G} + reservations: + cpus: ${MYSQL_CPU_RESERVATION:-0.5} + memory: ${MYSQL_MEMORY_RESERVATION:-512M} + + redis: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}redis:${REDIS_VERSION:-7.2.4-alpine3.19} + hostname: redis + command: redis-server --requirepass ${REDIS_PASSWORD:-opik} + environment: + TZ: ${TZ:-UTC} + volumes: + - redis_data:/data + healthcheck: + test: [CMD, nc, -z, localhost, '6379'] + interval: 5s + timeout: 5s + retries: 10 + start_period: 10s + deploy: + resources: + limits: + cpus: ${REDIS_CPU_LIMIT:-0.5} + memory: ${REDIS_MEMORY_LIMIT:-512M} + reservations: + cpus: ${REDIS_CPU_RESERVATION:-0.25} + memory: ${REDIS_MEMORY_RESERVATION:-256M} + + zookeeper: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}zookeeper:${ZOOKEEPER_VERSION:-3.9.4} + hostname: zookeeper + user: root + entrypoint: + - /bin/bash + - -c + - | + mkdir -p /bitnami/zookeeper/data + chown -R zookeeper:zookeeper /bitnami/zookeeper + exec gosu zookeeper /docker-entrypoint.sh zkServer.sh start-foreground + environment: + TZ: ${TZ:-UTC} + JVMFLAGS: -Xmx512m + ZOO_4LW_COMMANDS_WHITELIST: 'srvr,ruok' + ZOO_DATA_DIR: /bitnami/zookeeper/data + ZOO_DATA_LOG_DIR: /bitnami/zookeeper/data + volumes: + - zookeeper_data:/bitnami/zookeeper + healthcheck: + test: [CMD-SHELL, 'echo ruok | nc localhost 2181 | grep -q imok'] + interval: 5s + timeout: 5s + retries: 30 + start_period: 10s + deploy: + resources: + limits: + cpus: ${ZOOKEEPER_CPU_LIMIT:-0.5} + memory: ${ZOOKEEPER_MEMORY_LIMIT:-1G} + reservations: + cpus: ${ZOOKEEPER_CPU_RESERVATION:-0.25} + memory: ${ZOOKEEPER_MEMORY_RESERVATION:-512M} + + clickhouse-init: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}alpine:${ALPINE_VERSION:-latest} + volumes: + - ./clickhouse_config:/clickhouse_config_files:ro + - clickhouse_config:/config + command: | + sh -c " + cp -r /clickhouse_config_files/* /config/ 2>/dev/null || true + chown -R 1000:1000 /config + " + deploy: + resources: + limits: + cpus: '0.1' + memory: 64M + + clickhouse: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}clickhouse/clickhouse-server:${CLICKHOUSE_VERSION:-25.3.6.56-alpine} + hostname: clickhouse + environment: + TZ: ${TZ:-UTC} + CLICKHOUSE_DB: ${CLICKHOUSE_DB:-opik} + CLICKHOUSE_USER: ${CLICKHOUSE_USER:-opik} + CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:-opik} + CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1 + volumes: + - clickhouse_data:/var/lib/clickhouse + - clickhouse_logs:/var/log/clickhouse-server + - clickhouse_config:/etc/clickhouse-server/config.d + ulimits: + nofile: + soft: 262144 + hard: 262144 + depends_on: + zookeeper: + condition: service_healthy + clickhouse-init: + condition: service_completed_successfully + healthcheck: + test: [CMD, wget, --spider, -q, 'http://127.0.0.1:8123/ping'] + interval: 5s + timeout: 5s + retries: 30 + start_period: 30s + deploy: + resources: + limits: + cpus: ${CLICKHOUSE_CPU_LIMIT:-2.0} + memory: ${CLICKHOUSE_MEMORY_LIMIT:-4G} + reservations: + cpus: ${CLICKHOUSE_CPU_RESERVATION:-0.5} + memory: ${CLICKHOUSE_MEMORY_RESERVATION:-1G} + + minio: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}minio/minio:${MINIO_VERSION:-RELEASE.2025-03-12T18-04-18Z} + hostname: minio + environment: + TZ: ${TZ:-UTC} + MINIO_ROOT_USER: ${MINIO_ROOT_USER:-opikminio} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-opikminio123} + command: server --console-address ":9090" /data + volumes: + - minio_data:/data + ports: + - '${MINIO_PORT_OVERRIDE:-9000}:9000' + - '${MINIO_CONSOLE_PORT_OVERRIDE:-9090}:9090' + healthcheck: + test: [CMD, curl, -f, 'http://localhost:9000/minio/health/live'] + interval: 5s + timeout: 10s + retries: 10 + start_period: 10s + deploy: + resources: + limits: + cpus: ${MINIO_CPU_LIMIT:-1.0} + memory: ${MINIO_MEMORY_LIMIT:-1G} + reservations: + cpus: ${MINIO_CPU_RESERVATION:-0.25} + memory: ${MINIO_MEMORY_RESERVATION:-512M} + + minio-init: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}minio/mc:${MINIO_MC_VERSION:-RELEASE.2025-03-12T17-29-24Z} + depends_on: + minio: + condition: service_healthy + entrypoint: > + /bin/sh -c " + sleep 5s; + /usr/bin/mc alias set s3 http://minio:9000 $${MINIO_ROOT_USER:-opikminio} $${MINIO_ROOT_PASSWORD:-opikminio123} --api S3v4; + /usr/bin/mc mb --ignore-existing s3/public; + /usr/bin/mc anonymous set download s3/public/; + " + deploy: + resources: + limits: + cpus: '0.1' + memory: 64M + + backend: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}ghcr.io/comet-ml/opik/opik-backend:${OPIK_VERSION:-1.10.23} + hostname: backend + command: [bash, -c, './run_db_migrations.sh && ./entrypoint.sh'] + environment: + TZ: ${TZ:-UTC} + STATE_DB_PROTOCOL: 'jdbc:mysql://' + STATE_DB_URL: 'mysql:3306/opik?createDatabaseIfNotExist=true&rewriteBatchedStatements=true' + STATE_DB_DATABASE_NAME: ${MYSQL_DATABASE:-opik} + STATE_DB_USER: ${MYSQL_USER:-opik} + STATE_DB_PASS: ${MYSQL_PASSWORD:-opik} + ANALYTICS_DB_MIGRATIONS_URL: 'jdbc:clickhouse://clickhouse:8123' + ANALYTICS_DB_MIGRATIONS_USER: ${CLICKHOUSE_USER:-opik} + ANALYTICS_DB_MIGRATIONS_PASS: ${CLICKHOUSE_PASSWORD:-opik} + ANALYTICS_DB_PROTOCOL: HTTP + ANALYTICS_DB_HOST: clickhouse + ANALYTICS_DB_PORT: 8123 + ANALYTICS_DB_DATABASE_NAME: ${CLICKHOUSE_DB:-opik} + ANALYTICS_DB_USERNAME: ${CLICKHOUSE_USER:-opik} + ANALYTICS_DB_PASS: ${CLICKHOUSE_PASSWORD:-opik} + JAVA_OPTS: '-Dliquibase.propertySubstitutionEnabled=true -XX:+UseG1GC -XX:MaxRAMPercentage=80.0' + REDIS_URL: redis://:${REDIS_PASSWORD:-opik}@redis:6379/ + OPIK_OTEL_SDK_ENABLED: 'false' + OPIK_USAGE_REPORT_ENABLED: ${OPIK_USAGE_REPORT_ENABLED:-true} + AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-opikminio} + AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-opikminio123} + IS_MINIO: 'true' + S3_URL: http://minio:9000 + PYTHON_EVALUATOR_URL: http://python-backend:8000 + TOGGLE_OPIK_AI_ENABLED: ${TOGGLE_OPIK_AI_ENABLED:-false} + TOGGLE_GUARDRAILS_ENABLED: ${TOGGLE_GUARDRAILS_ENABLED:-false} + TOGGLE_WELCOME_WIZARD_ENABLED: ${TOGGLE_WELCOME_WIZARD_ENABLED:-true} + CORS: ${CORS:-false} + ATTACHMENTS_STRIP_MIN_SIZE: ${ATTACHMENTS_STRIP_MIN_SIZE:-256000} + JACKSON_MAX_STRING_LENGTH: ${JACKSON_MAX_STRING_LENGTH:-104857600} + ports: + - '${OPIK_BACKEND_PORT_OVERRIDE:-3003}:3003' + depends_on: + mysql: + condition: service_healthy + clickhouse: + condition: service_healthy + minio: + condition: service_healthy + redis: + condition: service_healthy + healthcheck: + test: [CMD, curl, -f, 'http://localhost:8080/health-check'] + interval: 10s + timeout: 10s + retries: 30 + start_period: 60s + deploy: + resources: + limits: + cpus: ${BACKEND_CPU_LIMIT:-2.0} + memory: ${BACKEND_MEMORY_LIMIT:-2G} + reservations: + cpus: ${BACKEND_CPU_RESERVATION:-0.5} + memory: ${BACKEND_MEMORY_RESERVATION:-1G} + tmpfs: + - /tmp + + python-backend: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}ghcr.io/comet-ml/opik/opik-python-backend:${OPIK_VERSION:-1.10.23} + hostname: python-backend + privileged: true + environment: + TZ: ${TZ:-UTC} + OPIK_OTEL_SDK_ENABLED: 'false' + PYTHON_CODE_EXECUTOR_IMAGE_TAG: ${OPIK_VERSION:-1.10.23} + PYTHON_CODE_EXECUTOR_STRATEGY: ${PYTHON_CODE_EXECUTOR_STRATEGY:-process} + PYTHON_CODE_EXECUTOR_CONTAINERS_NUM: ${PYTHON_CODE_EXECUTOR_CONTAINERS_NUM:-5} + PYTHON_CODE_EXECUTOR_EXEC_TIMEOUT_IN_SECS: ${PYTHON_CODE_EXECUTOR_EXEC_TIMEOUT_IN_SECS:-3} + PYTHON_CODE_EXECUTOR_ALLOW_NETWORK: ${PYTHON_CODE_EXECUTOR_ALLOW_NETWORK:-false} + PYTHON_CODE_EXECUTOR_CPU_SHARES: ${PYTHON_CODE_EXECUTOR_CPU_SHARES:-512} + PYTHON_CODE_EXECUTOR_MEM_LIMIT: ${PYTHON_CODE_EXECUTOR_MEM_LIMIT:-256m} + OPIK_VERSION: ${OPIK_VERSION:-1.10.23} + OPIK_REVERSE_PROXY_URL: http://frontend:5173/api + PYTHON_BACKEND_PORT: ${PYTHON_BACKEND_PORT:-8000} + OPENAI_API_KEY: ${OPENAI_API_KEY:-} + ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} + OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-} + REDIS_URL: redis://:${REDIS_PASSWORD:-opik}@redis:6379/0 + RQ_WORKER_ENABLED: ${RQ_WORKER_ENABLED:-true} + OPTSTUDIO_MAX_CONCURRENT_JOBS: ${OPTSTUDIO_MAX_CONCURRENT_JOBS:-5} + OPTSTUDIO_LOG_LEVEL: ${OPTSTUDIO_LOG_LEVEL:-INFO} + OPTSTUDIO_LLM_MAX_TOKENS: ${OPTSTUDIO_LLM_MAX_TOKENS:-8192} + RQ_WORKER_TTL_FAILURE: ${RQ_WORKER_TTL_FAILURE:-86400} + OPIK_URL_OVERRIDE: http://backend:8080 + depends_on: + backend: + condition: service_healthy + redis: + condition: service_healthy + healthcheck: + test: [CMD, wget, --spider, -q, 'http://127.0.0.1:8000/healthcheck'] + interval: 10s + timeout: 10s + retries: 10 + start_period: 30s + deploy: + resources: + limits: + cpus: ${PYTHON_BACKEND_CPU_LIMIT:-1.0} + memory: ${PYTHON_BACKEND_MEMORY_LIMIT:-1G} + reservations: + cpus: ${PYTHON_BACKEND_CPU_RESERVATION:-0.5} + memory: ${PYTHON_BACKEND_MEMORY_RESERVATION:-512M} + tmpfs: + - /var/lib/docker + + frontend: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}ghcr.io/comet-ml/opik/opik-frontend:${OPIK_VERSION:-1.10.23} + hostname: frontend + ports: + - '${OPIK_PORT_OVERRIDE:-5173}:5173' + environment: + TZ: ${TZ:-UTC} + NGINX_PORT: ${NGINX_PORT:-5173} + NGINX_CONF_SUFFIX: ${NGINX_CONF_SUFFIX:-local} + depends_on: + backend: + condition: service_healthy + healthcheck: + test: [CMD-SHELL, 'curl --fail --fail-early http://localhost:5173/health'] + interval: 10s + timeout: 10s + retries: 10 + start_period: 10s + deploy: + resources: + limits: + cpus: ${FRONTEND_CPU_LIMIT:-0.5} + memory: ${FRONTEND_MEMORY_LIMIT:-512M} + reservations: + cpus: ${FRONTEND_CPU_RESERVATION:-0.25} + memory: ${FRONTEND_MEMORY_RESERVATION:-256M} + +volumes: + mysql_data: + redis_data: + zookeeper_data: + clickhouse_data: + clickhouse_logs: + clickhouse_config: + minio_data: diff --git a/src/phoenix/.env.example b/src/phoenix/.env.example index 1613109..d4408b8 100644 --- a/src/phoenix/.env.example +++ b/src/phoenix/.env.example @@ -1,5 +1,5 @@ # Phoenix version -PHOENIX_VERSION=12.35.0-nonroot +PHOENIX_VERSION=13.3.0 # Timezone TZ=UTC diff --git a/src/phoenix/README.md b/src/phoenix/README.md index a3b3b82..99620ee 100644 --- a/src/phoenix/README.md +++ b/src/phoenix/README.md @@ -16,7 +16,7 @@ This project supports two modes of operation via Docker Compose profiles: 1. **sqlite** (Default): Uses SQLite for storage. Simple and good for local development. Set `COMPOSE_PROFILES=sqlite` in `.env`. -2. **postgres** (or **pg**): Uses PostgreSQL for storage. Recommended for production. +2. **postgres**: Uses PostgreSQL for storage. Recommended for production. Set `COMPOSE_PROFILES=postgres` in `.env`. ## Ports @@ -32,7 +32,7 @@ This project supports two modes of operation via Docker Compose profiles: | Variable Name | Description | Default Value | | -------------------------------- | ---------------------------------------- | ----------------- | | COMPOSE_PROFILES | Active profiles (`sqlite` or `postgres`) | `sqlite` | -| PHOENIX_VERSION | Phoenix image version | `12.35.0-nonroot` | +| PHOENIX_VERSION | Phoenix image version | `13.3.0` | | PHOENIX_PORT_OVERRIDE | Host port for Phoenix UI and HTTP API | `6006` | | PHOENIX_GRPC_PORT_OVERRIDE | Host port for OTLP gRPC collector | `4317` | | PHOENIX_PROMETHEUS_PORT_OVERRIDE | Host port for Prometheus metrics | `9090` | diff --git a/src/phoenix/README.zh.md b/src/phoenix/README.zh.md index 5b364b3..8a61cc4 100644 --- a/src/phoenix/README.zh.md +++ b/src/phoenix/README.zh.md @@ -32,7 +32,7 @@ Arize Phoenix 是一个开源的 AI 可观测性平台,专为 LLM 应用设计 | 变量名 | 描述 | 默认值 | | -------------------------------- | ---------------------------------------- | ----------------- | | COMPOSE_PROFILES | 激活的配置文件(`sqlite` 或 `postgres`) | `sqlite` | -| PHOENIX_VERSION | Phoenix 镜像版本 | `12.35.0-nonroot` | +| PHOENIX_VERSION | Phoenix 镜像版本 | `13.3.0` | | PHOENIX_PORT_OVERRIDE | Phoenix UI 和 HTTP API 的主机端口 | `6006` | | PHOENIX_GRPC_PORT_OVERRIDE | OTLP gRPC 采集器的主机端口 | `4317` | | PHOENIX_PROMETHEUS_PORT_OVERRIDE | Prometheus 指标的主机端口 | `9090` | diff --git a/src/phoenix/docker-compose.yaml b/src/phoenix/docker-compose.yaml index afc59db..d19346b 100644 --- a/src/phoenix/docker-compose.yaml +++ b/src/phoenix/docker-compose.yaml @@ -11,7 +11,7 @@ x-defaults: &defaults x-phoenix-common: &phoenix-common <<: *defaults - image: ${GLOBAL_REGISTRY:-}arizephoenix/phoenix:${PHOENIX_VERSION:-12.35.0-nonroot} + image: ${GLOBAL_REGISTRY:-}arizephoenix/phoenix:${PHOENIX_VERSION:-13.3.0} ports: - '${PHOENIX_PORT_OVERRIDE:-6006}:6006' # UI and OTLP HTTP collector - '${PHOENIX_GRPC_PORT_OVERRIDE:-4317}:4317' # OTLP gRPC collector @@ -58,7 +58,8 @@ services: # PostgreSQL configuration phoenix-pg: <<: *phoenix-common - profiles: [postgres, pg] + profiles: + - postgres environment: - TZ=${TZ:-UTC} - PHOENIX_ENABLE_PROMETHEUS=${PHOENIX_ENABLE_PROMETHEUS:-false} @@ -70,7 +71,8 @@ services: phoenix-db: <<: *defaults - profiles: [postgres, pg] + profiles: + - postgres image: ${GLOBAL_REGISTRY:-}postgres:${POSTGRES_VERSION:-17.2-alpine3.21} environment: - TZ=${TZ:-UTC}