radicle-heartwood-lfs/simulation/modules/radicle-node
Fintan Halpenny 9ff0e8b01f just: checking for ellipses
Add custom check for ellipses "...", asking for replacement of "…".

Git ranges and the CLI wildcard matches are ignored.

This change includes fixes to all sites that did not pass the check.
2026-05-28 16:52:02 +01:00
..
cue.mod simulation: Introduce particle CUE module for radicle-node 2026-05-11 12:53:17 +01:00
templates simulation: Switch externalAddress config parsing to jq 2026-05-11 12:53:47 +01:00
README.md just: checking for ellipses 2026-05-28 16:52:02 +01:00
debug_tool.cue simulation: Introduce particle CUE module for radicle-node 2026-05-11 12:53:17 +01:00
debug_values.cue simulation: Introduce particle CUE module for radicle-node 2026-05-11 12:53:17 +01:00
timoni.cue simulation: Introduce particle CUE module for radicle-node 2026-05-11 12:53:17 +01:00
timoni.ignore simulation: Introduce particle CUE module for radicle-node 2026-05-11 12:53:17 +01:00
values.cue simulation: Introduce particle CUE module for radicle-node 2026-05-11 12:53:17 +01:00

README.md

radicle-node

A timoni.sh module for deploying radicle-node to Kubernetes clusters.

Prerequisites

  • Timoni installed.
  • A valid KUBECONFIG pointing to your Kubernetes cluster.
  • A default StorageClass available in your cluster (used by the StatefulSet for persistent storage).

Install

To create an instance using the default values:

timoni -n default apply radicle-node oci://<container-registry-url>

To change the default configuration, create one or more values.cue files and apply them to the instance.

For example, create a file my-values.cue with the following content:

values: {
	topology: {
		"my-seed-node": {
			role: "seed"
			replicas: 1
			storage: size: "5Gi"
			sidecars: events: true
		}
	}
}

And apply the values with:

timoni -n default apply radicle-node oci://<container-registry-url> \
--values ./my-values.cue

Uninstall

To uninstall an instance and delete all its Kubernetes resources:

timoni -n default delete radicle-node

Module Structure

This Timoni module is organized into several CUE files that define the schema, templates, and deployment logic:

  • timoni.cue: The entry point of the module. It defines the user-supplied values schema and the Timoni workflow (how to build, validate, and apply the Kubernetes resources).
  • templates/config.cue: Contains the core #Config and #NodeGroup schemas. It defines default values (including startup scripts) and the #Instance logic that iterates over the defined topology to generate the required Kubernetes objects.
  • templates/statefulset.cue: Defines the Kubernetes StatefulSet template, configuring the Radicle node container, init containers for configuration prep, optional sidecars (like the events logger), and persistent volume claims.
  • templates/configmap.cue: Defines the Kubernetes ConfigMap template used to inject the config.json into the Radicle node pods.
  • templates/service.cue: Defines a Kubernetes Headless Service template. This is created per "role" to allow direct pod-to-pod DNS resolution for Radicle's gossip network.
  • debug_tool.cue: Provides CUE CLI commands (build and ls) to render and inspect the generated Kubernetes manifests locally without applying them to a cluster.
  • timoni.ignore: Lists files and directories that should be excluded when packaging or applying the module.

Configuration

Topology Configuration

This module uses a topology map to define one or more groups of Radicle nodes. Each group generates its own StatefulSet and ConfigMap, and groups sharing the same role will share a headless Service.

Key Type Default Description
topology: [name]: role string Required The role of the node group (e.g. seed, peer). Used for DNS resolution.
topology: [name]: replicas int 1 Number of pod replicas for this group.
topology: [name]: repository string quay.io/radicle_garden/radicle-node Container image repository.
topology: [name]: version string latest Container image tag.
topology: [name]: storage object {className: "local-path", size: "1Gi"} Persistent Volume Claim configuration for /home/radicle/.radicle.
topology: [name]: sidecars object {events: true} Toggles sidecar containers (e.g. the events logger).
topology: [name]: radicleConfig object {node: {network: "test", …}} The contents of the config.json injected into the node.

Node Identity / Secrets

The node's identity (cryptographic keys) is generated automatically on startup if it doesn't exist. You can control this generation deterministically using the NODE_ID_SEED environment variable.

If NODE_ID_SEED is provided in the configuration, the startup script hashes it to generate a 32-byte seed for rad auth. If omitted, the pod's hostname is hashed instead. This ensures that if a pod restarts, it can regenerate the same identity, or you can explicitly pass a seed to persist identities across complete cluster teardowns.

Debugging

You can render and inspect the generated Kubernetes manifests locally without applying them to a cluster using the included CUE debug tool:

# Print a summary of the resources that will be created
cue cmd -t debug -t name=my-node -t namespace=default -t mv=1.0.0 -t kv=1.28.0 ls

# Output the full multi-doc YAML
cue cmd -t debug -t name=my-node -t namespace=default -t mv=1.0.0 -t kv=1.28.0 build