volumes: langfuse-postgres-data: driver: local langfuse-clickhouse-data: driver: local langfuse-clickhouse-logs: driver: local langfuse-minio-data: driver: local networks: langfuse-network: driver: bridge external: true name: langfuse-network pentagi-network: driver: bridge external: true name: pentagi-network services: langfuse-worker: image: langfuse/langfuse-worker:3 restart: unless-stopped container_name: langfuse-worker hostname: langfuse-worker depends_on: &langfuse-depends-on postgres: condition: service_healthy minio: condition: service_healthy redis: condition: service_healthy clickhouse: condition: service_healthy expose: - 3030/tcp environment: &langfuse-worker-env NEXTAUTH_URL: ${LANGFUSE_NEXTAUTH_URL:-http://localhost:${LANGFUSE_LISTEN_PORT:-4000}} DATABASE_URL: postgresql://${LANGFUSE_POSTGRES_USER:-postgres}:${LANGFUSE_POSTGRES_PASSWORD:-postgres}@langfuse-postgres:5432/${LANGFUSE_POSTGRES_DB:-langfuse} SALT: ${LANGFUSE_SALT:-myglobalsalt} # change this to a random string ENCRYPTION_KEY: ${LANGFUSE_ENCRYPTION_KEY:-0000000000000000000000000000000000000000000000000000000000000000} # generate via `openssl rand -hex 32` TELEMETRY_ENABLED: ${LANGFUSE_TELEMETRY_ENABLED:-false} LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: ${LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES:-true} OTEL_EXPORTER_OTLP_ENDPOINT: ${LANGFUSE_OTEL_EXPORTER_OTLP_ENDPOINT:-} OTEL_SERVICE_NAME: ${LANGFUSE_OTEL_SERVICE_NAME:-langfuse} CLICKHOUSE_MIGRATION_URL: ${LANGFUSE_CLICKHOUSE_MIGRATION_URL:-clickhouse://langfuse-clickhouse:9000} CLICKHOUSE_URL: ${LANGFUSE_CLICKHOUSE_URL:-http://langfuse-clickhouse:8123} CLICKHOUSE_USER: ${LANGFUSE_CLICKHOUSE_USER:-clickhouse} CLICKHOUSE_PASSWORD: ${LANGFUSE_CLICKHOUSE_PASSWORD:-clickhouse} CLICKHOUSE_CLUSTER_ENABLED: ${LANGFUSE_CLICKHOUSE_CLUSTER_ENABLED:-false} LANGFUSE_USE_AZURE_BLOB: ${LANGFUSE_USE_AZURE_BLOB:-false} LANGFUSE_S3_EVENT_UPLOAD_BUCKET: ${LANGFUSE_S3_BUCKET:-langfuse} LANGFUSE_S3_EVENT_UPLOAD_REGION: ${LANGFUSE_S3_REGION:-auto} LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_ACCESS_KEY_ID:-minio} LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_SECRET_ACCESS_KEY:-miniosecret} LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT: ${LANGFUSE_S3_ENDPOINT:-http://langfuse-minio:9000} LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE: ${LANGFUSE_S3_FORCE_PATH_STYLE:-true} LANGFUSE_S3_EVENT_UPLOAD_PREFIX: ${LANGFUSE_S3_EVENT_UPLOAD_PREFIX:-events/} LANGFUSE_S3_MEDIA_UPLOAD_BUCKET: ${LANGFUSE_S3_BUCKET:-langfuse} LANGFUSE_S3_MEDIA_UPLOAD_REGION: ${LANGFUSE_S3_REGION:-auto} LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_ACCESS_KEY_ID:-minio} LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_SECRET_ACCESS_KEY:-miniosecret} LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT: ${LANGFUSE_S3_ENDPOINT:-http://langfuse-minio:9000} LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE: ${LANGFUSE_S3_FORCE_PATH_STYLE:-true} LANGFUSE_S3_MEDIA_UPLOAD_PREFIX: ${LANGFUSE_S3_MEDIA_UPLOAD_PREFIX:-media/} LANGFUSE_S3_BATCH_EXPORT_ENABLED: ${LANGFUSE_S3_BATCH_EXPORT_ENABLED:-true} LANGFUSE_S3_BATCH_EXPORT_BUCKET: ${LANGFUSE_S3_BUCKET:-langfuse} LANGFUSE_S3_BATCH_EXPORT_REGION: ${LANGFUSE_S3_REGION:-auto} LANGFUSE_S3_BATCH_EXPORT_ENDPOINT: ${LANGFUSE_S3_ENDPOINT:-http://langfuse-minio:9000} LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT: ${LANGFUSE_S3_ENDPOINT:-http://langfuse-minio:9000} LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID: ${LANGFUSE_S3_ACCESS_KEY_ID:-minio} LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY: ${LANGFUSE_S3_SECRET_ACCESS_KEY:-miniosecret} REDIS_HOST: ${LANGFUSE_REDIS_HOST:-langfuse-redis} REDIS_PORT: ${LANGFUSE_REDIS_PORT:-6379} REDIS_AUTH: ${LANGFUSE_REDIS_AUTH:-myredissecret} REDIS_TLS_ENABLED: ${LANGFUSE_REDIS_TLS_ENABLED:-false} REDIS_TLS_CA: ${LANGFUSE_REDIS_TLS_CA:-/certs/ca.crt} REDIS_TLS_CERT: ${LANGFUSE_REDIS_TLS_CERT:-/certs/redis.crt} REDIS_TLS_KEY: ${LANGFUSE_REDIS_TLS_KEY:-/certs/redis.key} LANGFUSE_INGESTION_QUEUE_DELAY_MS: ${LANGFUSE_INGESTION_QUEUE_DELAY_MS:-} LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS: ${LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS:-} LANGFUSE_INGESTION_CLICKHOUSE_WRITE_BATCH_SIZE: ${LANGFUSE_INGESTION_CLICKHOUSE_WRITE_BATCH_SIZE:-} LANGFUSE_INGESTION_CLICKHOUSE_MAX_ATTEMPTS: ${LANGFUSE_INGESTION_CLICKHOUSE_MAX_ATTEMPTS:-} EMAIL_FROM_ADDRESS: ${LANGFUSE_EMAIL_FROM_ADDRESS:-} SMTP_CONNECTION_URL: ${LANGFUSE_SMTP_CONNECTION_URL:-} logging: options: max-size: 50m max-file: "7" networks: - langfuse-network langfuse-web: image: langfuse/langfuse:3 restart: unless-stopped container_name: langfuse-web hostname: langfuse-web depends_on: *langfuse-depends-on expose: - 3000/tcp ports: - ${LANGFUSE_LISTEN_IP:-127.0.0.1}:${LANGFUSE_LISTEN_PORT:-4000}:3000 environment: <<: *langfuse-worker-env HOST: 0.0.0.0 PORT: 3000 NEXTAUTH_URL: ${LANGFUSE_NEXTAUTH_URL:-http://localhost:4000} NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-mysecret} LANGFUSE_LOG_LEVEL: ${LANGFUSE_LOG_LEVEL:-info} LANGFUSE_INIT_ORG_ID: ${LANGFUSE_INIT_ORG_ID:-ocm47619l0000872mcd2dlbqwb} LANGFUSE_INIT_ORG_NAME: ${LANGFUSE_INIT_ORG_NAME:-PentAGI Demo} LANGFUSE_INIT_PROJECT_ID: ${LANGFUSE_INIT_PROJECT_ID:-cm47619l0000872mcd2dlbqwb} LANGFUSE_INIT_PROJECT_NAME: ${LANGFUSE_INIT_PROJECT_NAME:-PentAGI} LANGFUSE_INIT_PROJECT_PUBLIC_KEY: ${LANGFUSE_INIT_PROJECT_PUBLIC_KEY:-pk-lf-5946031c-ae6c-4451-98d2-9882a59e1707} # change this to a random string LANGFUSE_INIT_PROJECT_SECRET_KEY: ${LANGFUSE_INIT_PROJECT_SECRET_KEY:-sk-lf-d9035680-89dd-4950-8688-7870720bf359} # change this to a random string LANGFUSE_INIT_USER_EMAIL: ${LANGFUSE_INIT_USER_EMAIL:-admin@pentagi.com} LANGFUSE_INIT_USER_NAME: ${LANGFUSE_INIT_USER_NAME:-admin} LANGFUSE_INIT_USER_PASSWORD: ${LANGFUSE_INIT_USER_PASSWORD:-P3nTagIsD0d} # change this to a random password LANGFUSE_SDK_CI_SYNC_PROCESSING_ENABLED: ${LANGFUSE_SDK_CI_SYNC_PROCESSING_ENABLED:-false} LANGFUSE_READ_FROM_POSTGRES_ONLY: ${LANGFUSE_READ_FROM_POSTGRES_ONLY:-false} LANGFUSE_READ_FROM_CLICKHOUSE_ONLY: ${LANGFUSE_READ_FROM_CLICKHOUSE_ONLY:-true} LANGFUSE_RETURN_FROM_CLICKHOUSE: ${LANGFUSE_RETURN_FROM_CLICKHOUSE:-true} # langfuse enterprise license key LANGFUSE_EE_LICENSE_KEY: ${LANGFUSE_EE_LICENSE_KEY:-} # custom oauth2 AUTH_CUSTOM_CLIENT_ID: ${LANGFUSE_AUTH_CUSTOM_CLIENT_ID:-} AUTH_CUSTOM_CLIENT_SECRET: ${LANGFUSE_AUTH_CUSTOM_CLIENT_SECRET:-} AUTH_CUSTOM_ISSUER: ${LANGFUSE_AUTH_CUSTOM_ISSUER:-} AUTH_CUSTOM_NAME: ${LANGFUSE_AUTH_CUSTOM_NAME:-} AUTH_CUSTOM_SCOPE: ${LANGFUSE_AUTH_CUSTOM_SCOPE:-openid email profile} AUTH_CUSTOM_ALLOW_ACCOUNT_LINKING: ${LANGFUSE_AUTH_CUSTOM_ALLOW_ACCOUNT_LINKING:-true} AUTH_CUSTOM_CLIENT_AUTH_METHOD: ${LANGFUSE_AUTH_CUSTOM_CLIENT_AUTH_METHOD:-} AUTH_DISABLE_SIGNUP: ${LANGFUSE_AUTH_DISABLE_SIGNUP:-} LANGFUSE_ALLOWED_ORGANIZATION_CREATORS: ${LANGFUSE_ALLOWED_ORGANIZATION_CREATORS:-} AUTH_SESSION_MAX_AGE: ${LANGFUSE_AUTH_SESSION_MAX_AGE:-240} LANGFUSE_DEFAULT_ORG_ID: ${LANGFUSE_DEFAULT_ORG_ID:-ocm47619l0000872mcd2dlbqwb} LANGFUSE_DEFAULT_PROJECT_ID: ${LANGFUSE_DEFAULT_PROJECT_ID:-cm47619l0000872mcd2dlbqwb} LANGFUSE_DEFAULT_ORG_ROLE: ${LANGFUSE_DEFAULT_ORG_ROLE:-VIEWER} LANGFUSE_DEFAULT_PROJECT_ROLE: ${LANGFUSE_DEFAULT_PROJECT_ROLE:-VIEWER} logging: options: max-size: 50m max-file: "7" networks: - langfuse-network - pentagi-network clickhouse: image: clickhouse/clickhouse-server:24 restart: unless-stopped user: "101:101" container_name: langfuse-clickhouse hostname: langfuse-clickhouse environment: CLICKHOUSE_DB: ${LANGFUSE_CLICKHOUSE_DB:-default} CLICKHOUSE_USER: ${LANGFUSE_CLICKHOUSE_USER:-clickhouse} CLICKHOUSE_PASSWORD: ${LANGFUSE_CLICKHOUSE_PASSWORD:-clickhouse} volumes: - langfuse-clickhouse-data:/var/lib/clickhouse - langfuse-clickhouse-logs:/var/log/clickhouse-server healthcheck: test: wget --no-verbose --tries=1 --spider http://localhost:8123/ping || exit 1 interval: 5s timeout: 5s retries: 10 start_period: 1s logging: options: max-size: 50m max-file: "7" networks: - langfuse-network minio: image: minio/minio:RELEASE.2025-07-23T15-54-02Z restart: unless-stopped container_name: langfuse-minio hostname: langfuse-minio command: server /data --console-address ":9001" --address ":9000" --json environment: MINIO_ROOT_USER: ${LANGFUSE_S3_ACCESS_KEY_ID:-minio} MINIO_ROOT_PASSWORD: ${LANGFUSE_S3_SECRET_ACCESS_KEY:-miniosecret} MINIO_BUCKET_NAME: ${LANGFUSE_S3_BUCKET:-langfuse} MINIO_UPDATE: off entrypoint: | /bin/sh -c ' isAlive() { mc ready local >/dev/null 2>&1; } # check if Minio is alive minio $0 "$@" --quiet & echo $! > /tmp/minio.pid # start Minio in the background until isAlive; do sleep 1; done # wait until Minio is alive echo "MinIO is ready. Proceeding with setup..." mc alias set myminio http://localhost:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD mc mb myminio/$$MINIO_BUCKET_NAME/ --ignore-existing # create test bucket mc anonymous set public myminio/$$MINIO_BUCKET_NAME # make the test bucket public mc admin update myminio/$$MINIO_BUCKET_NAME # update test bucket echo "MinIO is configured. Trying to restart Minio..." kill -s INT $$(cat /tmp/minio.pid) # try to stop Minio while [ -e "/proc/$$(cat /tmp/minio.pid)" ]; do sleep 0.5; done # wait until Minio is stopped rm /tmp/minio.pid # remove the pid file echo "MinIO is configured and running..." exec minio $0 "$@" # start Minio in the foreground ' volumes: - langfuse-minio-data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 3s timeout: 5s retries: 5 start_period: 1s logging: options: max-size: 50m max-file: "7" networks: - langfuse-network redis: image: redis:7 restart: unless-stopped container_name: langfuse-redis hostname: langfuse-redis command: > --requirepass ${LANGFUSE_REDIS_AUTH:-myredissecret} healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 3s timeout: 10s retries: 10 logging: options: max-size: 50m max-file: "7" networks: - langfuse-network postgres: image: postgres:16 restart: unless-stopped container_name: langfuse-postgres hostname: langfuse-postgres environment: POSTGRES_USER: ${LANGFUSE_POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${LANGFUSE_POSTGRES_PASSWORD:-postgres} POSTGRES_DB: ${LANGFUSE_POSTGRES_DB:-langfuse} volumes: - langfuse-postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${LANGFUSE_POSTGRES_USER:-postgres}"] interval: 3s timeout: 3s retries: 10 logging: options: max-size: 50m max-file: "7" networks: - langfuse-network