This Helm chart is designed to be a plug and play solution for deploying the complete Zcash ecosystem on Kubernetes. With minimal configuration, you can easily deploy zcashd
, zebra
, lightwalletd
, caddy
, and dnsseeder
to run a fully functional Zcash infrastructure.
By default, this chart uses Caddy as a web frontend for lightwalletd
, making it simple to expose the lightwalletd
service securely over HTTPS. Caddy automatically manages SSL certificates and provides a modern, user-friendly configuration for serving HTTP(S) traffic. This setup allows you to quickly expose lightwalletd
to external clients, such as mobile wallets, without worrying about complex web server configurations.
Although the default configuration is ready to deploy and run, this Helm chart is highly customizable. You can easily adapt it to fit your specific infrastructure needs:
-
Ingress or Internal Deployment: If you prefer not to use
Caddy
or want to integrate the deployment with an existing ingress controller (like NGINX, Traefik, etc.), you can disable Caddy and configure your own ingress to exposelightwalletd
or other services. This makes the chart suitable for use in internal networks or environments whereCaddy
is not needed. -
Internal Infrastructure: For deployments that don’t require public exposure (e.g., running on internal networks or for development purposes), you can modify the chart to adjust how services are exposed, allowing tighter integration with internal load balancers or private networking configurations.
-
Custom Images and Resources: All Docker images, resource limits, volume sizes, and other Kubernetes objects are fully customizable. You can override any value in the
values.yaml
file or through the--set
flags in Helm, making it easy to adapt the deployment to your exact specifications.
In summary, this Helm chart provides a turnkey solution to deploy the Zcash ecosystem quickly and securely. However, it is also flexible enough to be adapted for more advanced use cases, whether for public-facing deployments or internal infrastructures.
This Helm chart includes several components that work together to create a complete Zcash infrastructure setup. Below is a brief explanation of each component, along with links to their respective GitHub repositories for more information.
zebra
is a Zcash full node implementation developed by the Zcash Foundation. It is responsible for maintaining the Zcash blockchain, validating transactions, and participating in the Zcash peer-to-peer network. zebra is written in Rust and focuses on security, performance, and modularity. It was developed to promote diversity in Zcash node software, making the network more robust and resilient. zebra is the preferred full node implementation for new deployments, and is configured by default in this Helm chart.
- GitHub: Zebra Repository
zcashd
is the original Zcash node implementation developed by Electric Coin Company. It is written in C++ and was forked from Bitcoin Core. Like zebra, it operates as a full node, validating blocks and transactions in the Zcash network. zcashd has a longer history of deployment and is currently still the more widely deployed full node implementation, but is in the process of being deprecated in favour of zebra. Alternatives are being developed for functionality currently supported only by zcashd, such as its internal wallet. You should aim to have switched to zebra by early 2025, in advance of the NU7 network upgrade, which zcashd will likely not support (see ECC's roadmap).
- GitHub: Zcashd Repository
lightwalletd
is a lightweight server that acts as a proxy between Zcash light clients (such as mobile wallets) and full Zcash nodes like zcashd
or zebra
. It enables light clients to interact with the Zcash blockchain without requiring a full node locally. Lightwalletd processes client requests, such as syncing balances and sending transactions, by forwarding them to a connected full node.
- GitHub: Lightwalletd Repository
Caddy
is a modern web server that can be deployed as a frontend for lightwalletd
. It provides easy HTTPS configuration, automatic certificate management, and other features like routing and reverse proxying. In this setup, Caddy handles incoming HTTP traffic for lightwalletd
, ensuring secure connections and simplified configuration.
- GitHub: Caddy Repository
dnsseeder
is a service that provides seed nodes for Zcash clients. When a new Zcash node starts, it needs to find peers to connect to, and the DNSSeeder helps by returning a list of active nodes in the network. This component ensures that new nodes can quickly discover and join the Zcash network without needing a predefined set of peers.
- GitHub: DNSSeeder Repository
Each of these components plays a critical role in the functioning of the Zcash network, from full node operations to lightweight client support, and peer discovery. You can visit their respective GitHub repositories for more details about their implementation, development, and configuration.
- Chart.yaml: Metadata of the Helm chart.
- values.yaml: Default values for deploying the Helm chart.
- templates/: Helm templates that generate Kubernetes manifests.
- .gitignore: Specifies files and directories to be ignored by Git.
To use this Helm chart, you need to have Helm installed.
-
Navigate to the chart directory:
cd zcash-stack
-
Add the repo
helm repo add zcash-stack https://Electric-Coin-Company.github.io/zcash-stack/
-
Install the chart:
helm install <release-name> zcash-stack/zcash-stack
-
If you need to override the default values, create a custom
values.yaml
and use the following command:helm install <release-name> zcash-stack/zcash-stack --values <custom-values-file.yaml>
The following table lists the configurable parameters of the Zcashd Helm chart and their default values:
Parameter | Description | Default | Required | Possible values |
---|---|---|---|---|
zcashd.enabled |
Enable Zcashd node deployment | False |
True | False , True |
zcashd.name |
Name of the Zcashd instance | zcashd |
True | Any string |
zcashd.testnet |
Enable testnet mode | False |
True | true , True |
zcashd.image.repository |
Zcashd Docker image repository | electriccoinco/zcashd |
True | Any valid image repository |
zcashd.image.tag |
Zcashd Docker image tag | latest |
True | Any valid image tag |
zcashd.image.pullPolicy |
Image pull policy | IfNotPresent |
True | Always , IfNotPresent , Never |
zcashd.replicas |
Number of Zcashd replicas | 1 |
True | Any integer >= 1 |
zcashd.reindex |
Enable reindexing | False |
True | False , True |
zcashd.nodes |
Seed nodes to connect to | [mainnet.z.cash] |
True | List of valid node addresses |
zcashd.volumes.data.size |
Size of the Zcashd data volume | 400Gi |
True | Any valid size (e.g., 400Gi ) |
zcashd.volumes.data.storageClass |
Storage class for the Zcashd data volume | default |
True | Any valid storage class |
zcashd.service.type |
Service type for Zcashd | ClusterIP |
True | ClusterIP , NodePort , LoadBalancer |
zcashd.requests.cpu |
CPU requests for Zcashd | nil |
True | Any valid CPU request (e.g., 500m ) |
zcashd.requests.memory |
Memory requests for Zcashd | nil |
True | Any valid memory request (e.g., 512Mi ) |
zebra.enabled |
Enable Zebra node deployment | True |
True | False , True |
zebra.name |
Name of the Zebra instance | zebra |
True | Any string |
zebra.testnet |
Enable Zebra testnet mode | False |
True | False , True |
zebra.image.repository |
Zebra Docker image repository | zfnd/zebra |
True | Any valid image repository |
zebra.image.tag |
Zebra Docker image tag | v1.9.0 |
True | Any valid image tag |
zebra.replicas |
Number of Zebra replicas | 1 |
True | Any integer >= 1 |
zebra.volumes.data.size |
Size of the Zebra data volume | 400Gi |
True | Any valid size (e.g., 400Gi ) |
zebra.volumes.data.storageClass |
Storage class for the Zebra data volume | defaut |
True | Any valid storage class |
zebra.service.type |
Service type for Zebra | ClusterIP |
True | ClusterIP , NodePort , LoadBalancer |
lightwalletd.enabled |
Enable Lightwalletd deployment | True |
True | False , True |
lightwalletd.zcashNodeType |
Type of Zcash node (zcashd or zebra ) |
zebra |
True | zcashd , zebra |
lightwalletd.image.repository |
Lightwalletd Docker image repository | electriccoinco/lightwalletd |
True | Any valid image repository |
lightwalletd.image.tag |
Lightwalletd Docker image tag | latest |
True | Any valid image tag |
lightwalletd.volumes.data.size |
Size of the Lightwalletd data volume | 400Gi |
True | Any valid size (e.g., 40Gi ) |
lightwalletd.volumes.data.storageClass |
Storage class for the Lightwalletd volume | default |
True | Any valid storage class |
caddy.enabled |
Enable Caddy deployment (frontend for Lightwalletd) | False |
True | true , True |
caddy.domain |
Domain for Caddy | "lwd.example.com" |
True | Any valid domain |
caddy.email |
Email for SSL certificates | "admin@example.com" |
True | Any valid email |
dnsseeder.enabled |
Enable DNS seeder deployment | True |
True | False , True |
dnsseeder.name |
Name of the DNS seeder instance | dnsseeder |
True | Any string |
dnsseeder.image.repository |
DNS seeder Docker image repository | electriccoinco/dnsseeder |
True | Any valid image repository |
dnsseeder.image.tag |
DNS seeder Docker image tag | latest |
True | Any valid image tag |
dnsseeder.service.type |
Service type for DNS seeder | ClusterIP |
True | ClusterIP , NodePort , LoadBalancer |
dnsseeder.env.seedHostname |
Hostname for the seeder | "example.com" |
True | Any valid hostname |
dnsseeder.env.nodeHostname |
Hostname for the DNS node | "zcash.example.com" |
True | Any valid hostname |
dnsseeder.env.email |
Admin email for DNS seeder | "admin@example.com" |
True | Any valid email |
dnsseeder.env.threads |
Number of threads for the seeder | 384 |
True | Any valid integer >= 1 |
dnsseeder.env.address |
IP address to bind for the seeder | "0.0.0.0" |
True | Any valid IP address |
dnsseeder.env.network |
Network type for the seeder (mainnet or testnet ) |
mainnet |
True | mainnet , testnet |
rpc.credentials.rpcUser |
RPC username | 5s3rn4m3 |
True | Any string |
rpc.credentials.rpcPassword |
RPC password | s3cr3tp4ssw0rd |
True | Any string |
You can override the default values by creating a custom values.yaml
or using the --set
flag. For example:
helm install <release-name> zcash-stack/zcash-stack
This project was inspired by the work in emersonian/zcash-stack. Their implementation provided valuable insights for structuring and organizing this codebase.