Skip to main content

☰ Required Configuration

The deployments relies on environment variables read from your shell. This table details those environment variables by alphabetical order.

For autoscaling/cluster actuation, the Operator consumes cloud credentials from the Operator release values. With Plane deployment (plane up datalayer-operator), the credentials are now injected through an Operator Helm-managed Secret (datalayer-operator-cloud-credentials) and consumed by the Operator Pod. When you run plane down datalayer-operator, Helm removes that Secret with the release resources.

VariableDescription
AWS_ACCESS_KEY_IDSet the access key that gives access to the S3 bucket for the backups.
AWS_DEFAULT_PROFILESet the default profile that gives access to the S3 bucket for the backups.
AWS_DEFAULT_REGIONSet the defaul region that gives access to the S3 bucket for the backups.
AWS_REGIONSet the region of the S3 bucket for the backups.
AWS_SECRET_ACCESS_KEYSet the secret key that gives access to the S3 bucket for the backups.
AZURE_TENANT_IDAzure tenant identifier used by Operator cloud actuation and cloud APIs.
AZURE_CLIENT_IDAzure application/service principal client identifier for Operator cloud actuation.
AZURE_CLIENT_SECRETAzure application/service principal secret for Operator cloud actuation.
AZURE_SUBSCRIPTION_IDAzure subscription identifier targeted by Operator scaling actions.
AZURE_RESOURCE_GROUPAzure resource group name where scaling resources are provisioned/managed.
DATALAYER_CLOUD_PROVIDERCloud provider used by the Operator scaling executor (aws or azure).
DATALAYER_CLOUDER_URLBase URL for Clouder API when Operator executes scaling through API mode.
DATALAYER_AUTHZ_ENGINEType of Authorization engine to use - possible value: none | openfga - default is openfga.
DATALAYER_CLUSTER_TYPEThe Kubernetes cluster type (this is only needed for advanced cases).

Possible values are eks or ovh.
DATALAYER_CREDITS_PROVIDERA string that defines up the addon providing the credits method within IAM for billing and usage.
DATALAYER_DOCKER_REGISTRY_HOSTHostname of the OCI Registry that contains the Docker Images.
DATALAYER_DOCKER_REGISTRYFull name of the OCI Registry that contains the Docker Images, e.g $DATALAYER_DOCKER_REGISTRY_HOST/datalayer
DATALAYER_DOCKER_REGISTRY_USERNAMEUsername of the OCI Registry that contains the Docker Images.
DATALAYER_DOCKER_REGISTRY_PASSWORDPassword of the OCI Registry that contains the Docker Images.
DATALAYER_GITHUB_CLIENT_IDIf you enable authentication via GitHub, define the client id of the GitHub Application.
DATALAYER_GITHUB_CLIENT_SECRETIf you enable authentication via GitHub, define the client secret of the GitHub Application
DATALAYER_GRAFANA_ADMIN_PWDDefine the password for the Grafana service.
DATALAYER_HELM_REGISTRY_HOSTHostname of the OCI Registry that contains the Helm Charts.
DATALAYER_HELM_REGISTRYFull name of the OCI Registry that contains the Helm Charts, e.g $DATALAYER_HELM_REGISTRY_HOST/datalayer-charts
DATALAYER_HELM_REGISTRY_USERNAMEUsername of the OCI Registry that contains the Helm Charts.
DATALAYER_HELM_REGISTRY_PASSWORDPassword of the OCI Registry that contains the Helm Charts.
DATALAYER_JWT_ISSUERIf you enable authentication via JSON Web Token (JWT), define the JWT issuer.

e.g. https://dev.datalayer.io
DATALAYER_JWT_SECRETIf you enable authentication via JSON Web Token (JWT), define the JWT secret.
DATALAYER_JWT_ALGORITHMIf you enable authentication via JSON Web Token (JWT), define the JWT issuer.

e.g. HS256
DATALAYER_JWT_ALLOWED_ISSUERSIf you enable authentication via JSON Web Token (JWT), define the JWT allowed issuers.

e.g. https://id.your-company.cloud
DATALAYER_JWT_DEFAULT_KID_ISSUERIf you enable authentication via JSON Web Token (JWT), define the JWT default key ID issuer.

e.g. https://your-company.cloud/api/iam/v1/api-keys
DATALAYER_JWT_SKIP_3RD_TOKEN_SIGNATURE_VERIFICATIONIf you enable authentication via JSON Web Token (JWT), define the JWT signature should be verified.

Set true or false.
DATALAYER_CERT_ISSUERThe issuer for the certificates, e.g. letsencrypt or letsencrypt-prod.
DATALAYER_INGRESS_CLASS_NAMEThe Ingress class name for the Operator, e.g. datalayer-traefik or nginx.
DATALAYER_IAM_API_KEYKey used to protect the internal Kubernetes cluster communications.
DATALAYER_IAM_HOSTIAM internal Kubernetes service hostname + port.
DATALAYER_OPENFGA_REST_URL
DATALAYER_OPENFGA_STORE_ID
DATALAYER_OPENFGA_AUTHZ_MODEL_ID
DATALAYER_OPERATOR_API_KEYSet a secret to secure the internal connexions between the services.
DATALAYER_PUBSUB_ENGINEType of Pub/Sub engine to use - possible value: none | pulsar - default is pulsar.
DATALAYER_PULSAR_URLInternal URL to pulsar broker e.g. pulsar://datalayer-pulsar-broker.datalayer-pulsar.svc.cluster.local:6650.
DATALAYER_USERS_PVC_NAMEName of the permanent volume claim for user storage.
DATALAYER_VAULT_URLInternal URL to the Vault service.
DATALAYER_VAULT_TOKENToken to access the Vault service.
DATALAYER_RUN_URLThe hostname of the public-facing services. You will need to update your DNS system to point the Load Balancer IP address to the hostname of the URL.

The Load Balancer is created by the Ingress service.

SSL certificates will be created by the cert-manager service for that hostname.
DATALAYER_RUNTIME_ENVdev, qa or prod
DATALAYER_SMTP_HOSTDefine the SMTP server hostname for email communications.
DATALAYER_SMTP_PORTDefine the SMTP server port number for email communications.
DATALAYER_SMTP_USERNAMEDefine the SMTP server username for email communications.
DATALAYER_SMTP_PASSWORDDefine the SMTP server password for email communications.
DATALAYER_SOLR_USERNAMEDefine the username to protect Solr.
DATALAYER_SOLR_PASSWORDDefine the password to protect Solr.
DATALAYER_SOLR_BACKUP_S3_BUCKET_NAMEDefine the S3 bucket name for the Solr backups.
DATALAYER_SOLR_BACKUP_S3_BUCKET_REGIONDefine the S3 bucket region for the Solr backups.
DATALAYER_CONTENTS_API_PORTContents REST port. The chart default is 9400.
DATALAYER_CONTENTS_FLIGHT_PORTContents Arrow Flight port. The chart default is 9401.
DATALAYER_CONTENTS_BRIDGE_PORTContents local-bridge relay port. The chart default is 9402.
DATALAYER_CONTENTS_REQUIRE_SOLRWhen true, Contents readiness fails until Solr is reachable.
DATALAYER_CONTENTS_REQUIRE_VAULTWhen true, Contents readiness fails until Vault is reachable.
DATALAYER_CONTENTS_DEPENDENCY_TIMEOUT_SECONDSTimeout in seconds for each Contents readiness dependency probe.
DATALAYER_SOLR_ZK_HOSTZooKeeper ensemble the Solr data-access layer connects through. Required by every Solr-backed service, including the Contents API and worker.
DATALAYER_SOLR_URLInternal Solr HTTP endpoint polled by readiness probes. It does not replace DATALAYER_SOLR_ZK_HOST.
DATALAYER_SUPPORT_EMAILDefine the email for support communications.
e.g. support@your-company.io
KUBECONFIGThe path to your Kubeconfig file.
DATALAYER_OPENAI_API_VERSION
DATALAYER_AZURE_OPENAI_CHAT_COMPLETION_ENDPOINT
DATALAYER_AZURE_OPENAI_API_KEY
OTEL_SDK_DISABLEDDisable OpenTelemetry instrumentation on service and use non-enriched logs (no metadata) [true or false].
OTEL_EXPORTER_OTLP_METRICS_ENDPOINTURL for exporting services metrics and traces to opentelemetry collector.
OTEL_EXPORTER_OTLP_TRACES_ENDPOINTURL for exporting services metrics and traces to opentelemetry collector.

