Langfuse encryption in transit and at rest: what your team must provide
Before go-live, your security or platform team needs to show that LLM trace data is encrypted in transit and at rest. For a self-hosted Langfuse, that evidence depends on two things you provide: a TLS endpoint in front of Langfuse Web, and encrypted data stores that you run. Langfuse also relies on three application secrets, SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY, which protect stored API key hashes, console sessions and stored LLM and integration credentials. Langfuse does not terminate HTTPS itself, so the certificate, the load balancer or service mesh, and the routing to Langfuse Web are your responsibility from the first test environment onward.
Some of these controls are Langfuse settings and others are infrastructure decisions your team owns. The main setting is LANGFUSE_CSP_ENFORCE_HTTPS=true, which restricts browsers to HTTPS, along with the values you assign to the three secrets in the deployment configuration. Infrastructure decisions include where TLS terminates, whether traffic is encrypted again between the proxy and the containers, which certificate authority issues the certificate, and how renewal is handled. The same team must decide whether PostgreSQL, ClickHouse, Redis or Valkey, and S3-compatible blob storage use encryption at rest. Langfuse's documentation recommends database-level encryption at rest, typically through managed cloud services, so the choice between a managed service and self-managed volume encryption belongs to your platform team.
Treat the three secrets as deployment inputs with their own owners and lifecycle. Keep them in your secrets manager and out of Helm values files or Compose files stored in source control, and limit who can read them. Before go-live, confirm in the Langfuse encryption documentation which values can be rotated safely, what rotation does to existing sessions and stored credentials, and whether data written under an earlier ENCRYPTION_KEY remains readable after a change. Those answers determine whether rotation is a routine change or a planned maintenance event that includes a re-encryption step. Ask your implementation partner to record each secret's owner, storage location and rotation procedure in the handover documentation.
Plan the evidence before an auditor asks for it. Keep a current record of the TLS configuration, the certificate issuer and renewal process, the encryption settings of each data store, and the secret inventory with owners. Verify that plain HTTP is not exposed on any public path and that Langfuse Web, the worker and each data store are reachable only through the intended network routes. Run these checks again after each Langfuse upgrade and each infrastructure change, because a change to the proxy or a managed database can alter the evidence. DeployOpen can prepare the systems, configuration records and evidence for a compliance assessment, but it does not issue audit reports or attestations. Independent auditors and certification bodies decide whether these controls meet your framework.
Which TLS termination point fits your platform
This table compares three places where TLS can end in front of a self-hosted Langfuse: a cloud load balancer or managed ingress, a Kubernetes ingress controller, and a service mesh sidecar. Langfuse does not terminate HTTPS itself, so the choice determines who manages certificates, who patches the component and where traffic becomes plain text inside your network. Whichever option you choose, set LANGFUSE_CSP_ENFORCE_HTTPS=true.
| Option | Where TLS ends | What the team operates | When it fits |
|---|---|---|---|
| Cloud load balancer or managed ingress | At the cloud load balancer, before traffic reaches Langfuse Web | The load balancer listener, its certificate and the forwarding rules to Langfuse Web | Langfuse runs on one cloud and your team prefers the provider to run the edge component |
| Kubernetes ingress controller | At the ingress controller in the cluster, before traffic reaches Langfuse Web | The ingress controller, its certificate secret and the routing values in your Helm release | You deploy Langfuse with Helm on Kubernetes and want routing and TLS defined with the rest of the cluster |
| Service mesh sidecar (such as Istio or Linkerd) | At the sidecar proxy next to Langfuse Web, with encryption between services where mesh policy requires it | The mesh control plane, sidecar injection, certificate handling and mesh policies | You already run a mesh and want encryption between services as well as at the edge, with staff to operate it |
| Browser HTTPS enforcement (all options) | Set in Langfuse configuration, so browsers only use HTTPS | Setting LANGFUSE_CSP_ENFORCE_HTTPS=true and confirming the public URL uses https | Required in every option; it complements TLS at the termination point and does not replace it |
| Traffic to PostgreSQL, ClickHouse, Redis and blob storage | Outside the edge decision; confirm each data store's connection encryption settings | Connection settings and certificates for each data store | Plan it alongside the termination choice, since the edge setting does not cover these connections |
How encryption in transit reaches Langfuse Web and the worker
Encryption in transit for a self-hosted Langfuse starts at the edge, not inside the application. Langfuse does not terminate HTTPS itself. Its self-hosting documentation describes TLS termination at a load balancer or at a service mesh sidecar such as Istio or Linkerd. Browsers and SDKs connect to that TLS endpoint over HTTPS, and the endpoint forwards the decrypted request to Langfuse Web, which serves the UI and the public APIs. Your first decision is which component owns the certificate, how it is issued and renewed, and whether the TLS endpoint is the only place where clients can reach the instance.
Set LANGFUSE_CSP_ENFORCE_HTTPS=true so that browsers are restricted to HTTPS for the UI. Confirm this on a test deployment before you rely on it, because a mixed-content or redirect problem between the TLS endpoint and Langfuse Web will show up as a broken login or blank page rather than a clear error. Also confirm how your proxy sets forwarding headers, since the application must see the original scheme and host to build correct links and cookies. The exact header behavior and any required proxy settings should be checked against the Langfuse self-hosting docs for your version.
Trace ingestion needs the same care. Langfuse accepts OpenTelemetry traces over OTLP at the /api/public/otel endpoint, so OTEL-instrumented applications can send traces to it. That path carries prompts, outputs and metadata, which are often the most sensitive data in the system. It must sit behind the same TLS endpoint as the UI and public API, with no plaintext listener exposed to application networks. Inventory every service, batch exporter and sidecar that sends traces, and confirm that each one is configured with an https URL and a certificate chain it trusts. A common failure is an internal collector still pointed at a plain HTTP address after the UI has moved to HTTPS.
Langfuse Worker processes asynchronous events and talks to PostgreSQL, ClickHouse, Redis or Valkey, and S3-compatible blob storage. Those internal hops are not covered by the edge TLS endpoint. You must decide whether traffic between the TLS endpoint and the containers, and between the containers and each data store, is also encrypted. Many organizations encrypt these links with mutual TLS through a service mesh, with TLS enabled on the database connections, or with a network policy that keeps the traffic on a segment they control. Confirm the choice against your own network policy and the Langfuse self-hosting docs, and verify each client setting, since some connection options are per data store and are not switched on by one global flag.
Record the decision as a table of paths: client to TLS endpoint, TLS endpoint to Langfuse Web, OTLP sources to the TLS endpoint, Langfuse Web and Worker to each data store, and blob storage access. For each path, name the protocol, the certificate owner, the trust store, and the test that proves encryption is active, such as a handshake check from inside the cluster. Re-run these checks after certificate renewal, proxy changes and Langfuse upgrades, because a version change can alter how the application connects to its stores.
Encryption at rest for PostgreSQL, ClickHouse, Redis and blob storage
PostgreSQL is the relational store in a self-hosted Langfuse deployment. It holds the configuration and account records that the Langfuse Web and Langfuse Worker containers read and write, including users, organizations, projects and API key records. Because these records identify people and teams, PostgreSQL should be encrypted at rest like any other system of record. The Langfuse encryption documentation recommends database-level encryption at rest, typically through a managed cloud database service.
- Encryption scope: Confirm whether the service encrypts the data volume, replicas, snapshots and temporary files, or only some of these.
- Key management: Ask whether keys are provider-managed or customer-managed, who can rotate them, and what happens to the database if a key is disabled.
- Version floor: The Langfuse v3 to v4 upgrade guide requires PostgreSQL 15 or later, so check that the managed version you choose meets that minimum.
- Credential handling: Store the database connection credentials in your secrets manager, not in plain configuration files.
Confirm these encryption options, key management and backup encryption for your chosen PostgreSQL product and version with the vendor before you approve the design.
ClickHouse is the analytical store for traces, observations and scores. It usually holds most of the data volume in a self-hosted Langfuse deployment, so its encryption choices affect storage capacity and cost planning as well as security. The Langfuse documentation recommends database-level encryption at rest, and managed ClickHouse services or encrypted cloud storage volumes are the typical route. For self-managed clusters, encryption depends on how your distribution and disks are configured.
- Capacity impact: Plan storage with encryption in place, and include the disk headroom that the v3 to v4 guide advises for backfilling historic data (about 3x).
- Version floor: The v3 to v4 guide requires ClickHouse 25.12 or later and recommends 26.4, so confirm the version your encryption design supports.
- Disk-level encryption: For self-managed nodes, confirm with ClickHouse documentation for your version how encryption is applied to data parts and whether it is applied at the storage layer.
- Key ownership: Ask who holds the keys for managed or cloud-encrypted volumes and how key rotation is performed without downtime.
Confirm the exact encryption options, key management and backup encryption for your ClickHouse product and version with the vendor, because the available features differ between managed services and self-managed clusters.
Redis or Valkey serves as a supporting store in self-hosted Langfuse, used for queueing and caching work between the web and worker containers. Its data is usually short-lived, but queued job payloads can still contain sensitive content, so it should be handled as sensitive data. Memory itself is not covered by disk encryption. Encryption at rest applies only to any files the store writes to disk, such as persistence snapshots or append-only logs, when persistence is enabled.
- Persistence setting: Confirm whether persistence is enabled. If it is not, there are no persistence files to encrypt, but the design should still be reviewed for the data in memory.
- Managed service: A managed Redis or Valkey service is the typical route, so confirm whether its disks and backups are encrypted by default.
- Version floor: The v3 to v4 upgrade guide requires Redis 7.0 or later, so confirm that the version you run or buy meets that minimum.
- Separate controls: Encryption in transit between Langfuse and the store is a separate control and needs its own configuration.
Confirm the exact encryption options, key management and backup encryption for your chosen Redis or Valkey product and version with the vendor, including how persistence files are encrypted and whether they are included in your backups.
S3-compatible blob storage holds objects that Langfuse writes to object storage, such as uploaded event data and exports, depending on the features you enable. Objects in blob storage can be large and long-lived, so their encryption and access settings need the same review as the database stores. The Langfuse documentation recommends database-level encryption at rest for the data stores, and for blob storage the typical route is server-side encryption offered by a cloud provider or a managed object storage service.
- Server-side encryption: Confirm which server-side encryption modes the product supports, and whether it can be enforced through bucket policy so that unencrypted uploads are rejected.
- Key management: Ask whether keys are provider-managed or customer-managed, and how they are rotated and recovered.
- Self-hosted object storage: If you run an S3-compatible system yourself, such as SeaweedFS or MinIO, confirm its encryption configuration and key storage with the project or vendor.
- Object lifecycle: Check whether versioning and lifecycle rules keep older encrypted copies, and whether they need to be covered by the same key policy.
Confirm the exact encryption options, key management and backup encryption for your chosen object storage product and version with the vendor, and test that a restored object can still be read with the keys you hold.
Backups are copies of the same data held in each store, so they need the same encryption as the source. A backup that is unencrypted can undo the protection on the live database, even when the live system is fully encrypted. Each store has its own backup method, such as database dumps, volume snapshots or object copies, and each method may handle encryption differently. Backup and restore procedures are covered in more detail in the Langfuse backup and restore topic, but the encryption questions below apply to every store.
- Backup encryption: Confirm that dumps, snapshots and object copies are encrypted, and whether the encryption uses the same key as the live store.
- Key access: Limit who can use backup keys, and keep them separate from the people who administer the live systems where practical.
- Restore testing: Restore a backup into a test environment and confirm that the data is readable with the keys you hold.
- Key recovery: Document how keys are recovered if the key service is unavailable, since a backup cannot be restored without them.
Confirm the exact backup encryption options, key management and restore process for each product and version in your design with the vendor, and record the answers in the same review as the live encryption settings.
What SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY protect
Three application-level secrets sit on top of the transport and storage controls covered elsewhere on this page. Each one protects a different asset, so a leak or loss of each has a different blast radius. SALT is used to hash API keys, so the key material stored in PostgreSQL can be checked without being kept in readable form. NEXTAUTH_SECRET is used to encrypt console JWTs, the session tokens that keep people signed in to the Langfuse UI. ENCRYPTION_KEY encrypts the LLM provider API keys and integration credentials that Langfuse stores so it can call those services on your behalf. Before deployment, map each secret to the component that reads it, because the Web and Worker containers both depend on these values.
If NEXTAUTH_SECRET leaks, anyone holding it may be able to forge or tamper with console session tokens, so the team should plan a rotation that ends existing sessions. Ask the Langfuse encryption documentation and your own test environment what happens to active sessions when the value changes. If ENCRYPTION_KEY leaks alongside a database copy, stored provider and integration credentials can be decrypted, which exposes spend, model access and data at those external systems. Losing ENCRYPTION_KEY is a different failure: stored credentials cannot be read after a restore unless the same value is available, so an otherwise healthy restore can leave integrations broken until the credentials are re-entered.
Operator error is the more likely route to trouble. Common causes include regenerating a value during a Helm or Terraform redeploy, committing a values file with a secret to version control, pasting a value into a ticket, or restoring PostgreSQL while the matching secret is missing or from a different point in time. Confirm the required length, character set and generation method in the encryption documentation before you generate anything, since this guide does not specify them. Use a cryptographically secure generator, store each value as its own entry in your secrets manager, give the deployment pipeline read access and limit human access to a named owner group. Record which value belongs to which environment so no one has to guess during an incident.
Backup needs the same discipline as the data. Keep versioned copies of all three values in the secrets manager, and record which secret version pairs with which PostgreSQL and ClickHouse backup set. Include a restore test in a non-production environment that brings up the database and the matching secrets together, then confirms that a stored integration credential still works and that a console login succeeds. Before go-live, ask your DeployOpen team or the Langfuse documentation whether changing SALT affects existing API keys, and write down the rotation procedure for each secret so the on-call team can follow it without the original builders present.
How to set up encryption end to end
This sequence moves a self-hosted Langfuse to HTTPS-only browser access, encrypted data stores and application secrets kept out of code, then proves each control works with checks you can record.
Confirm the deployment target and data store versions
The platform team confirms where Langfuse runs, either Docker Compose on a single VM for testing or Kubernetes with Helm or Terraform for production, and records the versions of PostgreSQL, ClickHouse and Redis or Valkey in use. If you are moving to v4, the upgrade guide requires ClickHouse 25.12 or later (26.4 recommended), PostgreSQL 15 or later and Redis 7.0 or later, so confirm those before anything else. Note the named owner for each component in the change record. Done when every component in the architecture has a version and an owner.
Choose and configure the TLS endpoint
Langfuse does not terminate HTTPS itself, so the infrastructure team places TLS at a load balancer or at a service mesh sidecar such as Istio or Linkerd. The team issues or installs a certificate that covers the public hostname users will open, then routes HTTPS traffic to the Langfuse Web container, which serves the UI and APIs. Check the certificate chain with your certificate authority's tooling before go-live. Done when the hostname presents a valid certificate from the load balancer or mesh and returns the Langfuse login page.
Set LANGFUSE_CSP_ENFORCE_HTTPS to true
The application owner sets LANGFUSE_CSP_ENFORCE_HTTPS=true in the deployment configuration, either the Compose file or the Helm values, which restricts browsers to HTTPS. The change is applied through a normal redeployment so the running containers read the new value. After the rollout, open the UI in a browser and confirm it loads with no mixed-content errors in the developer tools console. Done when the setting appears in the deployed configuration and the browser connects only over HTTPS.
Enable encryption at rest on each data store
The cloud or infrastructure team turns on database-level encryption at rest for PostgreSQL, ClickHouse, Redis or Valkey, and the S3-compatible blob storage. The Langfuse docs recommend database-level encryption and note that managed cloud services commonly provide it, so use the provider setting or the storage platform's encryption option where one exists. Record which key management service holds the keys and who can rotate them. Confirm each store's encryption flag in the provider console or CLI output, and confirm that backup copies are encrypted too. Done when every store reports encryption enabled and the evidence is saved with the deployment record.
Generate and store the three application secrets
The platform team creates three separate values for SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY. SALT hashes API keys, NEXTAUTH_SECRET encrypts console JWTs, and ENCRYPTION_KEY encrypts stored LLM API and integration credentials. Generate each value with your approved random generator, confirm the expected format in the Langfuse encryption documentation, and store them in your secrets manager, injecting them at runtime rather than committing them to version control. Before rotating any value after first start, confirm in the docs what that change affects. Done when all three values are deployed, none is reused, and the storage location is recorded.
Verify encryption in transit and at rest
Test each control before the system goes into use. Send a plain HTTP request to the public hostname and confirm it is refused or redirected to HTTPS. Open the UI in a browser and confirm it connects only over HTTPS. Check each data store's encryption setting again in the provider or storage console, then send a test trace through the SDK to confirm the Web and Worker containers process data with the new secrets in place. Record each result in the change log. Done when all three checks pass and the results are filed with the deployment record.
Security and operational checks for encrypted Langfuse
Encryption in transit and at rest only holds if the people and processes around it keep working. The cards below assign an owner to each operational control and name the check that confirms it still holds after deployment, upgrades and staff changes.
Certificate issuance and renewal
Langfuse does not terminate HTTPS itself, so the certificate lives on the load balancer or the service mesh sidecar in front of Langfuse Web. Name one owner for issuance, renewal and replacement, and record which component holds the private key. Check that renewal is automated or calendared, that the chain is complete, and that a test request to the public hostname returns a valid certificate before expiry.
Secrets in the secrets manager
SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY are the application secrets that protect API keys, console sessions and stored LLM credentials. The platform team owns their storage and rotation plan. Check that each value is injected at runtime from a secrets manager your organization operates, and that none appear in container images, Helm values committed to source control or shell history from install commands.
Read access to deployment configuration
Environment variables, Helm values and Terraform state for Langfuse often contain database passwords, blob storage credentials and the application secrets. The infrastructure owner should limit read access to the deployment pipeline and a small operator group. Check who can read the running pods' environment, the CI variables and the state backend, and remove access that no current role needs.
Logging and monitoring of the TLS endpoint
The public endpoint is the first place failed handshakes, expired certificates and unusual request volumes appear. The operations team owns alerts on the load balancer or mesh and on Langfuse Web health checks. Check that TLS handshake errors and certificate expiry warnings reach a monitored channel, and that logs retain client addresses and request paths without storing prompt content.
Access to backups holding encrypted data
Backups of PostgreSQL, ClickHouse and blob storage contain the same trace data as the live stores, and a backup copy is only as protected as its key management. The data protection owner should confirm where backups are kept, who can restore them, and whether the ENCRYPTION_KEY and SALT values needed to read stored credentials are backed up separately under the same controls. Test a restore into an isolated environment to confirm the secrets match.
Deployment network path checks
Encryption in transit also covers the internal hops between Langfuse Web, Langfuse Worker, PostgreSQL, ClickHouse, Redis or Valkey and S3-compatible storage. The network owner should document which of these connections use TLS and which rely on a private network boundary. Check each connection's configuration against that record after every deployment change, and confirm the CSP setting LANGFUSE_CSP_ENFORCE_HTTPS=true is in place for browser traffic.
Rotating the application secrets without losing data
Treat each of the three application secrets as a separate change with its own window and its own rollback path. The reason is that each one protects different data. SALT is used to hash API keys, NEXTAUTH_SECRET is used to encrypt console JWTs (the sessions people use to sign into the Langfuse UI), and ENCRYPTION_KEY is used to encrypt the LLM API and integration credentials you store inside Langfuse. A change to one does not have the same consequences as a change to another, so a single combined rotation plan is the wrong unit of work.
Before you schedule any change, read the encryption documentation for the exact Langfuse version you run. Confirm three things in writing with your vendor or from that page: what happens to existing hashed API keys after SALT changes, whether existing console sessions survive a NEXTAUTH_SECRET change, and what happens to stored encrypted credentials after an ENCRYPTION_KEY change. Also confirm whether any of these values can be changed without re-entering credentials, such as the LLM provider keys or integration secrets configured in the UI. If the answer for ENCRYPTION_KEY is that stored credentials must be re-entered, that work belongs in the change plan, with a named owner and a list of every credential affected.
Write the rollback path before the change, not after it. Keep the previous values in your secrets manager under version control, record which deployment artifacts read each variable, and decide in advance how you will restore the old value and restart Langfuse Web and Langfuse Worker, since both containers read the same configuration. Take a backup of PostgreSQL first, because the backup is your restore point for data the application writes during the window. Plan the change during a period when project API key use and sign-ins are low, and tell the teams that run SDK integrations that they may need to check their keys afterwards.
Test every rotation in a non-production instance that mirrors your production configuration, including the same secret store, the same ENCRYPTION_KEY history and a representative set of stored credentials. Run the full sequence there: rotate, restart, sign in with an existing account, send a trace with an existing project API key, open a configured integration and confirm it still connects. Record what you observed for each step. If the test shows that a value cannot be rotated without re-entry, you have learned that before production, and you can size the work accordingly.
Keep a short runbook for the production change with the pre-checks, the rotation order, the verification steps and the rollback trigger. Name who decides to roll back and how long you will watch for failures before closing the change. Retain the test record as change evidence for your internal review, since it shows which behavior you confirmed for your version rather than assumed.
What to confirm in your environment before go-live
Langfuse encryption depends on components outside the Langfuse containers: the edge, the internal network, each data store and the secrets injected at startup. The items below are not settled by the Langfuse documentation alone, so confirm each one against your environment and internal policy before go-live.
TLS at the load balancer or mesh
Langfuse does not terminate HTTPS itself, so the load balancer or a service mesh such as Istio or Linkerd handles the browser and SDK connections. Confirm which TLS protocol versions, cipher suites and certificate lifecycle the chosen component enforces, and whether it redirects plain HTTP. Set LANGFUSE_CSP_ENFORCE_HTTPS=true so browsers are restricted to HTTPS, then test the sign-in flow and trace ingestion through the proxy.
Encryption between internal services
Traffic also crosses internal hops: from the edge to langfuse-web, between web and worker, and from both containers to PostgreSQL, ClickHouse, Redis or Valkey and blob storage. Decide whether each hop uses TLS, whether the mesh provides mutual TLS between workloads, and whether each data store accepts encrypted client connections in your configuration. Record the answer per hop, since a secure edge does not cover traffic inside the cluster or network.
At-rest encryption for PostgreSQL and ClickHouse
The Langfuse documentation recommends database-level encryption at rest, typically through managed cloud services. For PostgreSQL and ClickHouse, confirm whether storage is encrypted, who holds the keys, whether policy requires customer-managed keys, and how key rotation is handled. Check that snapshots and replicas inherit the same encryption. Ask the platform or database team to show the settings rather than relying on the product description.
Redis or Valkey and blob storage policy
Redis or Valkey and S3-compatible blob storage carry event and processing data, so they need the same review as the databases. Confirm the encryption at rest options for each store, the owner of its keys and whether encryption in transit to these services is enforced. For blob storage, check default bucket encryption, access policies and whether bucket backups are encrypted. Compare each finding with your data classification before the first production trace is ingested.
SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY
Langfuse uses SALT to hash API keys, NEXTAUTH_SECRET to encrypt console JWTs and ENCRYPTION_KEY to encrypt stored LLM API and integration credentials. Confirm how the Langfuse version you select handles each secret, including required length or format, where each value is injected from, and what happens when a value is rotated. Limit who can read these values and keep them out of image layers and plain configuration files.
Certification and audit evidence
Auditors and certification bodies issue audit outcomes and certifications. DeployOpen prepares evidence, such as configuration records, data store encryption settings and secret handling procedures, but does not issue attestations. Ask your auditor which controls they will test and which evidence format they accept before the configuration is frozen, so gaps surface early enough to fix.
Questions teams ask before encrypting a self-hosted Langfuse
Does Langfuse encrypt traffic between users and a self-hosted instance?
No. Langfuse does not terminate HTTPS itself, so transport encryption is provided by the layer in front of it: a load balancer, an ingress controller or a service mesh sidecar such as Istio or Linkerd. You decide where TLS ends, which certificates are presented, and whether traffic between the proxy and the Langfuse containers is also encrypted. Setting LANGFUSE_CSP_ENFORCE_HTTPS=true tells browsers to use HTTPS only, but it does not create the TLS endpoint. Plan the certificate chain, renewal process and internal hop encryption together, and confirm each setting against the self-hosting documentation for your version before you change production.
What drives the cost and effort of encrypting self-hosted Langfuse?
The main drivers are who owns the certificates, whether the data stores are managed services or run by your team, and how secrets are handled. Certificate issuance, renewal and monitoring are recurring work once a public or internal certificate authority is chosen. Encryption at rest for PostgreSQL, ClickHouse, Redis or Valkey and S3-compatible storage depends on whether you use a managed cloud service with built-in encryption or run each store yourself, which adds key management, backup encryption and patching to the scope. The application secrets SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY need a secret store, a rotation approach and a test plan, because changing some of them can affect existing data. Ask for a quote that lists each store, certificate and secret separately, with one-time and recurring work marked.
How long does it take to encrypt a self-hosted Langfuse deployment?
No fixed duration can be given without the environment and scope. The timeline depends on whether Langfuse runs on Docker Compose for testing or on Kubernetes for production, how many data stores you run yourself, whether certificates come from an existing internal authority or a new one, and how much testing your change process requires. Each of these changes the number of configuration steps, reviews and change windows. The reliable answer comes from the written plan, which should list the environments in scope, the sequence of changes and the verification steps for each. Ask that the plan state durations and dependencies before work starts, and check whether client-side tasks such as certificate approval are included in the estimate.
What does the client need to provide for encryption work?
Most of the work depends on access and approvals you control. Expect to provide access to the infrastructure where Langfuse runs, including the cloud accounts, clusters or virtual machines, and the data stores. Your security policy should define the approved TLS versions, cipher expectations, certificate authority and key lifecycle, so the design follows your policy as written. You will also need a secret store for the SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY values, with access limited to the services that need them. Finally, agree change windows for restarts, certificate cutovers and any data store changes, and name the people who approve each one.
Can our own team encrypt self-hosted Langfuse without a partner?
Yes, if your team already runs the platform layers involved. The work needs experience with certificate management at the load balancer or mesh, database-level encryption for each store you run, and secret handling in your existing tools. A team with that experience can keep the scope small by using managed cloud encryption for the data stores and an existing certificate process. Teams without it often find that test and rollback steps take the most time, because a wrong TLS or secret change can block logins or ingestion. Whatever you choose, document the decisions, test restores after changes and confirm the approach against your Langfuse version. DeployOpen plans, implements and hardens self-hosted platforms in your infrastructure, so a partner can cover the build while your team keeps ownership.
Is encryption included in Langfuse Enterprise license features?
Encryption does not appear in the list of self-hosted features that require an Enterprise license key in the Langfuse license key documentation. The features that do need a key include project-level roles, protected prompt labels, data retention policies, audit logs, server-side data masking, UI customization, SCIM provisioning and the instance management API. License terms and feature lists can change between releases, so confirm encryption against the license key documentation for the exact version you run before you plan around it. Also check the Langfuse repository license, since code under the ee/ directories falls under a separate enterprise license. Record the answer in your plan so procurement and security reviewers work from the same basis.
What breaks if the ENCRYPTION_KEY value changes?
Stored LLM API and integration credentials are encrypted with ENCRYPTION_KEY, so changing it without a migration plan can leave those saved credentials unusable. The same care applies to SALT, which Langfuse uses to hash API keys, because a changed value can stop existing keys from validating. NEXTAUTH_SECRET protects console JWTs, and changing it can sign users out, which is disruptive but recoverable. Before any rotation, back up the data stores, record the current values in your secret store with version history and rehearse the change in a non-production environment. Confirm the exact behavior for your version in the Langfuse encryption documentation before you schedule the change.
How DeployOpen scopes and delivers encryption for Langfuse
DeployOpen scopes Langfuse encryption as a written list of layers: TLS at the load balancer or service mesh, encryption at rest for each data store, and the SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY secrets. Each layer is built in your cloud accounts or data centers, tested, documented and handed over. Engagements are fixed-scope, and ongoing support is available as a retainer.
How we scope
- The written scope lists each encryption layer, the Langfuse component it protects and the owner of each secret.
- Scope records where TLS ends: at a load balancer, an Istio or Linkerd sidecar, or another termination point agreed in writing.
- Scope covers at-rest encryption for PostgreSQL, ClickHouse, Redis or Valkey and blob storage, with the platform option named for each store.
How we build
- Configure TLS at the chosen load balancer or mesh, and set LANGFUSE_CSP_ENFORCE_HTTPS=true in the Langfuse configuration.
- Enable encryption at rest on each data store, typically through managed cloud database and storage services where available.
- Generate SALT, NEXTAUTH_SECRET and ENCRYPTION_KEY per environment, store them in your secrets manager and restrict access.
How we hand over
- Each data store's encryption setting, key owner and key-handling procedure is documented in your runbook.
- Test evidence records the TLS configuration, encryption settings and secret locations for your internal reviewers.
- Handover states which secrets must be recovered alongside data store backups and where they are kept.
How we support
- Ongoing support can cover certificate renewal, secret rotation reviews and checks after Langfuse upgrades, as agreed in the scope.
- Changes to TLS, storage encryption or secrets are re-scoped in writing before work starts.
- Major Langfuse upgrades get their own scope, since they change infrastructure and data models.

