Files
hanzo-dev 04806b23b5 zoo-devnet: trunk could not be applied without breaking the validator
Two ways origin/main disagreed with the live cluster, both of which only bite
on the next clean `apply -k`:

  NETWORK_HEALTH_MIN_CONN_PEERS was absent. A single-validator devnet has no
  peers, so luxd's default health gate (min 1 connected peer) holds the pod at
  0/1 forever. The LIVE StatefulSet already runs
  --network-health-min-conn-peers=0; trunk just had no way to reproduce it. The
  key went missing when HTTP_ALLOWED_HOSTS was added to this same `config:`
  block — the edit landed beside it and took its sibling with it.

  tag was pinned to 0.2.0 while the live node runs ghcr.io/zooai/node:0.2.2
  (the plugin-dir fix). Applying trunk downgraded the validator.

Neither showed up as an outage because nothing re-applies this overlay on a
schedule — no flux, no argo, no cronjob on zoo-k8s. It would have detonated
under whoever ran the next apply, which is the worst time to find it.

`kubectl kustomize k8s/zoo-devnet` now renders NETWORK_HEALTH_MIN_CONN_PEERS
"0" and tag 0.2.2, matching production.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 00:26:21 -07:00

77 lines
2.6 KiB
YAML

# Zoo devnet — 1 validator joining the Lux devnet primary network (networkId 3)
# and tracking the Zoo devnet EVM chain (chainID 200202). Shape matches the
# v0.1.1 operator's ZooNetworkSpec (src/controller.rs::create_network):
# validators:<int> + image{repository,tag} + resources{cpu/mem Req/Limit} +
# storage{storageClass,size} + config{} (flat map → ZOO_* env on each pod).
apiVersion: zoo.network/v1alpha1
kind: ZooNetwork
metadata:
name: zoo-chain
spec:
networkId: 3
validators: 1
# zooai/node (zood) — Zoo EVM + AI precompiles (0x0303 inference, 0x0304
# aivmbridge). devnet is the lowest-risk place to bring Beluga up as a real
# L3 (1 fresh validator, no live L2 traffic). Floating `latest` is acceptable
# ONLY on devnet; testnet/mainnet pin the immutable CI semver. See
# statefulset-patch.yaml (./luxd -> zood).
image:
repository: ghcr.io/zooai/node
tag: 0.2.2
pullPolicy: IfNotPresent
resources:
cpuRequest: "200m"
cpuLimit: "1"
memoryRequest: 2Gi
memoryLimit: 4Gi
storage:
storageClass: do-block-storage
size: 20Gi
# luxd ignores ZOO_* env for http-host/bootstrap flags; the real flags are
# injected via statefulset-patch.yaml (see kustomization.yaml).
config:
# Devnet has no sybil protection (Lux primary networkID 3 convention).
SYBIL_PROTECTION_ENABLED: "false"
# luxd defaults --http-allowed-hosts to localhost, so every in-cluster
# caller addressing the node as `zoo-chain-rpc` got 403 Forbidden — the
# explorer could reach the Service and still index nothing. The Service is
# ClusterIP and devnet is not publicly routed.
HTTP_ALLOWED_HOSTS: "*"
# Single-validator devnet has no peers, so the default network-health gate
# (min 1 connected peer) would hold the pod at 0/1 forever. 0 = healthy alone.
# The LIVE StatefulSet already runs --network-health-min-conn-peers=0; this
# key is what makes an apply of this overlay reproduce that rather than hang
# the validator. It went missing when HTTP_ALLOWED_HOSTS was added to this
# same block, so trunk drifted out of agreement with production.
NETWORK_HEALTH_MIN_CONN_PEERS: "0"
---
apiVersion: zoo.network/v1alpha1
kind: ZooChain
metadata:
name: zoo-evm
spec:
chainId: 200202
networkRef: zoo-chain
---
# Single zoo-operator lives in zoo-system; per-env Deployments scale to 0.
apiVersion: apps/v1
kind: Deployment
metadata:
name: zoo-operator
spec:
replicas: 0
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: zoo-bridge
spec:
replicas: 1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: zoo-ingress
spec:
replicas: 1