Contents and Solr recovery settings

Deploy Contents with the standard IAM JWT, Solr, Vault and OpenTelemetry settings above. Supply passwords, signing material and provider credentials through Kubernetes Secrets or an external secret controller; do not commit them to Helm values.

Solr backup storage is selected by DATALAYER_SOLR_BACKUP_S3_BUCKET_NAME, DATALAYER_SOLR_BACKUP_S3_BUCKET_REGION and the AWS workload identity or credential secret. Recurrence and retention are declarative fields in the checked-in backup specifications: spec.recurrence.schedule and spec.recurrence.maxSaved. Review them together with object-store versioning and Vault retention before applying a production schedule.

See Datalayer Contents, Solr and Continuity.

Node Mount Gateway settings

The Node Mount Gateway binds home folders into runtime Pods that are already running, so a launch that mounts the Home Folder is served from the prewarmed pool instead of a cold Pod. It is off by default and has two halves, which are turned on in this order:

SettingWhereMeaning
nodeMountGateway.enabled, nodeMountGateway.sharedFilesystemClaimdatalayer-node-mounts chartRun the node agent and name the RWX claim it binds from. Installing the chart with the first and not the second fails.
DATALAYER_NODE_MOUNT_GATEWAY_ENABLEDdatalayer-operator, and plane upGive pooled Pods the gateway volume and serve Home Folder launches from the pool. up.sh reads the same variable to set nodeMountGateway.enabled on the chart, so one export turns on both halves.
DATALAYER_SHARED_FS_VOLUME_CLAIM_NAMEplane upThe claim up.sh passes as nodeMountGateway.sharedFilesystemClaim. Asking for the gateway without it fails the deploy rather than installing an agent with nothing to bind.
DATALAYER_NODE_MOUNT_GATEWAY_READY_TIMEOUT_SECONDSdatalayer-operatorHow long a launch waits for the node agent to confirm the mounts (default 20).
DATALAYER_NODE_MOUNT_GATEWAY_MAX_MOUNTS_PER_PODdatalayer-operatorThe most folders one sandbox may be granted (default 32).
nodeMountGateway.maxMountsPerNodedatalayer-node-mounts chartThe most the node agent will hold at once (default 512).
apiServer.cidrdatalayer-node-mounts chart, or DATALAYER_KUBERNETES_API_SERVER_CIDR for plane upThe control-plane address the agent's NetworkPolicy allows. The Pod watch is the agent's only input; without this egress it mounts nothing.

Each mount kind is a switch of its own, off unless asked for, and each has a variable plane up reads:

SettingVariableServes
nodeMountGateway.credentialsDATALAYER_NODE_MOUNT_GATEWAY_CREDENTIALSNothing on its own: it lets the agent read a Secret a grant names, which the three below need. It is never implied by asking for a mount kind — reading a Secret is the one thing the agent does that its RBAC would otherwise forbid
nodeMountGateway.bucketsDATALAYER_NODE_MOUNT_GATEWAY_BUCKETScloud-storage grants, through Mountpoint for S3
nodeMountGateway.localBridgesDATALAYER_NODE_MOUNT_GATEWAY_LOCAL_BRIDGESlocal-bridge grants: a person's own folder into a running sandbox
nodeMountGateway.repositoriesDATALAYER_NODE_MOUNT_GATEWAY_REPOSITORIESgit grants: a pinned commit checked out on the node. A public repository needs no credential

A grant of a kind whose switch is off is refused with a reason the user sees, not silently skipped — see what it can mount.

