Español
Empezar
← Todas las plantillas

Despliega Langfuse en Pethost con un clic

Trazas, evaluaciones y gestión de prompts para apps con LLM

Qué pasa

  1. Inicias sesión en Pethost o creas una cuenta, con una passkey, GitHub o Google.
  2. ¿Aún no tienes máquina? Eliges un plan y te preparamos una. El enlace espera en tu navegador hasta que esté lista.
  3. Nuevo proyecto se abre en la app. Rellenas lo que pide y haces clic en Crear proyecto: Correo electrónico, Contraseña de administrador.
  4. En un par de minutos la app está en marcha en su propia dirección con HTTPS. Sus secretos se generan al azar para ella, y sus datos entran en el backup de cada noche.
  5. Es un proyecto como cualquier otro: su compose.yaml, su .env, sus logs y un terminal están en el panel, y tu agente puede cambiarlo, volver a una versión anterior o restaurarlo.

Primeros pasos

Inicia sesión con el correo y la contraseña que indicaste: esa cuenta es dueña de la organización y del proyecto llamados Default, y el registro está cerrado. Crea las claves de API del proyecto en sus ajustes y apunta el SDK de Langfuse a https://langfuse.sam.pethost.app. La subida de archivos multimedia desde los SDK necesita un endpoint S3 público, que esta plantilla no abre. Langfuse funciona con seis servicios en unos 2,7 GB de memoria, así que necesita los 6 GB del plan Grow.

Qué ejecuta

La plantilla es este compose.yaml y las variables que escribe en el .env del proyecto. Pethost ejecuta el archivo tal como está escrito.

x-env: &env
  NEXTAUTH_URL: ${URL}
  DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
  SALT: ${SALT}
  ENCRYPTION_KEY: ${ENCRYPTION_KEY}
  CLICKHOUSE_MIGRATION_URL: clickhouse://clickhouse:9000
  CLICKHOUSE_URL: http://clickhouse:8123
  CLICKHOUSE_USER: clickhouse
  CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
  CLICKHOUSE_CLUSTER_ENABLED: "false"
  LANGFUSE_S3_EVENT_UPLOAD_BUCKET: langfuse
  LANGFUSE_S3_EVENT_UPLOAD_REGION: auto
  LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: minio
  LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: ${MINIO_PASSWORD}
  LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT: http://minio:9000
  LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE: "true"
  LANGFUSE_S3_EVENT_UPLOAD_PREFIX: events/
  LANGFUSE_S3_MEDIA_UPLOAD_BUCKET: langfuse
  LANGFUSE_S3_MEDIA_UPLOAD_REGION: auto
  LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID: minio
  LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY: ${MINIO_PASSWORD}
  LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT: http://minio:9000
  LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE: "true"
  LANGFUSE_S3_MEDIA_UPLOAD_PREFIX: media/
  REDIS_HOST: redis
  REDIS_PORT: "6379"
  REDIS_AUTH: ${REDIS_PASSWORD}

x-depends: &depends
  postgres:
    condition: service_healthy
  minio:
    condition: service_healthy
  redis:
    condition: service_healthy
  clickhouse:
    condition: service_healthy

services:
  langfuse-web:
    image: langfuse/langfuse:4.59.0
    restart: unless-stopped
    depends_on: *depends
    environment:
      <<: *env
      NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
      # Node sizes its heap by the machine's memory; a bound keeps the six services within 4 GB.
      # The web server needs about 500 MB of heap just to start.
      NODE_OPTIONS: --max-old-space-size=1024
      AUTH_DISABLE_SIGNUP: "true"
      # The first start makes this organization, its project and its owner: nobody has to sign up.
      LANGFUSE_INIT_ORG_ID: default
      LANGFUSE_INIT_ORG_NAME: Default
      LANGFUSE_INIT_PROJECT_ID: default
      LANGFUSE_INIT_PROJECT_NAME: Default
      LANGFUSE_INIT_USER_EMAIL: ${ADMIN_EMAIL}
      LANGFUSE_INIT_USER_NAME: Admin
      LANGFUSE_INIT_USER_PASSWORD: ${ADMIN_PASSWORD}

  langfuse-worker:
    image: langfuse/langfuse-worker:4.59.0
    restart: unless-stopped
    depends_on: *depends
    environment:
      <<: *env
      NODE_OPTIONS: --max-old-space-size=512

  clickhouse:
    image: clickhouse/clickhouse-server:25.12
    restart: unless-stopped
    environment:
      CLICKHOUSE_DB: default
      CLICKHOUSE_USER: clickhouse
      CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
    # The stock config logs at trace level into ten files of 1000 MB and keeps its query, metric and
    # trace tables for ever: on a small machine they would fill the disk over months. This keeps the
    # server's log under 300 MB and those tables a week.
    entrypoint:
      - sh
      - -c
      - |
        cat > /etc/clickhouse-server/config.d/small-machine.xml <<'XML'
        <clickhouse>
          <logger><level>information</level><size>100M</size><count>3</count></logger>
          <query_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></query_log>
          <metric_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></metric_log>
          <asynchronous_metric_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></asynchronous_metric_log>
          <trace_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></trace_log>
          <text_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></text_log>
          <part_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></part_log>
          <error_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></error_log>
        </clickhouse>
        XML
        exec /entrypoint.sh
    volumes:
      - clickhouse:/var/lib/clickhouse
    healthcheck:
      test: wget --no-verbose --tries=1 --spider http://localhost:8123/ping || exit 1
      interval: 5s
      timeout: 5s
      retries: 10
      start_period: 10s

  # Langfuse's own compose file runs this image, as MinIO publishes no images of its own any more;
  # the digest pins one build of it.
  minio:
    image: cgr.dev/chainguard/minio@sha256:2136d593beacf4461187035eca949fe49abd589d5079735025c711ca58fee0c8
    restart: unless-stopped
    entrypoint:
      - sh
      - -c
      - mkdir -p /data/langfuse && exec minio server --address :9000 /data
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD}
    volumes:
      - minio:/data
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 2s
      timeout: 5s
      retries: 15
      start_period: 5s

  redis:
    image: redis:7.4
    restart: unless-stopped
    command:
      - --requirepass
      - ${REDIS_PASSWORD}
      - --maxmemory-policy
      - noeviction
    volumes:
      - redis:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 3s
      timeout: 10s
      retries: 10

  postgres:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: postgres
      TZ: UTC
      PGTZ: UTC
    volumes:
      - postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 3s
      timeout: 3s
      retries: 10

volumes:
  clickhouse:
  minio:
  redis:
  postgres: