Lab Options
Options for configuring the lab environment, CD strategy, DNS, networking, and operations.
bgpRouter.asn
BGP Autonomous System Number for the router
Type: signed integer
Default: 65000
Declared in: modules/lab/bgp-router.nix
bgpRouter.containerName
Docker container name for the BGP router
Type: string
Default: "catallaxy-router"
Declared in: modules/lab/bgp-router.nix
bgpRouter.enable
Whether to enable Lab BGP router (FRRouting) for LoadBalancer IP advertisement.
Type: boolean
Default: false
Example: true
Declared in: modules/lab/bgp-router.nix
bgpRouter.image
FRRouting container image
Type: string
Default: "frrouting/frr:latest"
Declared in: modules/lab/bgp-router.nix
bgpRouter.lbPool
IP pool CIDR for LoadBalancer service allocation
Type: string
Default: "172.19.200.0/24"
Declared in: modules/lab/bgp-router.nix
bgpRouter.out.service
Computed container service definition for the BGP router
Type: attribute set
Default: { }
Declared in: modules/lab/bgp-router.nix
bgpRouter.peerASN
BGP ASN for Cilium nodes (peers)
Type: signed integer
Default: 65001
Declared in: modules/lab/bgp-router.nix
bgpRouter.peerAddress
IP address where the BGP router is reachable by Cilium nodes (Docker network gateway)
Type: string
Default: "172.19.0.1"
Declared in: modules/lab/bgp-router.nix
cd.argocd.repoUrl
Git repository URL for manifest storage
Type: string
Default: ""
Declared in: modules/lab/types.nix
cd.argocd.targetBranch
Git branch to commit rendered manifests to
Type: string
Default: "main"
Declared in: modules/lab/types.nix
cd.clusterPaths
Per-cluster targetPath overrides. Key = cluster name, value = path in repo. Default: manifests/
Type: attribute set of string
Default: { }
Declared in: modules/lab/types.nix
cd.fleet.repoUrl
Git repository URL for manifest storage
Type: string
Default: ""
Declared in: modules/lab/types.nix
cd.fleet.targetBranch
Git branch to commit rendered manifests to
Type: string
Default: "main"
Declared in: modules/lab/types.nix
cd.git.branch
Target branch for manifest publishing
Type: string
Default: "main"
Declared in: modules/lab/types.nix
cd.git.path
Subdirectory within the repo for manifests (empty = repo root)
Type: string
Default: ""
Declared in: modules/lab/types.nix
cd.git.prBaseBranch
Base branch for PRs (the branch to merge into)
Type: string
Default: "main"
Declared in: modules/lab/types.nix
cd.git.prEnabled
Create a PR/MR instead of pushing directly to the target branch
Type: boolean
Default: false
Declared in: modules/lab/types.nix
cd.git.provider
Git provider for PR/MR creation
Type: one of "github", "gitlab", "forgejo"
Default: "github"
Declared in: modules/lab/types.nix
cd.git.repo
Git repository URL for publishing rendered manifests (e.g. git@github.com:org/manifests.git)
Type: string
Default: ""
Declared in: modules/lab/types.nix
cd.kapp.waitTimeout
Timeout waiting for resources to reconcile
Type: string
Default: "10m"
Declared in: modules/lab/types.nix
cd.strategy
CD strategy for delivering manifests to all clusters:
- kapp: Direct apply via kapp (fast, no git, ideal for local dev)
- argocd: Render manifests to git, ArgoCD syncs from there
- fleet: Render manifests to git, Fleet syncs from there
Type: one of "kapp", "argocd", "fleet"
Default: "kapp"
Declared in: modules/lab/types.nix
clusters
Cluster configurations. Each cluster is provisioned directly by the CLI (e.g. via k3d for local dev). Any cluster can optionally enable CAPI to manage external clusters.
Type: attribute set of (submodule)
Default: { }
Declared in: modules/lab/types.nix
dns.containerName
Docker container name for the DNS server
Type: string
Default: "catallaxy-dns"
Declared in: modules/lab/dns.nix
dns.enable
Whether to enable Lab DNS server (Knot DNS with RFC2136 for ExternalDNS).
Type: boolean
Default: false
Example: true
Declared in: modules/lab/dns.nix
dns.hostPort
Host-mapped port for the DNS server (for host access). Avoids 5353 which conflicts with mDNS.
Type: 16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default: 5354
Declared in: modules/lab/dns.nix
dns.image
Knot DNS container image
Type: string
Default: "cznic/knot:latest"
Declared in: modules/lab/dns.nix
dns.out.dnsInfo
DNS server info for host resolver configuration
Type: attribute set
Default: { }
Declared in: modules/lab/dns.nix
dns.out.service
Computed container service definition for the lab DNS server
Type: attribute set
Default: { }
Declared in: modules/lab/dns.nix
dns.port
Port for the DNS server (as seen from clusters, defaults to hostPort)
Type: 16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default: 5354
Declared in: modules/lab/dns.nix
dns.server
IP address where the DNS server is reachable from clusters (Docker gateway by default)
Type: string
Default: "172.19.0.1"
Declared in: modules/lab/dns.nix
dns.tsigKeyname
TSIG key name for RFC2136 dynamic updates
Type: string
Default: "externaldns-key"
Declared in: modules/lab/dns.nix
dns.tsigSecret
Base64-encoded TSIG secret (pre-generated for local dev)
Type: string
Default: "kp4bgnFAVCmajGIqOW7rj0MNwRNZHBqMvYaLTwzPHgI="
Declared in: modules/lab/dns.nix
dns.tsigSecretAlg
TSIG algorithm
Type: string
Default: "hmac-sha256"
Declared in: modules/lab/dns.nix
dns.zone
DNS zone for the lab (defaults to ‘
Type: string
Default: "docs-placeholder.test"
Declared in: modules/lab/dns.nix
environment
Lab environment. Components can adjust defaults based on this:
- development: minimal replicas, relaxed resource limits, self-signed TLS
- staging: moderate replicas, production-like config, self-signed or ACME TLS
- production: HA replicas, strict resource limits, ACME TLS, destructive ops require –force
Type: one of "development", "staging", "production"
Default: "development"
Declared in: modules/lab/types.nix
images.allowedRegistries
When non-empty, the lint check warns about images from registries not in this list. Example: [“ghcr.io” “registry.k8s.io” “docker.io”]
Type: list of string
Default: [ ]
Declared in: modules/lab/images.nix
images.pins
Pinned container images. Each pin declares an image with optional tag and digest.
Components can reference pins via lab.images.pins.<name>.ref to get
the full image reference string.
Example: lab.images.pins.grafana = { image = “docker.io/grafana/grafana”; tag = “11.4.0”; digest = “sha256:abc123…”; };
Type: attribute set of (submodule)
Default: { }
Declared in: modules/lab/images.nix
images.pins.<name>.digest
Image digest (e.g., sha256:abc123…). Immutable — ensures reproducibility.
Type: null or string
Declared in: modules/lab/images.nix
images.pins.<name>.image
Full image path (e.g., docker.io/grafana/grafana)
Type: string
Declared in: modules/lab/images.nix
images.pins.<name>.ref
Computed full image reference (image:tag@digest)
Type: string
Declared in: modules/lab/images.nix
images.pins.<name>.tag
Image tag (e.g., 11.4.0). Mutable — use digest for reproducibility.
Type: null or string
Declared in: modules/lab/images.nix
images.requireDigest
When true, the lint check errors on container images without digest pins. Use this to enforce reproducible deployments.
Type: boolean
Default: false
Declared in: modules/lab/images.nix
lint.checks
Custom lint checks that run on rendered manifests.
Each check is a shell command executed per YAML file.
Checks run alongside built-in checks during cata lab lint.
Type: attribute set of (submodule)
Default: { }
Declared in: modules/lab/lint.nix
lint.checks.<name>.command
Shell command to execute per YAML file. Environment variables: $FILE — path to the YAML manifest file $CLUSTER — name of the cluster being checked Exit 0 = pass, non-zero = fail. Stdout = diagnostic message (shown to user on failure).
Type: string
Declared in: modules/lab/lint.nix
lint.checks.<name>.description
Human-readable description of what this check validates
Type: string
Declared in: modules/lab/lint.nix
lint.checks.<name>.severity
Error = fails the lint, Warning = reported but doesn’t fail
Type: one of "error", "warning"
Default: "warning"
Declared in: modules/lab/lint.nix
name
Unique name for this lab
Type: string
Example: "homelab"
Declared in: modules/lab/types.nix
network.dockerSubnet
Subnet for the lab
Type: string
Default: "172.19.0.0/16"
Declared in: modules/lab/network.nix
ops.commands
Lab-global operational commands. These are not cluster-specific and appear directly in the ops tool under their category.
Components contribute cluster-scoped commands via the cluster-level
ops.<name> option. Same-named commands from different clusters
are automatically merged (enum options get their values unioned).
Type: attribute set of (submodule)
Default: { }
Declared in: modules/lab/ops.nix
ops.commands.<name>.args
Positional arguments
Type: list of (submodule)
Default: [ ]
Declared in: modules/lab/ops.nix
ops.commands.<name>.args.*.description
This option has no description.
Type: string
Default: ""
Declared in: modules/lab/ops.nix
ops.commands.<name>.args.*.name
This option has no description.
Type: string
Declared in: modules/lab/ops.nix
ops.commands.<name>.args.*.required
This option has no description.
Type: boolean
Default: true
Declared in: modules/lab/ops.nix
ops.commands.<name>.category
Subcommand group (e.g. ‘backup’, ‘database’)
Type: string
Default: "general"
Declared in: modules/lab/ops.nix
ops.commands.<name>.description
One-line description shown in help
Type: string
Declared in: modules/lab/ops.nix
ops.commands.<name>.options
Named options (flags)
Type: attribute set of (submodule)
Default: { }
Declared in: modules/lab/ops.nix
ops.commands.<name>.options.<name>.default
This option has no description.
Type: null or string
Declared in: modules/lab/ops.nix
ops.commands.<name>.options.<name>.description
This option has no description.
Type: string
Default: ""
Declared in: modules/lab/ops.nix
ops.commands.<name>.options.<name>.required
This option has no description.
Type: boolean
Default: false
Declared in: modules/lab/ops.nix
ops.commands.<name>.options.<name>.type
This option has no description.
Type: one of "string", "enum", "bool"
Default: "string"
Declared in: modules/lab/ops.nix
ops.commands.<name>.options.<name>.values
Valid values for enum type
Type: list of string
Default: [ ]
Declared in: modules/lab/ops.nix
ops.commands.<name>.package
Package providing the command binary
Type: package
Declared in: modules/lab/ops.nix
ops.out.tool
Generated lab operations CLI tool (null if no commands defined)
Type: null or package
Declared in: modules/lab/ops.nix
out.allClusters
Computed attrset of all clusters in the lab. Keys are cluster names, values are evaluated cluster configs. Use this for cross-cluster references.
Type: attribute set of (attribute set)
Default: { }
Declared in: modules/lab/out.nix
out.bootstrapManifests
Per-cluster kapp-format manifests for direct-apply bootstrap.
When strategy is kapp, this equals manifests. Otherwise renders
with kapp for use by lab up (which always direct-applies).
Type: attribute set of package
Default: { }
Declared in: modules/lab/out.nix
out.cliConfig
JSON-serializable lab configuration for the CLI.
Contains the fields that cata lab commands need:
management, clusterNames, services, network, registryPort, dnsInfo.
Type: attribute set
Default: { }
Declared in: modules/lab/out.nix
out.clusterNames
List of all cluster names in the lab
Type: list of string
Default: [ ]
Declared in: modules/lab/out.nix
out.deploymentPlan
Computed deployment plan — an ordered list of typed steps for the CLI to execute.
Inspect with cata lab plan.
Type: list of (submodule)
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.bootstrapContext
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.cluster
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.clusters
This option has no description.
Type: list of string
Default: [ ]
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.description
This option has no description.
Type: string
Default: ""
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.ephemeral
This option has no description.
Type: boolean
Default: false
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.name
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.provisioner
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.resources
This option has no description.
Type: list of attribute set of string
Default: [ ]
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.skipIfReachable
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.stores
This option has no description.
Type: list of string
Default: [ ]
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.target
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.targetContext
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.deploymentPlan.*.type
This option has no description.
Type: string
Declared in: modules/lab/planner.nix
out.labNamespaces
Per-cluster list of lab-created namespaces (before prefix application). Used by checks to verify prefix completeness.
Type: attribute set of list of string
Default: { }
Declared in: modules/lab/out.nix
out.manifests
Per-cluster rendered manifest packages. Each package contains the strategy-specific directory layout (kapp, argocd, or fleet) with human-readable YAML manifests.
Type: attribute set of package
Default: { }
Declared in: modules/lab/out.nix
out.package
Single package containing all lab outputs. Includes metadata.json (pretty-printed) and manifests/ directory with symlinks to each cluster’s rendered manifests.
Type: package
Declared in: modules/lab/out.nix
out.teardownPlan
Computed teardown plan — an ordered list of typed steps for safe lab destruction.
Inspect with cata lab plan --teardown.
Type: list of (submodule)
Declared in: modules/lab/planner.nix
out.teardownPlan.*.bootstrapContext
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.teardownPlan.*.cluster
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.teardownPlan.*.clusters
This option has no description.
Type: list of string
Default: [ ]
Declared in: modules/lab/planner.nix
out.teardownPlan.*.description
This option has no description.
Type: string
Default: ""
Declared in: modules/lab/planner.nix
out.teardownPlan.*.ephemeral
This option has no description.
Type: boolean
Default: false
Declared in: modules/lab/planner.nix
out.teardownPlan.*.name
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.teardownPlan.*.provisioner
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.teardownPlan.*.resources
This option has no description.
Type: list of attribute set of string
Default: [ ]
Declared in: modules/lab/planner.nix
out.teardownPlan.*.skipIfReachable
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.teardownPlan.*.stores
This option has no description.
Type: list of string
Default: [ ]
Declared in: modules/lab/planner.nix
out.teardownPlan.*.target
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.teardownPlan.*.targetContext
This option has no description.
Type: null or string
Declared in: modules/lab/planner.nix
out.teardownPlan.*.type
This option has no description.
Type: string
Declared in: modules/lab/planner.nix
prefix
Global name prefix applied to all rendered output. Use for multi-tenancy on shared clusters or running multiple lab instances. When set, resource names, namespaces, fleet bundles, and ArgoCD apps are all prefixed. Empty string = disabled.
Type: string
Default: ""
Example: "dev"
Declared in: modules/lab/types.nix
proxy.containerName
Docker container name for the ingress
Type: string
Default: "catallaxy-ingress"
Declared in: modules/lab/proxy.nix
proxy.enable
Whether to enable Lab ingress (HAProxy for domain-based routing to k3d clusters).
Type: boolean
Default: false
Example: true
Declared in: modules/lab/proxy.nix
proxy.httpPort
Host port for HTTP (redirects to HTTPS)
Type: 16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default: 80
Declared in: modules/lab/proxy.nix
proxy.httpsPort
Host port for HTTPS
Type: 16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default: 443
Declared in: modules/lab/proxy.nix
proxy.image
HAProxy container image
Type: string
Default: "haproxy:3.1-alpine"
Declared in: modules/lab/proxy.nix
proxy.out.service
Computed container service definition for the lab ingress
Type: attribute set
Default: { }
Declared in: modules/lab/proxy.nix
registry.containerName
Docker container name for the registry
Type: string
Default: "catallaxy-registry"
Declared in: modules/lab/registry.nix
registry.enable
Whether to enable Lab registry for image caching (Zot OCI registry as pull-through cache).
Type: boolean
Default: false
Example: true
Declared in: modules/lab/registry.nix
registry.image
Zot registry container image
Type: string
Default: "ghcr.io/project-zot/zot-linux-amd64:v2.1.1"
Declared in: modules/lab/registry.nix
registry.port
Host port for the registry
Type: 16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default: 5050
Declared in: modules/lab/registry.nix
registry.service
Computed container service definition for the lab registry
Type: attribute set
Default: { }
Declared in: modules/lab/registry.nix
secrets.managed
Managed secrets. Each declares source keys that live in a store.
Components project these into Kubernetes Secrets via
cluster-level secrets.projections.
Type: attribute set of (submodule)
Default: { }
Declared in: modules/lab/secrets.nix
secrets.managed.<name>.keys
Source key definitions — these appear in the SOPS file
Type: attribute set of (submodule)
Default: { }
Declared in: modules/lab/secrets.nix
secrets.managed.<name>.keys.<name>.generator
Generator for this key’s value. null means the value is set
manually via cata secrets edit.
Type: null or one of "base64", "hex", "alphanumeric", "uuid"
Declared in: modules/lab/secrets.nix
secrets.managed.<name>.keys.<name>.length
Length of generated value
Type: null or (positive integer, meaning >0)
Declared in: modules/lab/secrets.nix
secrets.managed.<name>.store
Name of the secret store this secret belongs to
Type: string
Declared in: modules/lab/secrets.nix
secrets.stores
Secret stores. Each store maps to one SOPS file (or one Vault path).
SOPS files are at: secrets/
Type: attribute set of (submodule)
Default: { }
Declared in: modules/lab/secrets.nix
secrets.stores.<name>.backend
Storage backend:
- sops: encrypted YAML files in git
- vault: HashiCorp Vault (future)
- external: managed outside catallaxy
Type: one of "sops", "vault", "external"
Default: "sops"
Declared in: modules/lab/secrets.nix