Deploy the node agent first. With the Operator setting on and no agent, pooled Pods carry the volume and wait for mounts nobody makes. The nodes must also have shared mount propagation on the kubelet directory (findmnt -no PROPAGATION --target /var/lib/kubelet); without it a grant succeeds on the node and is invisible in the sandbox.

tip

Use any of the following command to generate tokens.

TOKEN=$(openssl rand -hex 32)
TOKEN=$(python -c "import secrets; print(secrets.token_hex(32))")

Jupyter MCP Server gateway settings

The Jupyter MCP Server gateway reads the standard IAM JWT, Solr and OpenTelemetry settings above, plus the following. Only DATALAYER_JUPYTER_MCP_SERVER_URL and the URLs of its dependencies are normally exported for a deployment; the rest are chart values with working defaults. Supply DATALAYER_IAM_API_KEY, DATALAYER_JWT_SECRET and the Solr password through Kubernetes Secrets (jupyterMcpServer.envValueFrom), never in Helm values.

VariableDefaultDescription
DATALAYER_JUPYTER_MCP_SERVER_URLhttps://mcp.datalayer.run/mcpThe resource identifier of the gateway: what a token's aud must name, what the RFC 9728 protected-resource metadata publishes, and what the ingress host is derived from. IAM must be deployed with the same value, since it stamps it into the audience of every OAuth token
DATALAYER_JUPYTER_MCP_VERIFY_AUDIENCEtrueRefuse a token issued for another resource. Off only for a local run against a token minted before the resource URL was settled
DATALAYER_IAM_URLThe authorization server. Required; gates readiness
DATALAYER_IAM_API_KEYProves to IAM that the gateway is a Datalayer service, which is what lets it exchange a caller's gateway token (RFC 8693) for one the rest of the platform accepts. Without it, OAuth callers reach nothing. DATALAYER_OPERATOR_API_KEY is accepted as a fallback
DATALAYER_SPACER_URLDATALAYER_IAM_URLWhere notebooks and their permissions live
DATALAYER_RUNTIMES_URLDATALAYER_IAM_URLWhere a sandbox is asked for; provider-neutral
DATALAYER_CONTENTS_URLWhere Contents runs: the runtimes plane, at its own public URL (https://r1.datalayer.run), never an assumed same-cluster service name. No fallback, and a value equal to DATALAYER_IAM_URL is reported as a misconfiguration
DATALAYER_AI_AGENTS_URLDATALAYER_IAM_URLWhere the gateway posts best-effort activity events for the feed
DATALAYER_MCP_STORESolr when DATALAYER_SOLR_ZK_HOST is set, else memoryWhich store holds handles, the worker directory and rate windows. solr in a cluster; memory only for a single local process. Any other value refuses to start
DATALAYER_SANDBOX_ENVIRONMENTai-agents-envThe Datalayer environment a sandbox is launched into. Set it where a cluster offers different ones, such as a GPU environment
DATALAYER_MCP_MAX_WORKERS50The most per-user worker processes one replica runs at once — the density limit of a replica. Capacity is added by adding pods
DATALAYER_MCP_WORKER_IDLE_TIMEOUT900Seconds a worker may sit unused before it is reclaimed. A worker whose session has a task working is never idle
DATALAYER_MCP_WORKER_START_TIMEOUT30Seconds to wait for a new worker to answer before giving up and quoting its last output
DATALAYER_MCP_WORKER_ENTRY_TTL_SECONDS180Seconds a worker-directory entry lives after its last heartbeat, so a replica that is gone stops being forwarded to
DATALAYER_MCP_REPLICA_ADDRESShttp://$POD_IP:4404, else loopbackThe address other replicas forward to. Set this, or give the pod POD_IP through the downward API, or cross-replica forwarding never leaves the pod
DATALAYER_MCP_BINDING_TTL_SECONDS86400Seconds a handle lives after it was last used; refreshed on every use
DATALAYER_MCP_CALLS_PER_MINUTE_PER_USER300Tool calls one user may make in a minute; 0 no limit. Counted in Solr so the limit holds across replicas
DATALAYER_MCP_CALLS_PER_MINUTE_PER_AGENT120The same, per OAuth client_id
DATALAYER_MCP_DEPENDENCY_TIMEOUT10Seconds a call to a platform dependency may take before it is a timeout
JUPYTER_MCP_TOKEN_VERIFIER_CLASSdatalayer_jupyter_mcp_server.verifier:DatalayerTokenVerifierHow the worker authenticates clients: Datalayer's own verifier, which accepts OAuth access tokens and personal access tokens
DATALAYER_MCP_LOG_COLORtrueWhether the request log is coloured; NO_COLOR also turns it off
PORT4404The port the gateway listens on inside the pod; must agree with jupyterMcpServer.port

See Datalayer Jupyter MCP Server for the scaling values, the drain and the three Solr collections the gateway owns, and Continuity for the mcp recovery unit.

Minimal Configuration

The minimal setup for IAM, Runtimes, and Operator is listed here with example values.

Create a ~/.datalayer/datalayerrc and source that file from ~/.bash_profile or similar based on your shell.

#!/usr/bin/env bash

# ~/.datalayer/datalayerrc

export DATALAYER_AUTHZ_ENGINE="none"
export DATALAYER_CDN_URL="https://datalayer.io"
export DATALAYER_CLUSTER_NAME="my-cluster"
export DATALAYER_CLUSTER_TYPE="eks"
export DATALAYER_CREDITS_PROVIDER="stripe"
export DATALAYER_DOCKER_REGISTRY="${DATALAYER_DOCKER_REGISTRY_HOST}/datalayer"
export DATALAYER_DOCKER_REGISTRY_HOST="my-registry.net"
export DATALAYER_DOCKER_REGISTRY_PASSWORD="..."
export DATALAYER_DOCKER_REGISTRY_USERNAME="..."
export DATALAYER_HELM_REGISTRY="${DATALAYER_HELM_REGISTRY_HOST}/datalayer-charts"
export DATALAYER_HELM_REGISTRY_HOST="my-registry.net"
export DATALAYER_HELM_REGISTRY_PASSWORD="..."
export DATALAYER_HELM_REGISTRY_USERNAME="..."
export DATALAYER_IAM_API_KEY="..."
export DATALAYER_INITIAL_USER_CREDITS=10
export DATALAYER_JWT_ALGORITHM="HS256"
export DATALAYER_JWT_ALLOWED_ISSUERS="https://my-id.datalayer.run"
export DATALAYER_JWT_ISSUER="https://my-id.datalayer.run"
export DATALAYER_JWT_SECRET="..."
export DATALAYER_JWT_SKIP_EXTERNAL_TOKEN_SIGNATURE_VERIFICATION=false
export DATALAYER_OPERATOR_API_KEY="..."
export DATALAYER_PUBSUB_ENGINE="none"
export DATALAYER_RUNTIME_ENV="prod"
export DATALAYER_RUN_URL=https://my-cluster.datalayer.run
export DATALAYER_SOLR_PASSWORD="..."
export DATALAYER_SOLR_USERNAME="admin"
export KUBECONFIG="~/.datalayer/my-cluster.yaml"
export OTEL_SDK_DISABLED=true
source ~/.datalayer/datalayerrc

Stripe Addon

The configuration for the Stripe Addon is listed here.

VariableDescription
DATALAYER_STRIPE_API_KEYPrivate Stripe API key.
DATALAYER_STRIPE_CHECKOUT_ROUTEUI checkout route (default: checkout).
DATALAYER_STRIPE_JS_API_KEYPublic Stripe API key.
DATALAYER_STRIPE_TOPUP_PRODUCT_IDStripe product ID for one-time top-up prices.
DATALAYER_STRIPE_SUBSCRIPTION_PRODUCT_IDStripe product ID for monthly subscription plans required for top-up eligibility.
DATALAYER_STRIPE_WEBHOOK_SECRETStripe webhook secret.
DATALAYER_STRIPE_CUST_PORTAL_IDStripe Billing Portal configuration ID.
DATALAYER_STRIPE_CUST_PORTAL_URLStripe Billing Portal URL.