Files
universe/k8s/lux-devnet/api-gateway-gateway-config.yaml
zeekay 51460827d4 Merge the forge's lux/universe into GitHub's, the one main from here
The two mains shared no history, so this is a per-file three-way merge:
for each file the 65 forge-only commits touched (by patch-id), the base is
the newest version both histories held. 105 files merged or took one side
cleanly, 48 were already identical, and the 45 true conflicts and 31
modify/delete pairs were resolved by what runs on the cluster:

- The forge wins where it is live: explorer 1.5.56 (digest 45db11ff) and
  its archive readers, explore-fe-hanzo's ConfigMap env (AI coin,
  /v1/indexer/hanzo, /v1/chain/hanzo/rpc), exchange-api reading
  luxd-archive, and explore-fe-{lux,zoo}-testnet, pinned to what they run
  (v2.8.5-lux / v2.8.4-lux).
- GitHub wins where it is live: explore-fe-lux v2.8.5-lux, explore-fe-zoo
  v2.8.4-lux, bankd v1.0.18, lux-build's routes.
- The forge's retirement of workloads that run nowhere stands: lux-mainnet
  dex, lux-hb2, lux-market, traffic, wallet-web; the lux-testnet frontends,
  indexer, exchange and gateways; lux-operator. deploy/lux-testnet/luxd.yaml
  stays, since roll_luxd.sh reads it.
- GitHub's deletions stand: lux-finance and lux-financial (static sites
  now), the k8s/ operator manifests, .hanzo/workflows/cicd.yml.
- Paths are /v1/chain/C/rpc where the forge had written /v1/chain/c. All
  four spellings answer; this one is the documented form. The forge's
  /{network}/v1 doc lines are dropped: a network is a host, and the prefix
  404s.

