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
/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