Skip to main content
This guide is for organisations with a commercial license for the Enterprise edition and deploying on their own infrastructure.If you are not using the Speckle Enterprise licensed server, please refer to our documentation page for instructions on deploying the open-source Speckle Server on Kubernetes.
The current release line is 2026.9, deployed as chart version 2026.9.4. Moving an existing deployment between release lines follows the self-hosted upgrade guide; bookmark it, it is not in the navigation.

Prerequisites

Before you can configure Speckle Enterprise Server, your organization will have already completed the following steps:
  1. License Acquisition: Acquired a commercial license for Speckle Enterprise Server from Speckle Systems.
  2. Package Registry Token: Obtained a package registry token from Speckle Systems to access the private Helm charts & Docker images for Enterprise features.
  3. Package Registry URL: Received the URL for the private package registry hosting the Enterprise Helm charts and Docker images.
  4. Cluster and dependencies: A Kubernetes cluster with Postgres, a single-node Valkey or Redis cache, blob storage (S3-compatible or Azure), an ingress controller, a certificate manager, and the high-priority and low-priority priority classes the chart schedules with. The Kubernetes deployment guide walks through each of these on DigitalOcean; the same components are needed on any provider.

New deployments

A new deployment installs the current release line directly. There is no data to migrate, so the upgrade order applies from your first upgrade onwards, not to the install. The current line needs the following from you before the server boots or accepts uploads. Each item is covered in this guide or on the linked release page. The chart also ships a compatibility layer that completes publishes arriving in the pre-2026.9 data format. A new deployment does not run it: leave the bundle_migration_token_secret key out of the main server secret, and turn the worker deployments off in values.yaml.
Without the key the server starts, logs one warning, and accepts 2026.9-format publishes only. A publish from an older connector, an older SDK version, or the deprecated objects REST API is rejected with LEGACY_SEND_UNSUPPORTED (HTTP 422); the error message points the user at the publishing migration guide. Treat the deployment as compatible with the 2026.9 connector and SDK line only.

Configuration steps

Retrieving the Helm chart

The Enterprise Helm chart and images are published to an OCI registry. Log in to the registry host with the token Speckle issued you:
<PACKAGE_REGISTRY_HOST> is the host part of the package registry URL. To read the chart’s reference values.yaml, pull the chart locally:
Use this file, not the one in the public GitHub repository, as the reference for the values available on your chart version.

Image pull secrets

The Helm Chart references Docker Images that are hosted in the same private registry as the Helm Chart. You will need to create an Image Pull secret in Kubernetes to allow your cluster to authenticate with the registry and pull the necessary images.
  1. Create a Kubernetes Secret of type dockerconfigjson:
  2. Confirm the secret is deployed successfully in the same namespace as your Speckle Server deployment.
  3. Update the Helm values.yaml file to reference the image pull secret:

Deploying the Helm chart

Prepare values.yaml as described in the Kubernetes deployment guide, add the Enterprise values from the sections below, then install the chart at an exact version:
The same command applies later changes to values.yaml, and moves to a newer chart version when you change --version. If you are switching an existing open-source deployment to the Enterprise chart, run it against the existing release name and namespace; the release history is kept. With the conversion runner enabled and helm_test_enabled on (the default), verify the installation:
The test runs a conversion canary that proves the whole file-import launch path, including the image pull and node pool scheduling.

License key

  1. Obtain your Speckle Enterprise license key from Speckle.
  2. Create a Kubernetes Secret to store the license key:
  3. Update the Helm values.yaml file to reference the license secret:
  4. Confirm the Gatekeeper module, which validates the license, is enabled. It is on by default since 2026.7; set it explicitly if your values file manages every flag:
  5. Upgrade your existing Helm deployment to apply the changes (see above for instructions on how to upgrade).
  6. If making any further changes to the license, note that Kubernetes does not automatically restart deployments when changes are made to secrets. Restart the ‘speckle-server’ and ‘speckle-objects’ deployments to apply the changes.
With the default values and no license, server pods do not start. Either wire in the license as above, or set featureFlags.workspacesModuleEnabled and featureFlags.gatekeeperModuleEnabled to false.

Enable Workspaces

Workspaces is a core feature of Speckle Enterprise Server that provides enhanced data management and collaboration capabilities for your users. Workspaces is on by default since 2026.7 and depends on the Gatekeeper module and a valid license, configured above.
  1. If your values file manages every flag, set it explicitly:
  2. Upgrade your existing Helm deployment to apply the changes (see above for instructions on how to upgrade).

(Optional) Admin support mode

Admin Support Mode gives server administrators controlled, auditable access to workspaces for troubleshooting and support. Server admins can read workspace data by default, but write access requires an explicit support session approved by a workspace admin.
  1. To enable Admin Support Mode, update the Helm values.yaml file to include the following feature flags:
  2. Upgrade your existing Helm deployment to apply the changes (see above for instructions on how to upgrade).
  3. Verify that Admin Support Mode is available by navigating to Server Settings > Workspaces, selecting a workspace, and checking for the Support Access section. See the Admin Support Mode guide for usage details.

(Optional) Saved views

Saved Views is a feature that enables users to mark up their models with annotations, save those views for later, or share with others.
  1. To enable Saved Views, update the Helm values.yaml file to include the following feature flag:
  2. Upgrade your existing Helm deployment to apply the changes (see above for instructions on how to upgrade).
  3. Verify that the Saved Views feature is available by following our documentation.

(Optional) Issues

The Issues feature allows users to create and manage issues directly within the Speckle Server interface, providing a streamlined way to track and resolve problems related to their models.
  1. To enable Issues, update the Helm values.yaml file to include the following feature flag:
  2. Upgrade your existing Helm deployment to apply the changes (see above for instructions on how to upgrade).
  3. Verify that the Issues feature is available by following our documentation.

(Optional) Multi-regional deployment

Multi-regional deployments allow you to provide data residency options for your users.

Pre-requisites

For each region you wish to support, you will need to deploy a Postgres and Blob Storage instance in that region. Depending on your networking requirements, you may need to set up a VPN or VPC peering connection between your Kubernetes cluster and the database/storage instances. You will need to configure postgres to handle transactions, max_prepared_transactions should be set to at least 100, preferably 1000. Please refer to your Postgres documentation for instructions on how to configure this setting.

Configuration

  1. Create a json file containing the connection details for your existing ‘main’ region, as follows:
    These details should match the connection details you provided when deploying your existing open source Speckle server instance. The main region is a required region. The connectionUri for Postgres should be in the following format:
    The null value for the default project region key means that the main region will be used as the default region for new projects. This can be updated later as we add support for additional regions.
  2. Update the same json file with the connection details for each additional region you wish to support. Each region should be given a unique region id. Each region is appended to the regions object as follows:
    If you wish to set a different default region, update the defaultProjectRegionKey value to match the region id of the region you wish to set as default.
  3. Create a Kubernetes secret to store the multi-region configuration:
  4. Update the Helm values.yaml file to reference the multi-regional configuration secret:
  5. To enable multi-regional support, update the Helm values.yaml file to include the following feature flag:
  6. Upgrade your existing Helm deployment to apply the changes (see above for instructions on how to upgrade).
  7. If adding further regions, note that Kubernetes does not automatically restart deployments when changes are made to secrets. Restart the ‘speckle-server’ and ‘speckle-objects’ deployments to apply the changes.

Giving access to regions in Speckle Server UI

The region is not yet selectable by users in the Speckle Server’s UI. You first need to create the region via Speckle Server’s UI.
  1. Ensure you are logged in to the Speckle server with an account that has server admin privileges.
  2. Navigate to Server Settings > Regions.
  3. Select Create to add a new region.
  4. Select the region id that corresponds to the region details you added in the multi-regional configuration json file.
  5. Fill in the required details for the new region, including the region name. This is the name that will be displayed to users.
  6. Save the new region.
  7. Once the region is created, users can select it when creating a new workspace. Please refer to the workspace guide for further details.

(Optional) Automate

Automate allows users to create and manage automated workflows within the Speckle Server interface. It provides a way to automate repetitive tasks, such as data processing and analysis, by creating custom workflows that can be triggered based on specific events. Automate requires additional infrastructure - including databases, caches, and kubernetes clusters or namespaces - to enable Speckle Enterprise Server. We provide a separate guide for enabling Automate, available in our documentation under Self-hosting Automate for Speckle Enterprise.

(Optional) Intelligence

Intelligence features can be enabled on their own, but are limited without the Automate module, which provides the necessary backend support. For a full experience, we recommend enabling both features together.
Intelligence currently requires access to an external Content Delivery Network (CDN) for the feature to work. If your cluster is in an environment without access to external networks, please contact your Speckle representative to discuss options for enabling this feature.
  1. To enable Intelligence features, update the Helm values.yaml file to include the following feature flag:
  2. Upgrade your existing Helm deployment to apply the changes (see above for instructions on how to upgrade).

(Optional) ACC integration

Autodesk Forma Data Management (ACC) sync lets users connect a file in their Autodesk hub to a Speckle model. The server converts the file in your cluster and updates the model each time a new version is published in Autodesk.
ACC Integration requires the conversion runner: syncs convert files through it, and the server refuses to start with accIntegrationEnabled on and the runner off (Syncs require the conversion jobrunner). Complete File imports before turning the integration on.
The integration runs on Speckle’s Autodesk application, so enabling it involves Speckle as well as your cluster.

What the integration needs from you

  • Credentials issued by Speckle. The client ID and client secret belong to Speckle’s Autodesk application. You do not create an application in the Autodesk developer portal. Speckle issues both when it enables the integration for your deployment.
  • Your public origin, registered by Speckle. After a user signs in, Autodesk redirects them to https://<DOMAIN>/api/v1/acc/auth/callback, and it accepts that redirect only if Speckle has registered it on the application. <DOMAIN> is the domain value of your chart.
  • A server that Autodesk can reach. Syncs are webhook-driven: Autodesk posts to https://<DOMAIN>/api/v1/acc/webhook/callback when a new file version is published. A deployment reachable only from inside your network lets users sign in but never picks up new versions.
  • The client secret in a Kubernetes Secret, named in accIntegration.clientSecret. The client ID is a plain chart value.

Enable the integration

1

Request enablement from Speckle

Send your Speckle representative the public origin of your deployment, https://<DOMAIN>. Speckle registers the callback URL on its Autodesk application and returns the client ID and client secret.
2

Store the client secret

Create an opaque Secret in the server namespace that holds the client secret, as in the command below. The Secret name and key are what you reference in the values file.
3

Set the values

Turn on featureFlags.accIntegrationEnabled and fill the accIntegration block with the client ID and the Secret name and key, as in the excerpt below. Keep featureFlags.jobRunnerEnabled on.
4

Upgrade and verify

Upgrade the release as in Deploying the Helm chart. The server pods start and log ACC Enabled. In the web app, Workspace settings now lists Autodesk Forma Data Management with a Log in button.
The Secret, with the name and key the excerpt below expects:
A complete values excerpt:
enableNwd and enableDwg are the chart’s switches for NWD/NWC and DWG syncs. Leave them on unless you want those formats off. Two steps remain outside your cluster before a user can create a sync. An Autodesk account admin at your organisation adds Speckle as a custom integration on the ACC hub, following Enable Autodesk Forma Data Management integration. Users then sign in and create syncs from their workspace, following the user guide.
The origin Speckle registered does not match your deployment. Autodesk compares the redirect URI character for character, so a different host, a plain http scheme, or a trailing path all fail. Send Speckle the exact https://<DOMAIN> your users open.
Autodesk cannot reach the webhook URL. Confirm https://<DOMAIN>/api/v1/acc/webhook/callback answers from the public internet and is not behind an ingress allow-list or an authenticating proxy.
The integration is a workspace plan feature. Check that the workspace is on a plan that includes it; the Enterprise and Unlimited plans do.

File imports (conversion runner)

From 2026.9, direct uploads and CDE syncs convert files in your cluster: the server launches one Kubernetes Job per file from the speckle-converters image, on a node pool you provision. The runner is off by default, and the chart cannot responsibly turn it on for you: it needs capacity and objects only you can provide. Without the runner, the server accepts no file uploads at all, including IFC. With the runner on, the server accepts ifc, rvt, nwd, nwc, dwg, dgn, skp, step and stp. The list is fixed by the server; there is no per-format switch. The converter image ships with the licensed ODA SDKs built in, so the ODA-based formats (rvt, nwd, nwc, dwg, dgn) need no credentials from you. 3dm and obj are the exception. They stay off until you turn on Rhino conversion with a token you supply.

