{"id":24989760,"url":"https://github.com/langfuse/langfuse-k8s","last_synced_at":"2025-04-19T19:34:25.480Z","repository":{"id":220425434,"uuid":"751616553","full_name":"langfuse/langfuse-k8s","owner":"langfuse","description":"Community-maintained Kubernetes config and Helm chart for Langfuse","archived":false,"fork":false,"pushed_at":"2025-04-17T15:59:50.000Z","size":159,"stargazers_count":97,"open_issues_count":15,"forks_count":59,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-18T06:21:41.859Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://langfuse.com","language":"Smarty","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/langfuse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-02-02T00:38:08.000Z","updated_at":"2025-04-17T15:59:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"ce392789-2598-44a9-b636-aa7307481f18","html_url":"https://github.com/langfuse/langfuse-k8s","commit_stats":null,"previous_names":["langfuse/langfuse-k8s"],"tags_count":42,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langfuse%2Flangfuse-k8s","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langfuse%2Flangfuse-k8s/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langfuse%2Flangfuse-k8s/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langfuse%2Flangfuse-k8s/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/langfuse","download_url":"https://codeload.github.com/langfuse/langfuse-k8s/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249780478,"owners_count":21324554,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-04T13:03:26.284Z","updated_at":"2025-04-19T19:34:25.467Z","avatar_url":"https://github.com/langfuse.png","language":"Smarty","funding_links":[],"categories":["Smarty","Go Template"],"sub_categories":[],"readme":"![GitHub Banner](https://github.com/langfuse/langfuse-k8s/assets/2834609/2982b65d-d0bc-4954-82ff-af8da3a4fac8)\n\n# langfuse-k8s\n\nThis is a community-maintained repository that contains resources for deploying Langfuse on Kubernetes.\n\n## Helm Chart\n\nWe provide a Helm chart that helps you deploy Langfuse on Kubernetes.\n\n### 1.0.0 Release Candidate\n\nThis Chart is a release candidate for the 1.0.0 version of the Langfuse Helm Chart.\nPlease provide all thoughts and feedbacks on the interface and the upgrade path via our [GitHub Discussion](https://github.com/orgs/langfuse/discussions/5734).\n\nFor details on how to migrate from 0.13.x to 1.0.0, refer to our [migration guide](./UPGRADE.md).\n\n### Installation\n\nConfigure the required secrets and parameters as defined below in a new `values.yaml` file.\nThen install the helm chart using the commands below:\n\n```bash\nhelm repo add langfuse https://langfuse.github.io/langfuse-k8s\nhelm repo update\nhelm install langfuse langfuse/langfuse -f values.yaml\n```\n\n### Upgrading\n\n```bash\nhelm repo update\nhelm upgrade langfuse langfuse/langfuse\n```\n\nPlease validate whether the helm sub-charts in the Chart.yaml were updated between versions.\nIf yes, follow the guide for the respective sub-chart to upgrade it.\n\n### Configuration\n\nThe required configuration options to set are:\n\n```yaml\n# Optional, but highly recommended. Generate via `openssl rand -hex 32`.\n#  langfuse:\n#    encryptionKey:\n#      value: \"\"\nlangfuse: \n  salt:\n    value: secureSalt\n  nextauth:\n    secret:\n      value: \"\"\n\npostgresql:\n  auth:\n    # If you want to use `postgres` as the username, you need to provide postgresPassword instead of password.\n    username: langfuse\n    password: \"\"\n\nclickhouse:\n  auth:\n    password: \"\"\n\nredis:\n  auth:\n    password: \"\"\n\ns3:\n  auth:\n    rootPassword: \"\"\n```\n\nThey can alternatively set via secret references (the secrets must exist):\n\n```yaml\n# Optional, but highly recommended. Generate via `openssl rand -hex 32`.\n#  langfuse:\n#    encryptionKey:\n#      secretKeyRef:\n#        name: langfuse-encryption-key-secret\n#        key: encryptionKey\nlangfuse: \n  salt:\n    secretKeyRef:\n      name: langfuse-general\n      key: salt\n  nextauth:\n    secret:\n      secretKeyRef:\n        name: langfuse-nextauth-secret\n        key: nextauth-secret\n\npostgresql:\n  auth:\n    # If you want to use `postgres` as the username, you need to provide a adminPasswordKey in secretKeys.\n    username: langfuse\n    existingSecret: langfuse-postgresql-auth\n    secretKeys:\n      userPasswordKey: password\n\nclickhouse:\n  auth:\n    existingSecret: langfuse-clickhouse-auth\n    secretKeys:\n      userPasswordKey: password\n\nredis:\n  auth:\n    existingSecret: langfuse-redis-auth\n    secretKeys:\n      userPasswordKey: password\n\ns3:\n  auth:\n    # If existingSecret is set, both root user and root password must be supplied via the secret\n    existingSecret: langfuse-s3-auth\n    rootUserSecretKey: rootUser\n    rootPasswordSecretKey: rootPassword\n```\n      \nSee the [Helm README](./charts/langfuse/README.md) for a full list of all configuration options.\n\n#### Examples:\n\n##### With an external Postgres server\n\n```yaml\n[...]\npostgresql:\n  deploy: false\n  auth:\n    username: my-username\n    password: my-password\n    database: my-database\n  host: my-external-postgres-server.com\n  directUrl: postgres://my-username:my-password@my-external-postgres-server.com\n  shadowDatabaseUrl: postgres://my-username:my-password@my-external-postgres-server.com\n```\n\n#### With an external S3 bucket\n\n```yaml\n[...]\ns3:\n  deploy: false\n  bucket: \"langfuse-bucket\"\n  region: \"eu-west-1\"\n  endpoint: \"https://s3.eu-west-1.amazonaws.com\"\n  forcePathStyle: false\n  accessKeyId:\n    value: \"mykey\"\n  secretAccessKey:\n    value: \"mysecret\"\n  eventUpload:\n    prefix: \"events/\"\n  batchExport:\n    prefix: \"exports/\"\n  mediaUpload:\n    prefix: \"media/\"\n```\n\n#### Use custom deployment strategy\n\n```yaml\n[...]\nlangfuse:\n  deployment:\n    strategy:\n      type: RollingUpdate\n      rollingUpdate:\n        maxSurge: 50%\n        maxUnavailable: 50%\n```\n\n##### Enable ingress\n\n```yaml\n[...]\nlangfuse:\n  ingress:\n    enabled: true\n    hosts:\n    - host: langfuse.your-host.com\n      paths:\n      - path: /\n        pathType: Prefix\n    annotations: []\n```\n\n#### Custom Storage Class Definition\n\nThe Langfuse chart supports configuring storage classes for all persistent volumes in the deployment. You can configure storage classes in two ways:\n\n1. **Global Storage Class**: Set a global storage class that will be used for all persistent volumes unless overridden.\n```yaml\nglobal:\n  defaultStorageClass: \"your-storage-class\"\n```\n\n2. **Component-specific Storage Classes**: Override the storage class for specific components.\n```yaml\npostgresql:\n  primary:\n    persistence:\n      storageClass: \"postgres-storage-class\"\n   \nredis:\n  primary:\n    persistence:\n      storageClass: \"redis-storage-class\"\n\nclickhouse:\n  persistence:\n    storageClass: \"clickhouse-storage-class\"\n\ns3:\n  persistence:\n    storageClass: \"minio-storage-class\"\n```\n\nIf no storage class is specified, the cluster's default storage class will be used.\n\n##### With an external Postgres server with client certificates using own secrets and additionalEnv for mappings\n\n```yaml\nlangfuse:\n  salt: null\n  nextauth: \n    secret: null\n  extraVolumes:\n    - name: db-keystore   # referencing an existing secret to mount server/client certs for postgres\n      secret:\n        secretName: langfuse-postgres  # contain the following files (server-ca.pem, sslidentity.pk12)\n  extraVolumeMounts:\n    - name: db-keystore\n      mountPath: /secrets/db-keystore  # mounting the db-keystore store certs in the pod under the given path\n      readOnly: true\n  additionalEnv:\n    - name: DATABASE_URL  # Using the certs in the url eg. postgresql://the-db-user:the-password@postgres-host:5432/langfuse?ssl=true\u0026sslmode=require\u0026sslcert=/secrets/db-keystore/server-ca.pem\u0026sslidentity=/secrets/db-keystore/sslidentity.pk12\u0026sslpassword=the-ssl-identity-pw\n      valueFrom:\n        secretKeyRef:\n          name: langfuse-postgres  # referencing an existing secret\n          key: database-url\n    - name: NEXTAUTH_SECRET\n      valueFrom:\n        secretKeyRef:\n          name: langfuse-general # referencing an existing secret\n          key: nextauth-secret\n    - name: SALT\n      valueFrom:\n        secretKeyRef:\n          name: langfuse-general\n          key: salt\nservice:\n  [...]\ningress:\n  [...]\npostgresql:\n  deploy: false\n  auth:\n    password: null\n    username: null\n```\n\n##### With overrides for hostAliases\n\nThis is going to add a record to the /etc/hosts file of all containers\nunder the langfuse-web pod in such a way that every traffic towards \"oauth.id.jumpcloud.com\" is going to be forwarded to the localhost network.\n\n```yaml\nlangfuse:\n  web:\n    hostAliases:\n      - ip: 127.0.0.1\n        hostnames:\n          - \"oauth.id.jumpcloud.com\"\n```\n\n##### With topology spread constraints\n\nDistribute pods evenly across different zones to improve high availability:\n\n```yaml\nlangfuse:\n  # Global topology spread constraints applied to all langfuse pods\n  pod:\n    topologySpreadConstraints:\n      - maxSkew: 1\n        topologyKey: topology.kubernetes.io/zone\n        whenUnsatisfiable: ScheduleAnyway\n        labelSelector:\n          matchLabels:\n            app.kubernetes.io/instance: langfuse\n  \n  # Component-specific topology spread constraints\n  web:\n    pod:\n      topologySpreadConstraints:\n        - maxSkew: 1\n          topologyKey: kubernetes.io/hostname\n          whenUnsatisfiable: DoNotSchedule\n          labelSelector:\n            matchLabels:\n              app: web\n  \n  worker:\n    pod:\n      topologySpreadConstraints:\n        - maxSkew: 1\n          topologyKey: kubernetes.io/hostname\n          whenUnsatisfiable: DoNotSchedule\n          labelSelector:\n            matchLabels:\n              app: worker\n```\n\n## Repository Structure\n\n- `examples` directory contains example `yaml` configurations\n- `charts/langfuse` directory contains Helm chart for deploying Langfuse with an associated database\n\nPlease feel free to contribute any improvements or suggestions.\n\nLangfuse deployment docs: https://langfuse.com/docs/deployment/self-host\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flangfuse%2Flangfuse-k8s","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flangfuse%2Flangfuse-k8s","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flangfuse%2Flangfuse-k8s/lists"}