With Offline License Server
| Enterprise | ||||
|---|---|---|---|---|
| Available in these plans | Free | Dev | Prod | Scale |
| Air-Gapped Mode | Add-On | Add-On | Add-On | |
This guide explains how to deploy the offline license server and expose it through an ingress. It also covers configuring vCluster Platform with LICENSE_SERVER and exporting usage data.
Overview
The offline license server runs inside your cluster and handles license validation locally. Use this approach instead of an offline license key when you need:
- Usage tracking and data export
- A dedicated in-cluster service for license validation without external connectivity
The license server stores state in PostgreSQL (embedded or external) and exposes a /license/v2 API endpoint that vCluster Platform calls for license checks.
Prerequisites
- Kubernetes 1.28+
- Helm 3+
- An offline license key provided by vCluster Labs
Deploy the license server
- Embedded PostgreSQL
- External PostgreSQL
Use this option to run PostgreSQL as part of the Helm deployment. For production deployments, use an externally managed PostgreSQL.
kubectl create namespace license-server
kubectl create secret generic license-server-config \
--namespace license-server \
--from-literal=postgres-password='my-password' \
--from-literal=static-api-key='<your-static-api-key>' \
--from-literal=offline-license-key='<your-offline-license-key>'
helm install license-server license-server \
--repo https://charts.loft.sh \
--namespace license-server \
--set postgresql.enabled=true \
--set existingSecret=license-server-config
Use this option if your environment already provides PostgreSQL.
kubectl create namespace license-server
kubectl create secret generic license-server-config \
--namespace license-server \
--from-literal=postgres-dsn='postgres://<user>:<password>@<host>:5432/license_server?sslmode=require' \
--from-literal=static-api-key='<your-static-api-key>' \
--from-literal=offline-license-key='<your-offline-license-key>'
helm install license-server license-server \
--repo https://charts.loft.sh \
--namespace license-server \
--set postgresql.enabled=false \
--set existingSecret=license-server-config
<your-static-api-key> can be any value you choose. It's used to export usage data later.
License server endpoint
The license server API base path is /license/v2.
Use one of these endpoint styles depending on your network setup:
- In-cluster:
http://license-server.license-server.svc.cluster.local/license/v2 - Ingress or load balancer:
https://<license-server-host>/license/v2
Expose the license server via ingress
If the platform doesn't run in the same Kubernetes cluster as the license server, or you want a stable DNS endpoint, expose the license server through an ingress.
- Ingress
- Ingress with TLS
helm install license-server license-server \
--repo https://charts.loft.sh \
--namespace license-server \
--set postgresql.enabled=true \
--set existingSecret=license-server-config \
--set ingress.enabled=true \
--set ingress.className=nginx \
--set ingress.hosts[0].host=license-server.example.com \
--set ingress.hosts[0].paths[0].path=/ \
--set ingress.hosts[0].paths[0].pathType=Prefix
Your platform should target:
http://license-server.example.com/license/v2orhttps://license-server.example.com/license/v2(based on your ingress setup)
helm install license-server license-server \
--repo https://charts.loft.sh \
--namespace license-server \
--set postgresql.enabled=true \
--set existingSecret=license-server-config \
--set ingress.enabled=true \
--set ingress.className=nginx \
--set ingress.hosts[0].host=license-server.example.com \
--set ingress.hosts[0].paths[0].path=/ \
--set ingress.hosts[0].paths[0].pathType=Prefix \
--set ingress.tls[0].secretName=license-server-tls \
--set ingress.tls[0].hosts[0]=license-server.example.com
Your platform should target:
https://license-server.example.com/license/v2
Configure vCluster Platform to use the offline license server
Set the platform environment variable LICENSE_SERVER to your license server base URL including /license/v2.
env:
LICENSE_SERVER: "https://license-server.example.com/license/v2"
If the platform can reach the service directly in-cluster:
env:
LICENSE_SERVER: "http://license-server.license-server.svc.cluster.local/license/v2"
If your license server endpoint uses a self-signed certificate, set insecureSkipVerify: true in the platform Helm values:
env:
LICENSE_SERVER: "https://license-server.example.com/license/v2"
insecureSkipVerify: true
Apply the updated values through your normal upgrade flow (for example, helm upgrade).
Export usage data
If you included static-api-key in license-server-config, you can export usage data from the license server:
curl -X GET -H "Authorization: Bearer <KEY>" https://my-license-server.com/license/v2/instance/usage/export -o usage.csv
Uninstall
helm uninstall license-server --namespace license-server