What the runner needs from you

  • A node pool for conversion Jobs, labeled purpose=conversion (the value of conversionRunner.nodePool). Conversions are bursty, memory-hungry batch Jobs; a dedicated pool keeps them off your serving nodes. Jobs default to 4Gi base memory and may grow to the configured maximum (64Gi default ceiling) for large files; each Job has a two hour deadline by default. The node pool contract below is what the pool must satisfy.
  • A namespace and RBAC for the Jobs. The chart creates them when you set conversionRunner.createNamespace: true and conversionRunner.createResources: true (both off by default so clusters that manage these objects elsewhere do not collide). The RBAC lets the server and objects service accounts launch and watch Jobs.
  • Registry credentials in the conversion namespace. The Job pods pull the converter image from the same private registry as the chart, but from their own namespace, so the image pull secret you created for the server does not reach them. Create the same docker-registry Secret in the conversion namespace and name it in conversionRunner.imagePullSecrets. The Secret itself is always operator-created.
    <CONVERSION_NAMESPACE> is the value of conversionRunner.namespace, conversion by default.
  • The exact converter image pin: conversionRunner.converterImage: ghcr.io/specklesystems/speckle-converters:2026.9.0. Mirroring is optional: if you would rather serve images from your own registry, copy that image into it, point converterImage at the mirrored path, and create the pull Secret above with your registry’s credentials instead. Run the same YYYY.M converter and server line and upgrade both together: they must reference the same bundle format version. Never run the runner on a mutable latest tag, which silently breaks that pairing on the next push.

Node pool contract

Conversion Jobs are placed by the node selector purpose: <nodePool> and nothing else. Hand this contract to whoever provisions the pool.
  • Label and taint. The purpose label is mandatory. A taint is optional and must use the PreferNoSchedule effect: Jobs carry no tolerations, so a NoSchedule or NoExecute taint strands every Job, including the helm test canary, in Pending.
  • Three chart values must match the pool. The chart does not validate any of them.
    • The pool’s purpose label equals conversionRunner.nodePool.
    • The namespace the Jobs run in equals conversionRunner.namespace.
    • conversionRunner.maxMemoryMib stays under node allocatable memory. The 64Gi default ceiling pairs with 128 GB nodes; raise it only on larger nodes.
  • Machine shape. Memory-optimized nodes with at least 8 GB of RAM per core. The reference shape is 16 vCPU / 128 GB, which is what Speckle’s hosted service runs. Give each node at least 200 GB of disk: Jobs declare no ephemeral-storage request, so nothing stops a large source file from filling a small node disk.
  • Autoscaling. Minimum node count of at least 1, so the first upload does not wait on a scale-up and the autoscaler can see the label. Maximum roughly the number of large conversions you expect to run at once, plus 2.
Provider-specific: on GKE and AKS, set the label and the PreferNoSchedule taint on the node pool itself (--node-labels / --node-taints on GKE, --labels / --node-taints on AKS) so new nodes inherit them. On EKS, set them on the managed node group or the Karpenter NodePool. A label added by hand to running nodes is lost when the autoscaler replaces them.
If your ingress load balancer targets every node in the cluster, also label the pool node.kubernetes.io/exclude-from-external-load-balancers=true. Autoscaler churn on the conversion pool otherwise adds and removes load balancer members on every scale event.

Enable the runner

1

Enable the runner on the server

Set featureFlags.jobRunnerEnabled: true in your values. Upload acceptance derives from the runner: once the server restarts with it on, the web app’s upload dialog lists the supported formats.
2

Configure the conversionRunner block

Set the exact converter image, the node pool, the creation gates, and the pull Secret, as in the excerpt below. helm template with these values now renders the conversion Namespace, the Job ServiceAccount, and its Role and RoleBinding.
3

Deploy and verify

Install or upgrade the release as in Deploying the Helm chart. With helm_test_enabled on, helm test runs a conversion canary that proves the whole launch path, including the image pull and node pool scheduling. Then upload a file through the web app: it should convert and open in the viewer.
A complete values excerpt, with Jobs pinned to a pool labeled purpose=conversion and the chart creating the namespace and RBAC:
The Jobs cannot find a node. Run kubectl describe pod on one and look for FailedScheduling: either no node carries the purpose label matching conversionRunner.nodePool, or the pool has a NoSchedule taint, which Jobs carry no toleration for. Fix the label or change the taint effect to PreferNoSchedule; the Jobs schedule on their own once a node qualifies.
The pull Secret in the conversion namespace. Create it as described in What the runner needs from you.
The runner is off. With featureFlags.jobRunnerEnabled false the server accepts no file formats, and the web app says “Unsupported file type” as soon as a file is picked.
Rhino conversion is off. Those two formats need featureFlags.rhinoConversionEnabled: true next to the Rhino token. A token on its own does not enable them. See Rhino conversion for 3dm and obj.

