Deploy Monad validator or full nodes (same binary; a full node is simply an unregistered validator) on Kubernetes using the Helm chart contained in this repository. The chart provisions the services, persistent storage, sidecar scripts, and telemetry hooks required to operate a Monad node with automated snapshot restores and forkpoint management.
charts/monad/Chart.yaml– chart metadata (version1.0.10, app versionv0.12.2-rpc-hotfix2).charts/monad/values.yaml– default values for replica count, images, node configuration, and monitoring.charts/monad/templates/– Kubernetes manifests for the StatefulSet, Services, Secrets, PVCs, and optional monitoring resources.charts/monad/configs/– config files packaged into a ConfigMap (genesis data, validator set, OpenTelemetry collector config, node map, and samplenode.toml, files need to be sourced from Monad validator documentation).charts/monad/scripts/– operational scripts mounted into the pod to reset storage, download forkpoints, and prune old artifacts.
- Kubernetes 1.25+ cluster with nodes that can expose host networking on port
8000(the chart setshostNetwork: true). - Helm 3.10+ installed locally.
- Storage classes capable of provisioning the default PersistentVolumeClaims (
1.7TiNVMe filesystem and1.7Tiblock volume). Overridepvc.yamlsettings if your environment differs. - Worker nodes configured with huge pages (
HugePages-2MiandHugePages-1Gi) to satisfy the pod limits configured in the StatefulSet. - Access to the required container image (
ghcr.io/laminated-labs/monad). ConfigureimagePullSecretsif the registry is private; defaults assume public GHCR access.
A single Dockerfile builds the shared image used by all chart containers (bft, execution, rpc, and mpt). You can specify a different version by setting the VERSION build argument (defaults to 0.12.2-rpc-hotfix2). The GitHub Actions workflow builds and publishes ghcr.io/laminated-labs/monad using the chart appVersion, so the chart and image stay in lockstep.
- Clone this repository and change into it.
- Create a custom values file (for example
my-values.yaml) with your node identity, peer list, image tags, and secrets. - Follow the steps in the Monad documentation to download the necessary configuration files into
charts/monad/configs/(this repo only includes the OpenTelemetry collector config by default).genesis.json– the genesis block for the network.node.toml- node configurationnode-map.csv- list of known peers.validators.toml- validator set.
- Deploy the chart:
helm upgrade --install monad charts/monad -f my-values.yaml
- Inspect the rendered manifests before deploying if desired:
helm template monad charts/monad -f my-values.yaml
| Value | Description |
|---|---|
replicaCount |
Number of Monad pods to run (defaults to 1). |
imagePullSecrets.* |
Configure registry credentials for GHCR; set create: true and provide secret (raw Docker config JSON, not base64) to generate the secret automatically. Defaults leave this disabled for public pulls. |
image.* |
Shared image settings (name, pullPolicy, tag) used across all Monad containers; defaults to ghcr.io/laminated-labs/monad with the chart appVersion. |
bft.image, execution.image, rpc.image, mpt.image |
Optional per-container overrides for image name/tag/pullPolicy; leave empty to inherit from image.*. |
node.* |
Populate node metadata and peer lists consumed by configs/node.toml (e.g., node.name, node.address, node.peers, node.fullnodes). |
secret.* |
Control how validator keys are mounted. Set create: true, provide base64-encoded secp, bls, and keystorePassword fields (note the keys are secp/bls, not secpKey/blsKey), or point name at an existing secret with the keys id-secp, id-bls, and KEYSTORE_PASSWORD. |
monitoring.enabled |
Renders a PodMonitor and OpenTelemetry collector sidecar (declared under the initContainers block), plus config for additional scrape targets via monitoring.ports. |
extraInitContainers, extraVolumes, extraVolumeMounts, extraObjects |
Inject additional operational logic or manifests without forking the chart. |
Refer to charts/monad/values.yaml for the full list of tunables.
- Validator nodes require Monad secp256k1 and BLS keypairs along with the keystore password. Provide them via
secret.name(existing secret) or let the chart create a secret by settingsecret.create: trueand supplying the base64-encoded values in thesecretblock. - The StatefulSet mounts the secret at
/monad/keysand expects filenamesid-secpandid-blsplus theKEYSTORE_PASSWORDenvironment variable. Never commit live keys into version control.
The monad-scripts ConfigMap injects three helper scripts:
init.sh– prepares the TrieDB block device, restores from the latest snapshot (using aria2/zstd utilities), and reacts to sentinel files.initialize-configs.sh– fetches the latest forkpoint and validator configurations when none exists or a soft reset is requested.clear-old-artifacts.sh– removes stale WAL, forkpoint, and ledger files after new data is detected.
Sentinel files placed inside the mounted volume toggle maintenance tasks:
/monad/HARD_RESET_SENTINEL_FILE– wipe the ledger, re-create the TrieDB, and trigger a fresh snapshot restore./monad/RESTORE_FROM_SNAPSHOT_SENTINEL_FILE– re-import the most recent snapshot without a full reset./monad/SOFT_RESET_SENTINEL_FILE– download a freshforkpoint.tomlandvalidators.toml.
- The pod exposes TCP and UDP
8000via host networking for BFT traffic. A headless Service publishes the same ports (plus the otel port) for discovery and optional external DNS annotations. - RPC traffic binds to port
8080on the host network only; the Service does not expose RPC. Add your own Service/Ingress if cluster-level access is required.
When monitoring.enabled: true the chart:
- Runs an OpenTelemetry collector sidecar (declared under the initContainers block) with config from
configs/otel-collector-config.yaml, exporting to the mainnet endpointhttps://otel-external.monadinfra.com:443and exposing Prometheus metrics on8889. - Creates a
PodMonitor(for Prometheus Operator) and allows additional port scraping viamonitoring.ports. - Propagates
OTEL_ENDPOINTto the BFT and RPC containers so they can emit traces/metrics.
- Use
helm lint charts/monadto validate template syntax. - Render templates locally with
helm templateto review generated manifests before applying them to a cluster. - Update
versionandappVersioninChart.yamlwhen you publish changes.
- Build the Monad binaries from source as part of the image build to ensure reproducible and secure releases.
- Open source our metrics sidecar application and include it in the published image.
- Incorporate MEV client support.
- Support pulling 3rd party snapshot
This project is released under the Apache License 2.0.