Deploying the WDS API Server with a Helm Chart
Deploy to Kubernetes using the WDS Helm Chart — suitable for staging and production with scaling and resilience.
By default, the Helm chart is configured to deploy the WDS API Server in SingleService mode — deploying one instance of the Solidstack service. Only one configuration parameter is required: a MongoDB connection string. Kindly review the Third-Party Components for compatible versions.
To deploy WDS API Server in MultiService mode, a license key is required. Contact us for a license key.
If you find an error in the Helm chart (or in the WDS API Server itself), or if you have specific requirements that need to be added to the Helm chart, kindly use the Issues.
Deployment options
There are several ways to deploy the WDS Helm Chart.
Deploying using Helm CLI
To deploy the WDS API Server using the Helm CLI, run the following commands:
IMPORTANT! Ensure you have access to a Kubernetes cluster.
# Add a repository
helm repo add webdatasource https://webdatasource.github.io/wds.helm
# Update your local repository cache
helm repo update
# Search for the chart to verify it's available
helm search repo webdatasource --version 1.3.0
# Install the chart
helm install wds-server --version 1.3.0 webdatasource/wds-helm-chart \
--namespace webdatasource --create-namespace \
--set global.registry="docker.io" \
--set global.coreServices.databases.mongodb.connectionString="mongodb+srv://<user>:<password>@<host>/WebDataSource?appName=<cluster>&readPreference=secondary"
Deploying using Terraform
IMPORTANT! Ensure you have helm provider configured in your terraform project.
Minimal Terraform configuration to deploy WDS API Server:
variable "mongodb_connection_string" {
description = "MongoDB connection string"
type = string
sensitive = true
}
variable "registry" {
description = "Docker registry of WDS API Server service images"
type = string
default = "docker.io"
}
variable "helm_chart_version" {
description = "Helm chart version for WDS API Server deployment"
type = string
default = "1.3.0"
}
variable "create_namespace" {
description = "Namespace and ingress configuration for WDS API Server deployment. Set `create_namespace` to false to deploy in an existing namespace"
type = bool
default = true
}
variable "namespace" {
description = "Namespace for WDS API Server deployment"
type = string
default = "webdatasource"
}
variable "enable_ingress" {
description = "Enable or disable ingress for WDS API Server deployment"
type = bool
default = true
}
# Kubernetes namespace resource
resource "kubernetes_namespace" "webdatasource" {
count = var.create_namespace ? 1 : 0
metadata {
name = var.namespace
}
}
# Helm release resource
resource "helm_release" "wds-server" {
name = "wds-server"
repository = "https://webdatasource.github.io/wds.helm"
chart = "wds-helm-chart"
version = var.helm_chart_version
namespace = var.namespace
create_namespace = false
values = [
yamlencode({
global = {
registry = var.registry
ingress = {
enabled = var.enable_ingress
}
}
}),
sensitive(yamlencode({
global = {
coreServices = {
databases = {
mongodb = {
connectionString = var.mongodb_connection_string
}
}
}
}
}))
]
depends_on = [
kubernetes_namespace.webdatasource
]
}
Terraform configuration to deploy WDS API Server in the MultiService mode with Retrieval:
variable "license_key" {
description = "WebDataSource license key"
type = string
sensitive = true
}
variable "embedding_service_url" {
description = "Embedding service URL"
type = string
}
variable "embedding_service_api_key" {
description = "Embedding service API key"
type = string
sensitive = true
default = ""
}
variable "mongodb_connection_string" {
description = "MongoDB connection string"
type = string
sensitive = true
}
variable "registry" {
description = "Docker registry of WDS API Server service images"
type = string
default = "docker.io"
}
variable "helm_chart_version" {
description = "Helm chart version for WDS API Server deployment"
type = string
default = "1.3.0"
}
variable "create_namespace" {
description = "Namespace and ingress configuration for WDS API Server deployment. Set `create_namespace` to false to deploy in an existing namespace"
type = bool
default = true
}
variable "namespace" {
description = "Namespace for WDS API Server deployment"
type = string
default = "webdatasource"
}
variable "enable_ingress" {
description = "Enable or disable ingress for WDS API Server deployment"
type = bool
default = true
}
# Kubernetes namespace resource
resource "kubernetes_namespace" "webdatasource" {
count = var.create_namespace ? 1 : 0
metadata {
name = var.namespace
}
}
# Helm release resource
resource "helm_release" "wds-server" {
name = "wds-server"
repository = "https://webdatasource.github.io/wds.helm"
chart = "wds-helm-chart"
version = var.helm_chart_version
namespace = var.namespace
create_namespace = false
values = [
yamlencode({
global = {
registry = var.registry
ingress = {
enabled = var.enable_ingress
}
coreServices = {
mode = "MultiService"
search = {
enabled = true
embeddingService = {
url = var.embedding_service_url
}
}
}
}
}),
sensitive(yamlencode({
global = {
coreServices = {
license = {
key = var.license_key
}
databases = {
mongodb = {
connectionString = var.mongodb_connection_string
}
}
search = {
embeddingService = {
apiKey = var.embedding_service_api_key
}
}
}
}
}))
]
depends_on = [
kubernetes_namespace.webdatasource
]
}
NOTE This code can be used to create a dedicated Terraform Module for WDS API Server.
Configuration
The following configuration parameters can be set via the values.yaml file:
| Path | Description |
|---|---|
| global.coreServices.databases.mongodb.connectionString | Required Always. MongoDB connection string |
| global.coreServices.databases.mongodb.connectionStringSecretRef | Reference to a Kubernetes Secret that contains the MongoDB connection string |
| global.coreServices.databases.mongodb.databaseName | MongoDB database name. Default: WebDataSource. If not set, the name from the connection string is used |
| global.coreServices.mode | Deployment mode: SingleService or MultiService. Default: SingleService. MultiService is available starting from the Business Plan |
| global.coreServices.license.key | License key is required starting from the Business Plan |
| global.coreServices.license.keySecretRef | Reference to a Kubernetes Secret that contains the license key |
| global.coreServices.cache.connectionString | Cache connection string. This feature is available starting from the Business Plan |
| global.coreServices.cache.connectionStringSecretRef | Reference to a Kubernetes Secret that contains the cache connection string |
| global.coreServices.cache.databaseName | Cache database name (when a DB is used for caching). If not set, the name from the connection string is used |
| global.coreServices.jobTypes | List of available job types |
| global.coreServices.externalIpConfigs | List of external IP configs |
| global.coreServices.search.enabled | Enable Search. Default: false |
| global.coreServices.search.mode | Search mode. Supported modes: FullText, Vector, FullTextAndVector. Default: FullText |
| global.coreServices.search.database.connectionString | Connection string of the search database. If not set, the retriever service’s MongoDB connection string is used (must be MongoDB Atlas/Enterprise) |
| global.coreServices.search.database.connectionStringSecretRef | Reference to a Kubernetes Secret that contains the search database connection string |
| global.coreServices.search.database.databaseName | Search database name. Default: WebDataSource. If not set, the name from the connection string is used |
| global.coreServices.search.embeddingService.url | Embedding service URL |
| global.coreServices.search.embeddingService.apiKey | Embedding service API key |
| global.coreServices.search.embeddingService.urlSecretRef | Reference to a Kubernetes Secret that contains the embedding service URL |
| global.coreServices.search.embeddingService.apiKeySecretRef | Reference to a Kubernetes Secret that contains the embedding service API key |
| global.coreServices.search.embeddingService.dimentionsCount | Embedding vector dimensions count. Default: 768 |
| global.coreServices.search.embeddingService.requestTemplate | JSON request template for the external embedding service. Default (internal provider): { 'model': 'embeddinggemma', 'input': null } |
| global.coreServices.search.embeddingService.contentJsonPath | JSONPath to inject the content array into an embedding request. Default (internal provider): $.input |
| global.coreServices.search.embeddingService.resultJsonPath | JSONPath to extract the embeddings array from the response. Default (internal provider): $.embeddings |
| global.coreServices.exceptionResponseDelayMs | Delay before responding with HTTP error (ms). Default: 1000 |
| global.coreServices.maxInactiveSecToReregistrar | Max inactive seconds to re-register crawler. Default: 60 |
| global.auxiliaryServices.docs.enabled | Deploy docs service |
| global.auxiliaryServices.docs.defaultTag | Default docs image tag. Default: v2.0 |
| global.auxiliaryServices.playground.enabled | Deploy playground service |
| global.minLogLevel | Minimum log level. Values: Trace, Debug, Information, Warning, Error, Critical |
| global.registry | Docker registry for all images. Default: docker.io |
| global.resources.requests | Default CPU resources request per pod. Default: CPU: 100m; RAM: 256Mi |
| global.deploymentExtraLabels | Extra labels for all deployments |
| global.serviceExtraLabels | Extra labels for all services |
| global.nodeSelector | Default nodeSelector for all pods |
| global.tolerations | Default tolerations for all pods |
| global.affinity | Default affinity rules for all pods |
| global.ingress.enabled | Enable ingress |
| global.ingress.className | Ingress class name. If is omitted, a default Ingress class should be defined. Default: nginx |
| global.ingress.annotations | Ingress annotations |
| global.ingress.basePath | Base path for all services. Default: / |
| global.hpa.enabled | Enable HorizontalPodAutoscaler globally. Default: true |
| global.hpa.minReplicas | Default minimum replicas for services with HPA enabled. Default: 1 |
| global.hpa.maxReplicas | Default maximum replicas for services with HPA enabled. Default: 3 |
| global.hpa.targetCPUUtilizationPercentage | Target average CPU utilization percentage for scaling. Default: 80 |
| global.hpa.targetMemoryUtilizationPercentage | Target average Memory utilization percentage. Default: null (disabled) |
| global.pdb.enabled | Enable Pod Disruption Budgets globally. Default: true |
| global.pdb.minAvailable | Default minAvailable for PDBs. Default: 1 |
| global.pdb.maxUnavailable | Default maxUnavailable for PDBs. Default: null (unset) |
coreServices and auxiliaryServices sections in the values file can be used to override the global configuration for a particular service.
Accessing the WDS API Server instance
When the helm release has been deployed to a Kubernetes cluster, use the following command to get access URLs:
NAMESPACE=webdatasource # Change the namespce if necessary
SCHEME=$(kubectl get ing webdatasource -n $NAMESPACE -o jsonpath='{.spec.tls[0].hosts[0]}')
SCHEME=$([ -n "$SCHEME" ] && echo https || echo http)
HOST=$(kubectl get ing webdatasource -n $NAMESPACE -o jsonpath='{.spec.rules[0].host}')
if [ -z "$HOST" ]; then
HOST=$(kubectl get ing webdatasource -n $NAMESPACE -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
[ -z "$HOST" ] && HOST=$(kubectl get ing webdatasource -n $NAMESPACE -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
[ -z "$HOST" ] && HOST=localhost
fi
echo
kubectl get ing webdatasource -n $NAMESPACE -o jsonpath='{range .spec.rules[*].http.paths[*]}{.path}/{"\n"}{end}' | awk -v s="$SCHEME" -v h="$HOST" '{print s"://"h $0}'
The result should look like this:
http(s)://[your-host]/playground/
http(s)://[your-host]/docs/
http(s)://[your-host]/api/
http(s)://[your-host]/mcp/
/playground/is used to access Playground/docs/is used to access Docs/mcp/is used to acceess MCP Server/api/is used by MS SQL CRL Functions