Rhino conversion for 3dm and obj

3dm and obj convert through Rhino itself, which the runner runs under McNeel’s core-hour billing. The token is yours to supply, not Speckle’s: generate a core-hour billing auth token in the McNeel Licenses Portal under your own Rhino account or team, so that usage bills to your organization. Rhino conversion is off by default. Leave both featureFlags.rhinoConversionEnabled and conversionRunner.rhinoToken unset if you do not need those formats. The server then does not advertise them, rejects uploads and syncs of them as unsupported, and needs no token. To turn them on, set the pair together. Store the token in a Kubernetes Secret, name it in conversionRunner.rhinoToken, and set the flag:
With the flag on and no token, 3dm and obj uploads fail fast with a configuration error instead of launching a Job. The token reaches each Rhino-routed Job as a plain environment variable, readable by anyone with pod read access in the conversion namespace; the chart’s Role grants that only to the server and objects service accounts.
Deployments that already convert 3dm and obj on chart 2026.9.3 or earlier must add featureFlags.rhinoConversionEnabled: true next to their existing conversionRunner.rhinoToken when upgrading to 2026.9.4. Without the flag, the server silently stops accepting those two formats.

Blob storage reachable by clients

Model data moves between clients and object storage over pre-signed URLs, in both directions: publishing clients (connectors, the conversion Jobs, SDK scripts) upload directly to the bucket, and the viewer running in the user’s browser fetches directly from it. The object storage endpoint embedded in those URLs must therefore be addressable by your users’ machines and browsers, not just from inside the cluster. Check the following:
  1. Endpoint reachability. Pre-signed URLs are generated against s3.publicEndpoint when set, otherwise s3.endpoint. If your storage is reached through a private or in-cluster address, set s3.publicEndpoint to an HTTPS URL your clients can reach, and keep s3.endpoint on the private address for server-side traffic. Browsers must also trust the certificate on that public endpoint.
  2. Bucket CORS (S3-compatible storage only). Browsers call the pre-signed URLs cross-origin. The bucket must allow GET, PUT, and POST from your users’ origins, and allow all request headers. Expose at least the ETag, Content-Encoding, and Content-Length response headers. ETag is required: the upload flow reports it back to the server to complete a publish. Azure Blob Storage needs no manual setup; the server configures the service’s CORS rules at startup.
To verify, publish a model from a connector and open it in the viewer from a machine outside your network. If the publish stalls after the file is prepared, or the viewer shows an empty scene while the browser console logs blocked or failing storage requests, revisit the two points above.

Preview rendering

The preview service renders on the CPU by default (via SwiftShader), so it works on clusters without GPUs. CPU rendering is markedly slower than a GPU and may struggle on very large models; give the preview pods 1 to 3 CPUs and 2 to 4Gi memory. To render previews on a GPU instead:
  • Use passthrough NVIDIA GPUs only (never vGPU), driver 515.48.07 or newer, with nvidia-drm modeset=1.
  • Set preview_service.webgpu.requireHardwareAdapter: true and reserve the GPU via the preview pod resources. With the flag on, a pod that cannot see a hardware adapter fails readiness loudly instead of silently falling back to slow CPU rendering.

(Optional) Microsoft Azure Blob Storage support

In addition to S3 compatible blob storage supported by the open source Speckle server, the Enterprise licensed Speckle server supports also supports Azure Blob Storage. To use Azure Blob Storage with Speckle Enterprise Server, you will need to update your Helm values.yaml file to include the necessary configuration details for your Azure Blob Storage account. This includes setting the provider to ‘azure’ and providing the endpoint URL, bucket name, and access key for your Azure Blob Storage account.
The secret access key for Azure Blob Storage should be stored in a Kubernetes secret, named server-vars with the property s3_secret_key, similar to the instructions for setting up S3 compatible blob storage in our Kubernetes deployment guide.

Upgrade notes

Upgrades between release lines from 2026.7 onwards are documented in the self-hosted upgrade guide, one page per release. Read the guide before every upgrade: releases must be applied in order, and 2026.9 has no downgrade path.

Upgrading to 3.0.21

  • If you have enabled the Ingress, you will first need to delete all Ingress resources in your namespace before upgrading to version 3.0.21. This is because we have changed the Ingress controller in a way which does not allow for in-place patching during the upgrade process.
Last modified on September 13, 2026