Deploying the WDS API Server with a Helm Chart

The WDS API Server can be deployed with the WDS Helm Chart to a Kubernetes cluster.

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.

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 the repository (if using a remote repository)
helm repo add webdatasource https://github.com/webdatasource/wds.helm

# Update your local repository cache
helm repo update

# Install the chart
helm install 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:

# MongoDB connection string and license key for WDS API Server deployment
variable "mongodb_connection_string" {
  type      = string
  sensitive = true
}

# License key for WDS API Server deployment in MultiService mode
variable "license_key" {
  type      = string
  sensitive = true
}

# Docker registry of WDS API Server service images
variable "registry" {
  type    = string
  default = "docker.io"
}

# Helm chart version for WDS API Server deployment
variable "helm_chart_version" {
  type    = string
  default = "1.0.0"
}

# Namespace and ingress configuration for WDS API Server deployment
# Set `create_namespace` to false to deploy in an existing namespace
variable "create_namespace" {
  type    = bool
  default = true
}

# Namespace for WDS API Server deployment
variable "namespace" {
  type    = string
  default = "webdatasource"
}

# Enable or disable ingress for WDS API Server deployment
variable "enable_ingress" {
  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
          annotations = {
            # To stick MCP client sessions to the same pod. Otherwise, they may get 404 errors. 
            # If an ingress controller other than nginx is used, the annotation key needs to be changed accordingly.
            "nginx.ingress.kubernetes.io/upstream-hash-by" = "Mcp-Session-Id"
          }
        }
      }
    }),
    sensitive(yamlencode({
      global = {
        coreServices = {
          databases = {
            mongodb = {
              connectionString = var.mongodb_connection_string
            }
          }
          license = {
            key = var.license_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.mode Deployment mode: SingleService or MultiService. Default: SingleService
global.coreServices.license.key Required for MultiService mode. License key. See Plans
global.coreServices.cache.connectionString Cache connection string (used only in MultiService mode; defaults to MongoDB)
global.coreServices.jobTypes List of available job types
global.coreServices.externalIpConfigs List of external IP configs
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.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: /

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

Please rotate your device to landscape mode

This documentation is specifically designed with a wider layout to provide a better reading experience for code examples, tables, and diagrams.
Rotating your device horizontally ensures you can see everything clearly without excessive scrolling or resizing.

Return to Web Data Source Home