Dry-run against the running objects (server-side, as CD applies), the
merged explorer shows no change where GitHub's showed 152 lines, and no
other live workload moves further from what runs. Every deploy/*/*.yaml
renders with charts/app; price.yaml, which failed on GitHub, now renders.

Claude-Session: https://claude.ai/code/session_01TzirYkGmD88w4GipqivUtV
2026-09-23 20:20:03 -07:00

683 lines
18 KiB
YAML

# Gateway config for api.lux-dev.network (hanzoai/gateway / KrakenD) in lux-devnet.
#
# The public surface is /v1 only (/v1/chain/C/rpc, /v1/chain/P, /v1/chain/X, /v1/info,
# /v1/health, per-L1 /v1/chain/<chain>/rpc). The legacy /ext/* aliases are gone:
# each was a duplicate of the /v1 route it sat next to, and /v1/info — the one
# with no /v1 twin — was renamed rather than dropped, so no surface was lost.
#
# Backend url_patterns are /v1/* too. luxd serves /v1 alone (luxfi/node
# server/http/server.go, baseURL = "/v1"), so an /ext/* url_pattern is a live
# 404: that is what made /v1/health 404 through this gateway while the
# identical call against the pod returned 200.
#
# Backend host is svc/luxd, never svc/luxd-headless: the headless service sets
# publishNotReadyAddresses, so its DNS answer includes luxd pods whose C-Chain
# has not initialised. Serving public RPC off it fails a share of requests equal
# to the not-ready share of the fleet. svc/luxd carries ready endpoints only.
#
# This file is the real config (not a placeholder): keep it in sync with the live
# CM. To pull the live config:
# kubectl --context=lux-k8s -n lux-devnet get cm \
# api-gateway-gateway-config -o jsonpath='{.data.gateway\.json}' > gateway.json
apiVersion: v1
data:
gateway.json: |
{
"$schema": "https://www.krakend.io/schema/v2.7/krakend.json",
"cache_ttl": "0s",
"endpoints": [
{
"endpoint": "/v1/info",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/info",
"timeout": "300s"
}
]
},
{
"endpoint": "/api/indexer/indexer-c",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain"
}
]
},
{
"endpoint": "/api/indexer/indexer-c/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain"
}
]
},
{
"endpoint": "/api/indexer/indexer-c/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain/{r1}"
}
]
},
{
"endpoint": "/api/indexer/indexer-c/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain/{r1}/{r2}"
}
]
},
{
"endpoint": "/api/indexer/indexer-c/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/api/indexer/indexer-hanzo",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo"
}
]
},
{
"endpoint": "/api/indexer/indexer-hanzo/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo"
}
]
},
{
"endpoint": "/api/indexer/indexer-hanzo/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo/{r1}"
}
]
},
{
"endpoint": "/api/indexer/indexer-hanzo/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo/{r1}/{r2}"
}
]
},
{
"endpoint": "/api/indexer/indexer-hanzo/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/api/indexer/indexer-zoo",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo"
}
]
},
{
"endpoint": "/api/indexer/indexer-zoo/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo"
}
]
},
{
"endpoint": "/api/indexer/indexer-zoo/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo/{r1}"
}
]
},
{
"endpoint": "/api/indexer/indexer-zoo/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo/{r1}/{r2}"
}
]
},
{
"endpoint": "/api/indexer/indexer-zoo/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/api/indexer/indexer-pars",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/pars"
}
]
},
{
"endpoint": "/api/indexer/indexer-pars/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/pars"
}
]
},
{
"endpoint": "/api/indexer/indexer-pars/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/pars/{r1}"
}
]
},
{
"endpoint": "/api/indexer/indexer-pars/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/pars/{r1}/{r2}"
}
]
},
{
"endpoint": "/api/indexer/indexer-pars/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/pars/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/api/indexer/indexer-spc",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/spc"
}
]
},
{
"endpoint": "/api/indexer/indexer-spc/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/spc"
}
]
},
{
"endpoint": "/api/indexer/indexer-spc/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/spc/{r1}"
}
]
},
{
"endpoint": "/api/indexer/indexer-spc/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/spc/{r1}/{r2}"
}
]
},
{
"endpoint": "/api/indexer/indexer-spc/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-devnet.svc:80"
],
"url_pattern": "/v1/indexer/spc/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/v1/P",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/P",
"timeout": "300s"
}
]
},
{
"endpoint": "/v1/X",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/X",
"timeout": "300s"
}
]
},
{
"endpoint": "/v1/health",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/health",
"timeout": "300s"
}
]
},
{
"endpoint": "/v1/health/ops/liveness",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/health/ops/liveness",
"timeout": "300s"
}
]
},
{
"endpoint": "/v1/chain/{chain}",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/{chain}",
"timeout": "300s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"capacity": 200,
"max_rate": 100
}
}
},
{
"endpoint": "/v1/chain/{chain}",
"method": "GET",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/{chain}",
"timeout": "300s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"capacity": 200,
"max_rate": 100
}
}
},
{
"endpoint": "/v1/chain/{chain}/{p1}",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/{chain}/{p1}",
"timeout": "300s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"capacity": 200,
"max_rate": 100
}
}
},
{
"endpoint": "/v1/chain/{chain}/{p1}",
"method": "GET",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/{chain}/{p1}",
"timeout": "300s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"capacity": 200,
"max_rate": 100
}
}
},
{
"endpoint": "/v1/chain/{chain}/{p1}/{p2}",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/{chain}/{p1}/{p2}",
"timeout": "300s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"capacity": 200,
"max_rate": 100
}
}
},
{
"endpoint": "/v1/chain/{chain}/{p1}/{p2}",
"method": "GET",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/{chain}/{p1}/{p2}",
"timeout": "300s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"capacity": 200,
"max_rate": 100
}
}
}
],
"extra_config": {
"security/cors": {
"allow_headers": [
"Content-Type",
"Authorization"
],
"allow_methods": [
"GET",
"POST",
"OPTIONS"
],
"allow_origins": [
"*"
],
"expose_headers": [
"Content-Length"
],
"max_age": "12h"
}
},
"name": "Lux Gateway - api.lux-dev.network",
"port": 8080,
"timeout": "300s",
"version": 3
}
kind: ConfigMap
metadata:
name: api-gateway-gateway-config
namespace: lux-devnet