mirror of
https://github.com/luxfi/node.git
synced 2026-07-27 03:39:39 +00:00
clean: squash history (binaries stripped via filter-repo)
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,7 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: lux-mainnet
|
||||
labels:
|
||||
network: mainnet
|
||||
app.kubernetes.io/name: luxd
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user