Helm chart for deploying the Teranode Operator on Kubernetes.
The Teranode Operator manages Teranode blockchain node deployments on Kubernetes using Custom Resource Definitions (CRDs).
Install CRDs first (required before installing the operator):
# Install CRDs from the operator repository (v0.1.2)
kubectl apply --server-side -f https://raw.githubusercontent.com/bsv-blockchain/teranode-operator/v0.1.2/deploy/crds.yamlImportant:
- CRDs must be installed separately because they exceed the Kubernetes Secret size limit of 1MB (Helm stores release metadata in Secrets, and the CRDs are ~3.6MB)
- The
--server-sideflag is required because some CRDs exceed the 256KB annotation size limit - CRDs are versioned with the operator and should match the
appVersionin the chart
helm install teranode-operator oci://ghcr.io/bsv-blockchain/helm/teranode-operator \
-n teranode-operator \
--create-namespace \
--set deployment.env.watch_namespace="teranode"# Install CRDs first
kubectl apply --server-side -f https://raw.githubusercontent.com/bsv-blockchain/teranode-operator/v0.1.2/deploy/crds.yaml
# Clone and install chart
git clone https://github.com/bsv-blockchain/teranode-operator-helm.git
cd teranode-operator-helm
helm install teranode-operator ./ \
-n teranode-operator \
--create-namespace \
--set deployment.env.watch_namespace="teranode"| Parameter | Description | Default |
|---|---|---|
deployment.image.repository |
Operator container image repository | ghcr.io/bsv-blockchain/teranode-operator |
deployment.image.tag |
Operator container image tag | v0.1.2 |
deployment.image.pullPolicy |
Image pull policy | Always |
deployment.env.watch_namespace |
Comma-separated list of namespaces to watch | "" |
deployment.replicaCount |
Number of operator replicas | 1 |
sampleCluster.enable |
Deploy a sample Teranode cluster | false |
sampleCluster.network |
Network type for sample cluster (mainnet/testnet) | testnet |
sampleCluster.hostname |
Hostname for sample cluster | "" |
helm install teranode-operator ./ \
-n teranode-operator \
--create-namespace \
--set deployment.env.watch_namespace="teranode-dev,teranode-staging,teranode-prod"Deploy a sample Teranode cluster along with the operator:
helm install teranode-operator ./ \
-n teranode-operator \
--create-namespace \
--set deployment.env.watch_namespace="teranode" \
--set sampleCluster.enable=true \
--set sampleCluster.hostname=example.com \
--set sampleCluster.network=mainnetNote: The sample cluster is opinionated and requires the BSVA reference architecture deployed via Terraform/OpenTofu modules.
When upgrading to a new operator version, update the CRDs first:
# Update CRDs to match new operator version (e.g., v0.1.3)
kubectl apply --server-side -f https://raw.githubusercontent.com/bsv-blockchain/teranode-operator/v0.1.3/deploy/crds.yaml
# Upgrade the Helm chart
helm upgrade teranode-operator oci://ghcr.io/bsv-blockchain/helm/teranode-operator \
--version 0.1.1 \
-n teranode-operator# Uninstall the operator
helm uninstall teranode-operator -n teranode-operator
# Optionally remove CRDs (WARNING: This deletes all Teranode resources)
kubectl get crd -o name | grep '\.teranode\.bsvblockchain\.org' | xargs kubectl deleteWarning: Deleting CRDs will remove all Teranode custom resources in your cluster.
# Lint the chart
helm lint .
# Dry-run installation
helm install teranode-operator ./ \
--dry-run \
--debug \
-n teranode-operator \
--set deployment.env.watch_namespace="teranode"
# Template rendering
helm template teranode-operator ./ \
--namespace teranode-operator \
--set deployment.env.watch_namespace="teranode"This chart follows semantic versioning independent from the operator:
-
Chart Version (
versionin Chart.yaml): Version of the Helm chart packaging- Bump MAJOR for breaking changes to chart structure/values
- Bump MINOR for new features (new values, templates)
- Bump PATCH for bug fixes and documentation updates
-
App Version (
appVersionin Chart.yaml): Teranode Operator version being deployed- Should match a released operator version tag (e.g.,
0.1.2for operator tagv0.1.2) - Update
values.yamldeployment.image.tagto match (withvprefix:v0.1.2) - Important: Also update the CRD installation URL in the README to match the new version
- Should match a released operator version tag (e.g.,
Example: Chart version 0.2.5 might deploy operator version 0.1.2 if only chart changes were made.
See Chart.yaml for current versions.
| Name | Version |
|---|---|
| Helm | >= 3.15 |
| Kubernetes | >= 1.30 |
| Chart Version | App Version | Date | Changes |
|---|---|---|---|
| 0.1.1 | 0.1.2 | 12/11/2025 | Remove CRDs from chart |
| 0.1.0 | 0.1.2 | 12/11/2025 | Initial release |
- Make changes to the chart templates/values
- Update
Chart.yaml:- Bump
versionfor chart changes - Update
appVersionif deploying a new operator version
- Bump
- If operator version changed:
- Update
values.yamldeployment.image.tag - Update CRD installation URL in README (Prerequisites section)
- Update
- Test locally:
helm lint . && helm template . --debug - Commit and push to
mainbranch - GitHub Actions will automatically publish to GHCR
See LICENSE for details.
For issues and questions:
- Operator Issues: https://github.com/bsv-blockchain/teranode-operator/issues
- Chart Issues: https://github.com/bsv-blockchain/teranode-operator-helm/issues
- Documentation: https://docs.bsvblockchain.org/