Record the edge the chains are actually served through

The Spark reboot put the chain RPC and explorer behind a Cloudflare tunnel, and nothing in the tree said so. Also route npm through our own package host.
This commit is contained in:
2026-09-03 11:13:16 -07:00
parent 8f397285e1
commit 11b0c97116
3 changed files with 178 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
registry=https://pkg.hanzo.ai/
+84
View File
@@ -0,0 +1,84 @@
# ingress.yaml — public hostname -> local origin for the Spark reboot.
#
# DO is gone. The Lux and Zoo chain surfaces are served from luxd processes on
# the Spark box and reached through a Cloudflare tunnel, so there is no public
# IP and nothing open on the firewall.
#
# These rows are the tunnel's ingress list. cloudflared MATCHES on `path` and
# passes it through unchanged — it cannot rewrite — so each origin serves the
# final public path itself. That is why the chain rows carry no rewrite: luxd
# already mounts chain RPC at /v1/chain/<alias>/rpc (server/http/server.go
# baseURL="/v1", chains/manager.go ChainAliasPrefix="chain"). The /ext prefix
# is gone upstream; nothing here reintroduces it.
#
# Chain state came from canonical RLP in luxfi/state, verified by comparing the
# booted block 0 hash against the hash in the RLP itself — see LLM.md.
#
# HOSTNAMES ARE SINGLE-LABEL, and that is not a style choice. Cloudflare's
# universal certificate for this zone covers exactly:
#
# DNS:lux.network, DNS:*.lux.network
#
# One label. A two-label name like testnet.api.lux.network matches no SAN, so
# TLS fails at the edge in ~40ms and the request never reaches a tunnel rule —
# it looks like a routing or origin fault and is neither. Hence api-testnet,
# not testnet.api. The zone already reads this way (api-exchange, api-bridge,
# api-explore-hanzo-test), so this is the existing convention, not a new one.
# zoo.network carries the same single-label wildcard and the same rule.
#
# The node must also bind 0.0.0.0: cloudflared reaches an origin over the host
# network, and --http-allowed-hosts stays the real access control. UFW keeps
# the wider bind off the public internet, though it does allow 10.0.0.0/8, and
# the allow-list accepts any request whose Host is a bare IP — so a bound port
# is LAN-readable by design. That is fine for read RPC and was NOT fine while
# admin_importChain was still mounted; see LLM.md.
tunnel: lux-dchain
id: 682f3c05-bce2-4bfd-a657-41fe4644c54c
cname: 682f3c05-bce2-4bfd-a657-41fe4644c54c.cfargotunnel.com
ingress:
# ── Lux chain RPC ────────────────────────────────────────────────
- hostname: api.lux.network
path: ^/v1/chain
service: http://127.0.0.1:9630
note: luxd network 96369, C-chain chainId 96369
- hostname: api-testnet.lux.network
path: ^/v1/chain
service: http://127.0.0.1:9640
note: luxd network 96368, C-chain chainId 96368 — LIVE
# ── Explorer — ONE binary, branded per hostname ──────────────────
- hostname: explorer.lux.network
service: http://127.0.0.1:8090
# ── D-Chain venue (already live, unchanged) ──────────────────────
- hostname: dchain.lux.network
service: http://127.0.0.1:9610
- service: http_status:404
# ── Zoo ───────────────────────────────────────────────────────────
# Zoo is a separate org with its own registry and its own brand. It gets its
# own tunnel rather than riding the Lux one; the rows below are that tunnel's
# ingress, pending its creation by the operator who holds the Cloudflare key.
zoo:
tunnel: zoo-local
id: null # operator creates; fill in the uuid and its cfargotunnel.com cname
ingress:
- hostname: api.zoo.network
path: ^/v1/chain
service: http://127.0.0.1:9650
note: luxd network 200200, EVM chainId 200200
- hostname: api-testnet.zoo.network
path: ^/v1/chain
service: http://127.0.0.1:9660
note: luxd network 200201, EVM chainId 200201
- hostname: explorer.zoo.network
service: http://127.0.0.1:8090
note: same explorer binary; brand is chosen per chain in chains.yaml
- service: http_status:404
+93
View File
@@ -0,0 +1,93 @@
# chains.yaml — the config the running explorer actually uses on Spark.
#
# This is luxfi/explorer, ONE Go binary serving every chain from a per-chain
# SQLite file and branding per chain, so explorer.lux.network and
# explorer.zoo.network are the same origin. It is NOT the Next.js frontend
# configured in k8s/lux-explorer/configmap-chains.yaml — that is the older
# DO-era stack, and its RPC URLs still carry the dead /ext/bc/<id>/rpc form.
#
# RPC endpoints are /v1/chain/<alias>/rpc against the local luxd fleet.
# Paths below are Spark-local; the file is tracked so the running explorer is
# reproducible rather than surviving only in an untracked build directory.
#
# Note the explorer does NOT expand ${VAR:-default}; a literal URL is required
# or the chain is silently skipped at startup ("rpc required for chain").
data_dir: /home/z/lux-build/explorer/data
http_addr: :8090
brand_default:
name: Lux Explorer
coin: LUX
accent_color: "#5cf"
icon_url: /icon.svg
logo_url: /logo.svg
networks:
- label: Mainnet
domain: explorer.lux.network
chain_id: 96369
- label: Testnet
domain: testnet.explorer.lux.network
chain_id: 96368
chains:
- slug: cchain
name: Lux C-Chain
chain_id: 96369
type: evm
rpc: http://127.0.0.1:9630/v1/chain/C/rpc
coin: LUX
enabled: true
default: true
indexer: { poll_interval: 10s }
graph:
enabled: true
subgraphs:
- { name: amm, schema: amm, enabled: true }
brand:
name: Lux C-Chain
coin: LUX
accent_color: "#5cf"
- slug: cchain-testnet
name: Lux C-Chain Testnet
chain_id: 96368
type: evm
rpc: http://127.0.0.1:9640/v1/chain/C/rpc
coin: LUX
enabled: true
indexer: { poll_interval: 30s }
brand:
name: Lux C-Chain Testnet
coin: LUX
accent_color: "#5cf"
- slug: zoo
name: Zoo
chain_id: 200200
type: evm
rpc: http://127.0.0.1:9650/v1/chain/C/rpc
coin: ZOO
enabled: true
indexer: { poll_interval: 10s }
graph:
enabled: true
subgraphs:
- { name: amm, schema: amm, enabled: true }
brand:
name: Zoo
coin: ZOO
accent_color: "#7c3aed"
- slug: zoo-testnet
name: Zoo Testnet
chain_id: 200201
type: evm
rpc: http://127.0.0.1:9660/v1/chain/C/rpc
coin: ZOO
enabled: true
indexer: { poll_interval: 30s }
brand:
name: Zoo Testnet
coin: ZOO
accent_color: "#7c3aed"