clean: squash history (binaries stripped via filter-repo)

This commit is contained in:
Hanzo AI
2026-04-13 03:45:21 -07:00
commit f6e63d60b2
2029 changed files with 465257 additions and 0 deletions
+127
View File
@@ -0,0 +1,127 @@
apiVersion: v1
kind: Namespace
metadata:
name: lux-network
---
apiVersion: v1
kind: Service
metadata:
name: luxd-service
namespace: lux-network
spec:
selector:
app: luxd
ports:
- name: http
port: 9630
targetPort: 9630
- name: staking
port: 9631
targetPort: 9631
type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:
name: luxd-headless
namespace: lux-network
spec:
selector:
app: luxd
ports:
- name: http
port: 9630
- name: staking
port: 9631
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: luxd
namespace: lux-network
spec:
serviceName: luxd-headless
replicas: 3
selector:
matchLabels:
app: luxd
template:
metadata:
labels:
app: luxd
spec:
securityContext:
fsGroup: 1000
runAsUser: 1000
runAsNonRoot: true
containers:
- name: luxd
image: ghcr.io/luxfi/node:latest
imagePullPolicy: Always
ports:
- containerPort: 9630
name: http
- containerPort: 9631
name: staking
env:
- name: NETWORK_ID
value: "96369"
- name: LOG_LEVEL
value: "info"
- name: HTTP_HOST
value: "0.0.0.0"
- name: NODE_ID
valueFrom:
fieldRef:
fieldPath: metadata.name
# Bootstrap from first node
- name: BOOTSTRAP_IPS
value: "luxd-0.luxd-headless.lux-network.svc.cluster.local"
- name: BOOTSTRAP_IDS
value: "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg"
volumeMounts:
- name: data
mountPath: /data
- name: staking-keys
mountPath: /keys/staking
readOnly: true
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "8Gi"
cpu: "4"
livenessProbe:
httpGet:
path: /ext/health
port: 9630
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
httpGet:
path: /ext/info
port: 9630
initialDelaySeconds: 30
periodSeconds: 10
volumes:
- name: staking-keys
secret:
secretName: luxd-staking-keys
defaultMode: 0400
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "fast-ssd"
resources:
requests:
storage: 100Gi
# NOTE: The luxd-staking-keys Secret must be created out-of-band via KMS,
# never committed to git. See: https://kms.hanzo.ai
# Example:
# kubectl -n lux-network create secret generic luxd-staking-keys \
# --from-file=staker.key=/path/to/staker.key \
# --from-file=staker.crt=/path/to/staker.crt
+115
View File
@@ -0,0 +1,115 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: luxd-startup
namespace: lux-mainnet
data:
startup.sh: |
#!/bin/sh
set -e
mkdir -p /data/plugins
# Node IDs (from staking keys) - UPDATE THESE after extracting from pods
NODE0_ID="NodeID-EHivaNhTcH66EFpR6XzqaywjPphNRSziR"
NODE1_ID="NodeID-E9eEF7yRWV72pUnzZSkqzmBUnM6xDPE73"
NODE2_ID="NodeID-6xtg1sSUmxr7Fgbgq6w6yKPdByaB1JJDE"
NODE3_ID="NodeID-TYAvdDZnyBV4ydpajDnjwtLtyV1fLknk"
NODE4_ID="NodeID-JnRuDpsMAKYyTadbGBHjkCjet2YzRBRMQ"
# K8s DNS hostnames for internal pod-to-pod communication
# Format: <pod-name>.<headless-service>.<namespace>.svc.cluster.local
NS="lux-mainnet"
SVC="luxd-headless"
NODE0_HOST="luxd-0.${SVC}.${NS}.svc.cluster.local"
NODE1_HOST="luxd-1.${SVC}.${NS}.svc.cluster.local"
NODE2_HOST="luxd-2.${SVC}.${NS}.svc.cluster.local"
NODE3_HOST="luxd-3.${SVC}.${NS}.svc.cluster.local"
NODE4_HOST="luxd-4.${SVC}.${NS}.svc.cluster.local"
# External LoadBalancer IPs (for public-ip advertisement)
NODE0_IP="134.199.142.217"
NODE1_IP="24.199.76.196"
NODE2_IP="134.199.142.225"
NODE3_IP="24.144.70.169"
NODE4_IP="143.244.211.104"
# Set bootstrap config based on pod name - exclude self from bootstrap
# Using K8s DNS hostnames for bootstrap (internal cluster communication)
case "$HOSTNAME" in
luxd-0)
PUBLIC_IP="$NODE0_IP"
BOOTSTRAP_IPS="${NODE1_HOST}:9631,${NODE2_HOST}:9631,${NODE3_HOST}:9631,${NODE4_HOST}:9631"
BOOTSTRAP_IDS="$NODE1_ID,$NODE2_ID,$NODE3_ID,$NODE4_ID"
;;
luxd-1)
PUBLIC_IP="$NODE1_IP"
BOOTSTRAP_IPS="${NODE0_HOST}:9631,${NODE2_HOST}:9631,${NODE3_HOST}:9631,${NODE4_HOST}:9631"
BOOTSTRAP_IDS="$NODE0_ID,$NODE2_ID,$NODE3_ID,$NODE4_ID"
;;
luxd-2)
PUBLIC_IP="$NODE2_IP"
BOOTSTRAP_IPS="${NODE0_HOST}:9631,${NODE1_HOST}:9631,${NODE3_HOST}:9631,${NODE4_HOST}:9631"
BOOTSTRAP_IDS="$NODE0_ID,$NODE1_ID,$NODE3_ID,$NODE4_ID"
;;
luxd-3)
PUBLIC_IP="$NODE3_IP"
BOOTSTRAP_IPS="${NODE0_HOST}:9631,${NODE1_HOST}:9631,${NODE2_HOST}:9631,${NODE4_HOST}:9631"
BOOTSTRAP_IDS="$NODE0_ID,$NODE1_ID,$NODE2_ID,$NODE4_ID"
;;
luxd-4)
PUBLIC_IP="$NODE4_IP"
BOOTSTRAP_IPS="${NODE0_HOST}:9631,${NODE1_HOST}:9631,${NODE2_HOST}:9631,${NODE3_HOST}:9631"
BOOTSTRAP_IDS="$NODE0_ID,$NODE1_ID,$NODE2_ID,$NODE3_ID"
;;
*)
echo "ERROR: Unknown hostname $HOSTNAME"
PUBLIC_IP=""
BOOTSTRAP_IPS=""
BOOTSTRAP_IDS=""
;;
esac
echo "================================================================================"
echo "Starting luxd for $HOSTNAME (mainnet - network-id=96369)"
echo "================================================================================"
echo " public-ip: $PUBLIC_IP"
echo " bootstrap-ips (hostnames): $BOOTSTRAP_IPS"
echo " bootstrap-ids: $BOOTSTRAP_IDS"
echo "================================================================================"
# Test DNS resolution before starting
echo "Testing DNS resolution..."
for host in $NODE0_HOST $NODE1_HOST $NODE2_HOST $NODE3_HOST $NODE4_HOST; do
if getent hosts "$host" >/dev/null 2>&1; then
echo " $host: OK"
else
echo " $host: FAILED (pod may not be running yet)"
fi
done
exec /luxd/build/luxd \
--network-id=96369 \
--http-host=0.0.0.0 \
--http-port=9630 \
--http-allowed-hosts=* \
--staking-port=9631 \
--data-dir=/data \
--genesis-file=/genesis/genesis.json \
--db-type=badgerdb \
--index-enabled=true \
--api-admin-enabled=true \
--api-metrics-enabled=true \
--log-level=info \
--plugin-dir=/data/plugins \
--staking-tls-cert-file=/data/staking/staker.crt \
--staking-tls-key-file=/data/staking/staker.key \
--staking-signer-key-file=/data/staking/signer.key \
--public-ip=$PUBLIC_IP \
--bootstrap-ips=$BOOTSTRAP_IPS \
--bootstrap-ids=$BOOTSTRAP_IDS \
--consensus-sample-size=3 \
--consensus-quorum-size=2 \
--network-allow-private-ips=true \
--network-require-validator-to-connect=false \
--sybil-protection-enabled=false
+15
View File
@@ -0,0 +1,15 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: lux-mainnet
resources:
- namespace.yaml
- services.yaml
- statefulset.yaml
- configmap.yaml
commonLabels:
app.kubernetes.io/name: luxd
app.kubernetes.io/instance: mainnet
app.kubernetes.io/component: validator
+7
View File
@@ -0,0 +1,7 @@
apiVersion: v1
kind: Namespace
metadata:
name: lux-mainnet
labels:
network: mainnet
app.kubernetes.io/name: luxd
+115
View File
@@ -0,0 +1,115 @@
# Headless service for StatefulSet DNS
apiVersion: v1
kind: Service
metadata:
name: luxd-headless
namespace: lux-mainnet
spec:
selector:
app: luxd
network: mainnet
ports:
- name: http
port: 9630
- name: staking
port: 9631
clusterIP: None
---
# Individual LoadBalancer services per pod for stable external IPs
# This is CRITICAL for P2P - each node needs its own public IP
apiVersion: v1
kind: Service
metadata:
name: luxd-0
namespace: lux-mainnet
annotations:
kubernetes.digitalocean.com/load-balancer-id: ""
spec:
type: LoadBalancer
selector:
app: luxd
network: mainnet
statefulset.kubernetes.io/pod-name: luxd-0
ports:
- name: http
port: 9630
targetPort: 9630
- name: staking
port: 9631
targetPort: 9631
---
apiVersion: v1
kind: Service
metadata:
name: luxd-1
namespace: lux-mainnet
spec:
type: LoadBalancer
selector:
app: luxd
network: mainnet
statefulset.kubernetes.io/pod-name: luxd-1
ports:
- name: http
port: 9630
targetPort: 9630
- name: staking
port: 9631
targetPort: 9631
---
apiVersion: v1
kind: Service
metadata:
name: luxd-2
namespace: lux-mainnet
spec:
type: LoadBalancer
selector:
app: luxd
network: mainnet
statefulset.kubernetes.io/pod-name: luxd-2
ports:
- name: http
port: 9630
targetPort: 9630
- name: staking
port: 9631
targetPort: 9631
---
apiVersion: v1
kind: Service
metadata:
name: luxd-3
namespace: lux-mainnet
spec:
type: LoadBalancer
selector:
app: luxd
network: mainnet
statefulset.kubernetes.io/pod-name: luxd-3
ports:
- name: http
port: 9630
targetPort: 9630
- name: staking
port: 9631
targetPort: 9631
---
apiVersion: v1
kind: Service
metadata:
name: luxd-4
namespace: lux-mainnet
spec:
type: LoadBalancer
selector:
app: luxd
network: mainnet
statefulset.kubernetes.io/pod-name: luxd-4
ports:
- name: http
port: 9630
targetPort: 9630
- name: staking
port: 9631
targetPort: 9631
+86
View File
@@ -0,0 +1,86 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: luxd
namespace: lux-mainnet
spec:
serviceName: luxd-headless
replicas: 5
selector:
matchLabels:
app: luxd
network: mainnet
template:
metadata:
labels:
app: luxd
network: mainnet
spec:
securityContext:
fsGroup: 1000
runAsUser: 1000
runAsNonRoot: true
containers:
- name: luxd
image: registry.digitalocean.com/hanzo/bootnode:luxd-latest
imagePullPolicy: Always
command: ["/startup.sh"]
ports:
- containerPort: 9630
name: http
- containerPort: 9631
name: staking
volumeMounts:
- name: data
mountPath: /data
- name: staking
mountPath: /data/staking
readOnly: true
- name: genesis
mountPath: /genesis
- name: startup
mountPath: /startup.sh
subPath: startup.sh
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "8Gi"
cpu: "4"
livenessProbe:
httpGet:
path: /ext/health
port: 9630
initialDelaySeconds: 120
periodSeconds: 30
failureThreshold: 5
readinessProbe:
httpGet:
path: /ext/info
port: 9630
initialDelaySeconds: 60
periodSeconds: 10
imagePullSecrets:
- name: registry-hanzo
volumes:
- name: staking
secret:
secretName: luxd-staking-keys
defaultMode: 0400
- name: genesis
configMap:
name: luxd-genesis
- name: startup
configMap:
name: luxd-startup
defaultMode: 0755
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: do-block-storage
resources:
requests:
storage: 100Gi