From c59a1e93f6a48cb85c190bdcc8885b4e811db7fc Mon Sep 17 00:00:00 2001 From: Sun-ZhenXing <1006925066@qq.com> Date: Wed, 6 May 2026 09:55:21 +0800 Subject: [PATCH] feat: add laminar --- README.md | 1 + README.zh.md | 1 + src/laminar/.env.example | 93 ++++++++ src/laminar/README.md | 144 +++++++++++ src/laminar/README.zh.md | 144 +++++++++++ src/laminar/clickhouse-profiles-config.xml | 18 ++ src/laminar/docker-compose.yaml | 262 +++++++++++++++++++++ 7 files changed, 663 insertions(+) create mode 100644 src/laminar/.env.example create mode 100644 src/laminar/README.md create mode 100644 src/laminar/README.zh.md create mode 100644 src/laminar/clickhouse-profiles-config.xml create mode 100644 src/laminar/docker-compose.yaml diff --git a/README.md b/README.md index 79d906b..de3b28d 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ These services require building custom Docker images from source. | [Kodbox](./src/kodbox) | 1.62 | | [Kong](./src/kong) | 3.8.0 | | [Langflow](./apps/langflow) | latest | +| [Laminar](./src/laminar) | latest | | [Langfuse](./apps/langfuse) | 3.115.0 | | [Letta](./src/letta) | 0.16.7 | | [LibreChat](./apps/librechat) | v0.8.4 | diff --git a/README.zh.md b/README.zh.md index 990bfac..4a221b1 100644 --- a/README.zh.md +++ b/README.zh.md @@ -104,6 +104,7 @@ docker compose exec redis redis-cli ping | [Kodbox](./src/kodbox) | 1.62 | | [Kong](./src/kong) | 3.8.0 | | [Langflow](./apps/langflow) | latest | +| [Laminar](./src/laminar) | latest | | [Langfuse](./apps/langfuse) | 3.115.0 | | [Letta](./src/letta) | 0.16.7 | | [LibreChat](./apps/librechat) | v0.8.4 | diff --git a/src/laminar/.env.example b/src/laminar/.env.example new file mode 100644 index 0000000..1e108e9 --- /dev/null +++ b/src/laminar/.env.example @@ -0,0 +1,93 @@ +# Laminar - Open-source observability platform for AI agents +# https://laminar.sh/ + +# ============================================================================= +# REQUIRED: Core Configuration +# ============================================================================= + +# PostgreSQL Configuration +LAMINAR_POSTGRES_VERSION=16-alpine +LAMINAR_POSTGRES_USER=postgres +LAMINAR_POSTGRES_PASSWORD=change_me_in_production +LAMINAR_POSTGRES_DB=laminar + +# ClickHouse Configuration +LAMINAR_CLICKHOUSE_VERSION=latest +LAMINAR_CLICKHOUSE_USER=clickhouse +LAMINAR_CLICKHOUSE_PASSWORD=change_me_in_production + +# Shared Secret Token (used for inter-service authentication) +LAMINAR_SHARED_SECRET_TOKEN=shared_secret_change_in_production + +# AEAD Secret Key (must be exactly 32 bytes / 64 hex characters) +LAMINAR_AEAD_SECRET_KEY=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + +# ============================================================================= +# OPTIONAL: External Service API Keys +# ============================================================================= + +# OpenAI API Key - Used for generating chat names +# LAMINAR_OPENAI_API_KEY=sk-... + +# Google Generative AI API Key - Required for Signals/AI monitoring feature +# LAMINAR_GOOGLE_GENERATIVE_AI_API_KEY=... + +# ============================================================================= +# OPTIONAL: Image Versions +# ============================================================================= + +# LAMINAR_APP_SERVER_VERSION=latest +# LAMINAR_FRONTEND_VERSION=latest +# LAMINAR_QUERY_ENGINE_VERSION=latest +# LAMINAR_QUICKWIT_VERSION=v0.8.2 + +# Custom registries (useful for private mirror/proxy) +# LAMINAR_APP_SERVER_REGISTRY=ghcr.io/lmnr-ai/ +# LAMINAR_FRONTEND_REGISTRY=ghcr.io/lmnr-ai/ +# LAMINAR_QUERY_ENGINE_REGISTRY=ghcr.io/lmnr-ai/ + +# ============================================================================= +# OPTIONAL: Port Overrides +# ============================================================================= + +# LAMINAR_FRONTEND_PORT_OVERRIDE=5667 # Web UI +# LAMINAR_APP_SERVER_PORT_OVERRIDE=8000 # HTTP API +# LAMINAR_APP_SERVER_GRPC_PORT_OVERRIDE=8001 # gRPC +# LAMINAR_APP_SERVER_RT_PORT_OVERRIDE=8002 # Real-time API +# LAMINAR_QUERY_ENGINE_PORT_OVERRIDE=8903 # Query Engine +# LAMINAR_QUICKWIT_PORT_OVERRIDE=7280 # Quickwit UI/API + +# ============================================================================= +# OPTIONAL: NextAuth Configuration +# ============================================================================= + +# LAMINAR_NEXTAUTH_URL=http://localhost:5667 +# LAMINAR_NEXTAUTH_SECRET=nextauth_secret_change_in_production +# LAMINAR_NEXT_PUBLIC_URL=http://localhost:5667 + +# ============================================================================= +# OPTIONAL: Resource Limits +# ============================================================================= + +# LAMINAR_FRONTEND_CPU_LIMIT=1.0 +# LAMINAR_FRONTEND_MEMORY_LIMIT=1G +# LAMINAR_APP_SERVER_CPU_LIMIT=2.0 +# LAMINAR_APP_SERVER_MEMORY_LIMIT=2G +# LAMINAR_POSTGRES_CPU_LIMIT=1.0 +# LAMINAR_POSTGRES_MEMORY_LIMIT=1G +# LAMINAR_CLICKHOUSE_CPU_LIMIT=2.0 +# LAMINAR_CLICKHOUSE_MEMORY_LIMIT=2G +# LAMINAR_QUICKWIT_CPU_LIMIT=1.0 +# LAMINAR_QUICKWIT_MEMORY_LIMIT=1G +# LAMINAR_QUERY_ENGINE_CPU_LIMIT=1.0 +# LAMINAR_QUERY_ENGINE_MEMORY_LIMIT=512M + +# ============================================================================= +# Global Settings +# ============================================================================= + +# Timezone +TZ=UTC + +# Global Docker Registry Prefix (optional) +# GLOBAL_REGISTRY=docker.io/ diff --git a/src/laminar/README.md b/src/laminar/README.md new file mode 100644 index 0000000..cc8316d --- /dev/null +++ b/src/laminar/README.md @@ -0,0 +1,144 @@ +# Laminar + +[English](./README.md) | [中文](./README.zh.md) + +Laminar is an open-source observability platform purpose-built for AI agents. It provides tracing, evaluations, AI monitoring, SQL access to data, dashboards, and data annotation capabilities. + +## Features + +- **Tracing**: OpenTelemetry-native powerful tracing SDK - 1 line of code to automatically trace Vercel AI SDK, Browser Use, Stagehand, LangChain, OpenAI, Anthropic, Gemini, and more. +- **Evals**: Unopinionated, extensible SDK and CLI for running evals locally or in CI/CD pipeline. +- **AI Monitoring**: Define events with natural language descriptions to track issues and custom behavior. +- **SQL Access**: Query traces, metrics, and events with a built-in SQL editor. +- **Dashboards**: Powerful dashboard builder for traces, metrics, and events. +- **Data Annotation**: Custom data rendering UI for fast data annotation and dataset creation. +- **High Performance**: Written in Rust with custom realtime engine and ultra-fast full-text search. + +## Services + +| Service | Description | Port | +| -------------- | ----------------------------------------------- | --------- | +| `frontend` | Laminar web UI and Next.js application | 5667 | +| `app-server` | Rust backend server (HTTP API, gRPC, Real-time) | 8000-8002 | +| `postgres` | PostgreSQL database for persistent storage | - | +| `clickhouse` | ClickHouse for high-performance analytics | - | +| `quickwit` | Quickwit for full-text search | 7280 | +| `query-engine` | Query engine for data processing | 8903 | + +## Ports + +| Port | Protocol | Description | +| ---- | -------- | ------------------------ | +| 5667 | HTTP | Laminar Web UI | +| 8000 | HTTP | App Server HTTP API | +| 8001 | gRPC | App Server gRPC | +| 8002 | HTTP | App Server Real-time API | +| 7280 | HTTP | Quickwit REST API and UI | +| 8903 | HTTP | Query Engine API | + +## Environment Variables + +| Variable | Description | Default | +| --------------------------------------- | ------------------------------------ | ------------------------------------ | +| `LAMINAR_POSTGRES_VERSION` | PostgreSQL image version | `16-alpine` | +| `LAMINAR_POSTGRES_USER` | PostgreSQL username | `postgres` | +| `LAMINAR_POSTGRES_PASSWORD` | PostgreSQL password | `change_me_in_production` | +| `LAMINAR_CLICKHOUSE_VERSION` | ClickHouse image version | `latest` | +| `LAMINAR_CLICKHOUSE_USER` | ClickHouse username | `clickhouse` | +| `LAMINAR_CLICKHOUSE_PASSWORD` | ClickHouse password | `change_me_in_production` | +| `LAMINAR_SHARED_SECRET_TOKEN` | Shared secret for inter-service auth | `shared_secret_change_in_production` | +| `LAMINAR_AEAD_SECRET_KEY` | AEAD encryption key (64 hex chars) | - | +| `LAMINAR_OPENAI_API_KEY` | OpenAI API key (optional) | - | +| `LAMINAR_GOOGLE_GENERATIVE_AI_API_KEY` | Google AI key for Signals feature | - | +| `LAMINAR_FRONTEND_PORT_OVERRIDE` | Host port for Web UI | `5667` | +| `LAMINAR_APP_SERVER_PORT_OVERRIDE` | Host port for HTTP API | `8000` | +| `LAMINAR_APP_SERVER_GRPC_PORT_OVERRIDE` | Host port for gRPC | `8001` | +| `LAMINAR_APP_SERVER_RT_PORT_OVERRIDE` | Host port for Real-time API | `8002` | + +## Volumes + +- `laminar_postgres_data`: PostgreSQL data +- `laminar_clickhouse_data`: ClickHouse data +- `laminar_clickhouse_logs`: ClickHouse logs +- `laminar_quickwit_data`: Quickwit data + +## Quick Start + +1. Copy the example environment file: + + ```bash + cp .env.example .env + ``` + +2. Edit `.env` and set required secrets: + + ```dotenv + LAMINAR_POSTGRES_PASSWORD=your_secure_password + LAMINAR_CLICKHOUSE_PASSWORD=your_secure_password + LAMINAR_SHARED_SECRET_TOKEN=your_shared_secret + LAMINAR_AEAD_SECRET_KEY=your_64_character_hex_key + ``` + + To generate a secure AEAD key: + ```bash + openssl rand -hex 32 + ``` + +3. Start the services: + + ```bash + docker compose up -d + ``` + +4. Access the UI at http://localhost:5667 + +## Enabling AI Monitoring (Signals) + +To enable the Signals feature, set your Google Generative AI API key: + +```dotenv +LAMINAR_GOOGLE_GENERATIVE_AI_API_KEY=your_key_here +``` + +## SDK Configuration + +When using Laminar SDK with self-hosted instance: + +**Python:** +```python +from lmnr import Laminar +Laminar.initialize( + project_api_key="", + base_url="http://localhost:8000" +) +``` + +**TypeScript:** +```typescript +import { Laminar } from '@lmnr-ai/lmnr'; +Laminar.initialize({ + projectApiKey: process.env.LMNR_PROJECT_API_KEY, + baseUrl: "http://localhost:8000" +}); +``` + +## Documentation + +For full documentation, visit: https://laminar.sh/docs + +## Resource Requirements + +Minimum recommended resources: + +| Service | CPU | Memory | +| ------------ | ---- | ------ | +| frontend | 0.25 | 256M | +| app-server | 0.5 | 512M | +| postgres | 0.25 | 256M | +| clickhouse | 0.5 | 512M | +| quickwit | 0.25 | 256M | +| query-engine | 0.25 | 128M | + +Total minimum: ~2 CPU cores, ~2GB RAM + +For production use, increase ClickHouse and PostgreSQL resources based on data volume. diff --git a/src/laminar/README.zh.md b/src/laminar/README.zh.md new file mode 100644 index 0000000..9cf774d --- /dev/null +++ b/src/laminar/README.zh.md @@ -0,0 +1,144 @@ +# Laminar + +[English](./README.md) | [中文](./README.zh.md) + +Laminar 是一个专为 AI Agent 打造的开源可观测性平台。它提供追踪、评估、AI 监控、SQL 数据访问、仪表板和数据标注功能。 + +## 功能特性 + +- **追踪(Tracing)**:基于 OpenTelemetry 的强大追踪 SDK —— 只需一行代码即可自动追踪 Vercel AI SDK、Browser Use、Stagehand、LangChain、OpenAI、Anthropic、Gemini 等。 +- **评估(Evals)**:无倾向性的可扩展 SDK 和 CLI,用于在本地或 CI/CD 流水线中运行评估。 +- **AI 监控**:使用自然语言描述定义事件,追踪问题和自定义行为。 +- **SQL 访问**:使用内置 SQL 编辑器查询追踪、指标和事件。 +- **仪表板**:用于追踪、指标和事件的强大仪表板构建器。 +- **数据标注**:自定义数据渲染 UI,用于快速数据标注和数据集创建。 +- **高性能**:使用 Rust 编写,具有自定义实时引擎和超快的全文搜索。 + +## 服务 + +| 服务 | 描述 | 端口 | +| -------------- | --------------------------------------- | --------- | +| `frontend` | Laminar Web UI 和 Next.js 应用 | 5667 | +| `app-server` | Rust 后端服务器(HTTP API、gRPC、实时) | 8000-8002 | +| `postgres` | 用于持久化存储的 PostgreSQL 数据库 | - | +| `clickhouse` | 用于高性能分析的 ClickHouse | - | +| `quickwit` | 用于全文搜索的 Quickwit | 7280 | +| `query-engine` | 用于数据处理的查询引擎 | 8903 | + +## 端口 + +| 端口 | 协议 | 描述 | +| ---- | ---- | ----------------------- | +| 5667 | HTTP | Laminar Web UI | +| 8000 | HTTP | 应用服务器 HTTP API | +| 8001 | gRPC | 应用服务器 gRPC | +| 8002 | HTTP | 应用服务器实时 API | +| 7280 | HTTP | Quickwit REST API 和 UI | +| 8903 | HTTP | 查询引擎 API | + +## 环境变量 + +| 变量 | 描述 | 默认值 | +| --------------------------------------- | ----------------------------------- | ------------------------------------ | +| `LAMINAR_POSTGRES_VERSION` | PostgreSQL 镜像版本 | `16-alpine` | +| `LAMINAR_POSTGRES_USER` | PostgreSQL 用户名 | `postgres` | +| `LAMINAR_POSTGRES_PASSWORD` | PostgreSQL 密码 | `change_me_in_production` | +| `LAMINAR_CLICKHOUSE_VERSION` | ClickHouse 镜像版本 | `latest` | +| `LAMINAR_CLICKHOUSE_USER` | ClickHouse 用户名 | `clickhouse` | +| `LAMINAR_CLICKHOUSE_PASSWORD` | ClickHouse 密码 | `change_me_in_production` | +| `LAMINAR_SHARED_SECRET_TOKEN` | 服务间认证共享密钥 | `shared_secret_change_in_production` | +| `LAMINAR_AEAD_SECRET_KEY` | AEAD 加密密钥(64 位十六进制字符) | - | +| `LAMINAR_OPENAI_API_KEY` | OpenAI API 密钥(可选) | - | +| `LAMINAR_GOOGLE_GENERATIVE_AI_API_KEY` | Google AI 密钥(用于 Signals 功能) | - | +| `LAMINAR_FRONTEND_PORT_OVERRIDE` | Web UI 主机端口 | `5667` | +| `LAMINAR_APP_SERVER_PORT_OVERRIDE` | HTTP API 主机端口 | `8000` | +| `LAMINAR_APP_SERVER_GRPC_PORT_OVERRIDE` | gRPC 主机端口 | `8001` | +| `LAMINAR_APP_SERVER_RT_PORT_OVERRIDE` | 实时 API 主机端口 | `8002` | + +## 数据卷 + +- `laminar_postgres_data`:PostgreSQL 数据 +- `laminar_clickhouse_data`:ClickHouse 数据 +- `laminar_clickhouse_logs`:ClickHouse 日志 +- `laminar_quickwit_data`:Quickwit 数据 + +## 快速开始 + +1. 复制示例环境文件: + + ```bash + cp .env.example .env + ``` + +2. 编辑 `.env` 并设置必需的密钥: + + ```dotenv + LAMINAR_POSTGRES_PASSWORD=your_secure_password + LAMINAR_CLICKHOUSE_PASSWORD=your_secure_password + LAMINAR_SHARED_SECRET_TOKEN=your_shared_secret + LAMINAR_AEAD_SECRET_KEY=your_64_character_hex_key + ``` + + 生成安全 AEAD 密钥: + ```bash + openssl rand -hex 32 + ``` + +3. 启动服务: + + ```bash + docker compose up -d + ``` + +4. 在浏览器中访问 http://localhost:5667 + +## 启用 AI 监控(Signals) + +要启用 Signals 功能,请设置 Google Generative AI API 密钥: + +```dotenv +LAMINAR_GOOGLE_GENERATIVE_AI_API_KEY=your_key_here +``` + +## SDK 配置 + +在使用自托管实例时使用 Laminar SDK: + +**Python:** +```python +from lmnr import Laminar +Laminar.initialize( + project_api_key="", + base_url="http://localhost:8000" +) +``` + +**TypeScript:** +```typescript +import { Laminar } from '@lmnr-ai/lmnr'; +Laminar.initialize({ + projectApiKey: process.env.LMNR_PROJECT_API_KEY, + baseUrl: "http://localhost:8000" +}); +``` + +## 文档 + +完整文档请访问:https://laminar.sh/docs + +## 资源需求 + +最低推荐资源配置: + +| 服务 | CPU | 内存 | +| ------------ | ---- | ---- | +| frontend | 0.25 | 256M | +| app-server | 0.5 | 512M | +| postgres | 0.25 | 256M | +| clickhouse | 0.5 | 512M | +| quickwit | 0.25 | 256M | +| query-engine | 0.25 | 128M | + +最低总计:约 2 核 CPU,~2GB 内存 + +生产环境使用时,请根据数据量增加 ClickHouse 和 PostgreSQL 的资源。 diff --git a/src/laminar/clickhouse-profiles-config.xml b/src/laminar/clickhouse-profiles-config.xml new file mode 100644 index 0000000..79bf69c --- /dev/null +++ b/src/laminar/clickhouse-profiles-config.xml @@ -0,0 +1,18 @@ + + + + 1 + 1000 + 1048576 + 0 + + + 1 + + + + + default + + + diff --git a/src/laminar/docker-compose.yaml b/src/laminar/docker-compose.yaml new file mode 100644 index 0000000..b8b1844 --- /dev/null +++ b/src/laminar/docker-compose.yaml @@ -0,0 +1,262 @@ +# Laminar - Open-source observability platform for AI agents +# https://laminar.sh/ +# https://github.com/lmnr-ai/lmnr + +x-defaults: &defaults + restart: unless-stopped + logging: + driver: json-file + options: + max-size: 100m + max-file: '3' + +services: + postgres: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}postgres:${LAMINAR_POSTGRES_VERSION:-16-alpine} + environment: + - TZ=${TZ:-UTC} + - POSTGRES_USER=${LAMINAR_POSTGRES_USER:-postgres} + - POSTGRES_PASSWORD=${LAMINAR_POSTGRES_PASSWORD:-postgres_password} + - POSTGRES_DB=${LAMINAR_POSTGRES_DB:-laminar} + volumes: + - laminar_postgres_data:/var/lib/postgresql/data + healthcheck: + test: + - CMD + - pg_isready + - -U + - ${LAMINAR_POSTGRES_USER:-postgres} + - -d + - ${LAMINAR_POSTGRES_DB:-laminar} + interval: 5s + timeout: 5s + retries: 5 + start_period: 10s + deploy: + resources: + limits: + cpus: ${LAMINAR_POSTGRES_CPU_LIMIT:-1.0} + memory: ${LAMINAR_POSTGRES_MEMORY_LIMIT:-1G} + reservations: + cpus: ${LAMINAR_POSTGRES_CPU_RESERVATION:-0.25} + memory: ${LAMINAR_POSTGRES_MEMORY_RESERVATION:-256M} + + clickhouse: + <<: *defaults + # Version 26.3 will break queries on the spans_v0 view, if they are + # not filtered by trace_id and/or ordered by start_time. This is a + # known bug, tracking https://github.com/ClickHouse/ClickHouse/pull/101218. + # We will pin to the earliest stable version once this is fixed + image: ${GLOBAL_REGISTRY:-}clickhouse/clickhouse-server:${LAMINAR_CLICKHOUSE_VERSION:-latest} + environment: + - TZ=${TZ:-UTC} + - CLICKHOUSE_USER=${LAMINAR_CLICKHOUSE_USER:-clickhouse} + - CLICKHOUSE_PASSWORD=${LAMINAR_CLICKHOUSE_PASSWORD:-clickhouse_password} + volumes: + - laminar_clickhouse_data:/var/lib/clickhouse + - laminar_clickhouse_logs:/var/log/clickhouse-server + - ./clickhouse-profiles-config.xml:/etc/clickhouse-server/users.d/lmnar.xml:ro + ulimits: + nofile: + soft: 262144 + hard: 262144 + healthcheck: + test: + - CMD + - wget + - --no-verbose + - --tries=1 + - --spider + - http://localhost:8123/ping + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + deploy: + resources: + limits: + cpus: ${LAMINAR_CLICKHOUSE_CPU_LIMIT:-2.0} + memory: ${LAMINAR_CLICKHOUSE_MEMORY_LIMIT:-2G} + reservations: + cpus: ${LAMINAR_CLICKHOUSE_CPU_RESERVATION:-0.5} + memory: ${LAMINAR_CLICKHOUSE_MEMORY_RESERVATION:-512M} + + quickwit: + <<: *defaults + image: ${GLOBAL_REGISTRY:-}quickwit/quickwit:${LAMINAR_QUICKWIT_VERSION:-v0.8.2} + command: + - run + environment: + - TZ=${TZ:-UTC} + - QW_DATA_DIR=/quickwit/qwdata + volumes: + - laminar_quickwit_data:/quickwit/qwdata + ports: + - '${LAMINAR_QUICKWIT_PORT_OVERRIDE:-7280}:7280' + healthcheck: + test: + - CMD + - curl + - -f + - http://localhost:7280/health/livez + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + deploy: + resources: + limits: + cpus: ${LAMINAR_QUICKWIT_CPU_LIMIT:-1.0} + memory: ${LAMINAR_QUICKWIT_MEMORY_LIMIT:-1G} + reservations: + cpus: ${LAMINAR_QUICKWIT_CPU_RESERVATION:-0.25} + memory: ${LAMINAR_QUICKWIT_MEMORY_RESERVATION:-256M} + + query-engine: + <<: *defaults + image: ${LAMINAR_QUERY_ENGINE_REGISTRY:-ghcr.io/lmnr-ai/}query-engine:${LAMINAR_QUERY_ENGINE_VERSION:-latest} + environment: + - TZ=${TZ:-UTC} + - PORT=8903 + ports: + - '${LAMINAR_QUERY_ENGINE_PORT_OVERRIDE:-8903}:8903' + healthcheck: + test: + - CMD + - wget + - --no-verbose + - --tries=1 + - --spider + - http://localhost:8903/health + interval: 10s + timeout: 5s + retries: 3 + start_period: 10s + deploy: + resources: + limits: + cpus: ${LAMINAR_QUERY_ENGINE_CPU_LIMIT:-1.0} + memory: ${LAMINAR_QUERY_ENGINE_MEMORY_LIMIT:-512M} + reservations: + cpus: ${LAMINAR_QUERY_ENGINE_CPU_RESERVATION:-0.25} + memory: ${LAMINAR_QUERY_ENGINE_MEMORY_RESERVATION:-128M} + + app-server: + <<: *defaults + image: ${LAMINAR_APP_SERVER_REGISTRY:-ghcr.io/lmnr-ai/}app-server:${LAMINAR_APP_SERVER_VERSION:-latest} + environment: + - TZ=${TZ:-UTC} + - PORT=8000 + - GRPC_PORT=8001 + - RT_PORT=8002 + - DATABASE_URL=postgres://${LAMINAR_POSTGRES_USER:-postgres}:${LAMINAR_POSTGRES_PASSWORD:-postgres_password}@postgres:5432/${LAMINAR_POSTGRES_DB:-laminar} + - SHARED_SECRET_TOKEN=${LAMINAR_SHARED_SECRET_TOKEN:-shared_secret} + - CLICKHOUSE_URL=http://clickhouse:8123 + - CLICKHOUSE_USER=${LAMINAR_CLICKHOUSE_USER:-clickhouse} + - CLICKHOUSE_PASSWORD=${LAMINAR_CLICKHOUSE_PASSWORD:-clickhouse_password} + - CLICKHOUSE_RO_USER=${LAMINAR_CLICKHOUSE_USER:-clickhouse} + - CLICKHOUSE_RO_PASSWORD=${LAMINAR_CLICKHOUSE_PASSWORD:-clickhouse_password} + - ENVIRONMENT=LITE + - AEAD_SECRET_KEY=${LAMINAR_AEAD_SECRET_KEY:-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} + - QUERY_ENGINE_URL=http://query-engine:8903 + - QUICKWIT_SEARCH_URL=http://quickwit:7280 + - QUICKWIT_INGEST_URL=http://quickwit:7281 + - QUICKWIT_SPANS_INDEX_ID=spans_v2 + - GOOGLE_GENERATIVE_AI_API_KEY=${LAMINAR_GOOGLE_GENERATIVE_AI_API_KEY:-} + ports: + - '${LAMINAR_APP_SERVER_PORT_OVERRIDE:-8000}:8000' + - '${LAMINAR_APP_SERVER_GRPC_PORT_OVERRIDE:-8001}:8001' + - '${LAMINAR_APP_SERVER_RT_PORT_OVERRIDE:-8002}:8002' + depends_on: + postgres: + condition: service_healthy + clickhouse: + condition: service_healthy + quickwit: + condition: service_healthy + query-engine: + condition: service_healthy + healthcheck: + test: + - CMD + - wget + - --no-verbose + - --tries=1 + - --spider + - http://localhost:8000/health + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + deploy: + resources: + limits: + cpus: ${LAMINAR_APP_SERVER_CPU_LIMIT:-2.0} + memory: ${LAMINAR_APP_SERVER_MEMORY_LIMIT:-2G} + reservations: + cpus: ${LAMINAR_APP_SERVER_CPU_RESERVATION:-0.5} + memory: ${LAMINAR_APP_SERVER_MEMORY_RESERVATION:-512M} + + frontend: + <<: *defaults + image: ${LAMINAR_FRONTEND_REGISTRY:-ghcr.io/lmnr-ai/}frontend:${LAMINAR_FRONTEND_VERSION:-latest} + environment: + - TZ=${TZ:-UTC} + - PORT=5667 + - DATABASE_URL=postgres://${LAMINAR_POSTGRES_USER:-postgres}:${LAMINAR_POSTGRES_PASSWORD:-postgres_password}@postgres:5432/${LAMINAR_POSTGRES_DB:-laminar} + - BACKEND_URL=http://app-server:8000 + - BACKEND_RT_URL=http://app-server:8002 + - SHARED_SECRET_TOKEN=${LAMINAR_SHARED_SECRET_TOKEN:-shared_secret} + - NEXTAUTH_URL=${LAMINAR_NEXTAUTH_URL:-http://localhost:5667} + - NEXTAUTH_SECRET=${LAMINAR_NEXTAUTH_SECRET:-nextauth_secret_change_in_production} + - NEXT_PUBLIC_URL=${LAMINAR_NEXT_PUBLIC_URL:-http://localhost:5667} + - ENVIRONMENT=LITE + - CLICKHOUSE_URL=http://clickhouse:8123 + - CLICKHOUSE_USER=${LAMINAR_CLICKHOUSE_USER:-clickhouse} + - CLICKHOUSE_PASSWORD=${LAMINAR_CLICKHOUSE_PASSWORD:-clickhouse_password} + - CLICKHOUSE_RO_USER=${LAMINAR_CLICKHOUSE_USER:-clickhouse} + - CLICKHOUSE_RO_PASSWORD=${LAMINAR_CLICKHOUSE_PASSWORD:-clickhouse_password} + - QUICKWIT_SEARCH_URL=http://quickwit:7280 + - OPENAI_API_KEY=${LAMINAR_OPENAI_API_KEY:-} + - AEAD_SECRET_KEY=${LAMINAR_AEAD_SECRET_KEY:-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} + - GOOGLE_GENERATIVE_AI_API_KEY=${LAMINAR_GOOGLE_GENERATIVE_AI_API_KEY:-} + ports: + - '${LAMINAR_FRONTEND_PORT_OVERRIDE:-5667}:5667' + depends_on: + postgres: + condition: service_healthy + clickhouse: + condition: service_healthy + quickwit: + condition: service_healthy + query-engine: + condition: service_healthy + app-server: + condition: service_healthy + healthcheck: + test: + - CMD + - wget + - --no-verbose + - --tries=1 + - --spider + - http://localhost:5667/api/health + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + deploy: + resources: + limits: + cpus: ${LAMINAR_FRONTEND_CPU_LIMIT:-1.0} + memory: ${LAMINAR_FRONTEND_MEMORY_LIMIT:-1G} + reservations: + cpus: ${LAMINAR_FRONTEND_CPU_RESERVATION:-0.25} + memory: ${LAMINAR_FRONTEND_MEMORY_RESERVATION:-256M} + +volumes: + laminar_postgres_data: + laminar_clickhouse_data: + laminar_clickhouse_logs: + laminar_quickwit_data: