Files
explore/deploy/k8s/explorer/ingressroutes-testnet.yaml
zeekayandHanzo Dev a63372fdd7 fix(explore): explore.* is the frontend, api-explore.* is the API
The FE-host rule matched PathPrefix(`/v1/`) at priority 10000 and sent it
to the Go indexer, which owns no such path — so the frontend's OWN server
routes (/v1/pchain, /v1/config, /v1/csrf, /v1/proxy, /v1/tokens/*) were
answered by Go's plain-text "404 page not found". /v1/pchain is where the
validators page reads platform.getCurrentValidators, so the page rendered
0 validators / 0 LUX staked against a chain holding 5 validators and
2,500,000,000 LUX. Measured: POST /v1/pchain was 404 through the ingress
and 200 straight at the FE pod.

One concern per host now. The FE host keeps only /health and the brand
SVGs on the Go binary; everything else is the frontend.

On the API host the inverse: PathPrefix(`/v1/`) is served verbatim rather
than enumerating four of its prefixes, which had left the Blockscout stats
surface (/v1/counters, /v1/lines, /v1/pages/*) falling into the catch-all
and being rewritten to /v1/indexer/cchain/v1/counters -> 404.

Drops mainpage-rewrite: the Go binary serves /main-page/* verbatim, so
rewriting it to /homepage/* 404s the homepage widgets.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 14:16:08 -07:00

141 lines
6.7 KiB
YAML

---
# Lux Testnet
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-testnet
namespace: lux-testnet
labels: {app: lux-explorer, network: testnet}
spec:
entryPoints: [websecure]
tls: {certResolver: letsencrypt}
routes:
- kind: Rule
priority: 10000
match: (Host(`explore.lux-test.network`) || Host(`explorer.lux-test.network`) || Host(`explore-test.lux.network`)) && (Path(`/health`) || Path(`/envs.js`) || Path(`/icon.svg`) || Path(`/logo.svg`) || Path(`/icon-zoo.svg`) || Path(`/icon-lux.svg`) || Path(`/logo-zoo.svg`) || Path(`/logo-lux.svg`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`explore.lux-test.network`) || Host(`explorer.lux-test.network`) || Host(`explore-test.lux.network`)
services: [{name: explore-fe-lux, port: 80}]
- kind: Rule
match: (Host(`api-explore.lux-test.network`) || Host(`api-explorer.lux-test.network`) || Host(`api-explore-test.lux.network`)) && (PathPrefix(`/v1/`) || Path(`/health`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`api-explore.lux-test.network`) || Host(`api-explorer.lux-test.network`) || Host(`api-explore-test.lux.network`)
middlewares: [{name: blockscout-prefix-cchain}, {name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
---
# C-Chain Testnet (umbrella → lux FE)
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-cchain-testnet
namespace: lux-testnet
labels: {app: lux-explorer, chain: cchain, network: testnet}
spec:
entryPoints: [websecure]
tls: {certResolver: letsencrypt}
routes:
- kind: Rule
priority: 10000
match: (Host(`explore-cchain-test.lux.network`) || Host(`explore-c-test.lux.network`)) && (Path(`/health`) || Path(`/envs.js`) || Path(`/icon.svg`) || Path(`/logo.svg`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`explore-cchain-test.lux.network`) || Host(`explore-c-test.lux.network`)
services: [{name: explore-fe-lux, port: 80}]
- kind: Rule
match: (Host(`api-explore-cchain-test.lux.network`) || Host(`api-explore-c-test.lux.network`)) && (PathPrefix(`/v1/`) || Path(`/health`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`api-explore-cchain-test.lux.network`) || Host(`api-explore-c-test.lux.network`)
middlewares: [{name: blockscout-prefix-cchain}, {name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
---
# Hanzo Testnet
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-hanzo-testnet
namespace: lux-testnet
labels: {app: lux-explorer, chain: hanzo, network: testnet}
spec:
entryPoints: [websecure]
tls: {certResolver: letsencrypt}
routes:
- kind: Rule
priority: 10000
match: (Host(`explore-hanzo-test.lux.network`) || Host(`explore.hanzo-test.network`) || Host(`explorer.hanzo-test.network`)) && (Path(`/health`) || Path(`/envs.js`) || Path(`/icon.svg`) || Path(`/logo.svg`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`explore-hanzo-test.lux.network`) || Host(`explore.hanzo-test.network`) || Host(`explorer.hanzo-test.network`)
services: [{name: explore-fe-hanzo, port: 80}]
- kind: Rule
match: (Host(`api-explore-hanzo-test.lux.network`) || Host(`api-explore.hanzo-test.network`) || Host(`api-explorer.hanzo-test.network`)) && (PathPrefix(`/v1/`) || Path(`/health`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`api-explore-hanzo-test.lux.network`) || Host(`api-explore.hanzo-test.network`) || Host(`api-explorer.hanzo-test.network`)
middlewares: [{name: blockscout-prefix-hanzo}, {name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
---
# Zoo Testnet
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-zoo-testnet
namespace: lux-testnet
labels: {app: lux-explorer, chain: zoo, network: testnet}
spec:
entryPoints: [websecure]
tls: {certResolver: letsencrypt}
routes:
- kind: Rule
priority: 10000
match: (Host(`explore-zoo-test.lux.network`) || Host(`explore.zoo-test.network`) || Host(`explorer.zoo-test.network`) || Host(`explorer-zoo-test.lux.network`)) && (Path(`/health`) || Path(`/envs.js`) || Path(`/icon.svg`) || Path(`/logo.svg`) || Path(`/icon-zoo.svg`) || Path(`/logo-zoo.svg`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`explore-zoo-test.lux.network`) || Host(`explore.zoo-test.network`) || Host(`explorer.zoo-test.network`) || Host(`explorer-zoo-test.lux.network`)
services: [{name: explore-fe-zoo, port: 80}]
- kind: Rule
match: (Host(`api-explore-zoo-test.lux.network`) || Host(`api-explore.zoo-test.network`) || Host(`api-explorer.zoo-test.network`) || Host(`api-explorer-zoo-test.lux.network`)) && (PathPrefix(`/v1/`) || Path(`/health`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`api-explore-zoo-test.lux.network`) || Host(`api-explore.zoo-test.network`) || Host(`api-explorer.zoo-test.network`) || Host(`api-explorer-zoo-test.lux.network`)
middlewares: [{name: blockscout-prefix-zoo}, {name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
---
# Pars Testnet
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-pars-testnet
namespace: lux-testnet
labels: {app: lux-explorer, chain: pars, network: testnet}
spec:
entryPoints: [websecure]
tls: {certResolver: letsencrypt}
routes:
- kind: Rule
priority: 10000
match: (Host(`explore-pars-test.lux.network`) || Host(`explore.pars-test.network`)) && (Path(`/health`) || Path(`/envs.js`) || Path(`/icon.svg`) || Path(`/logo.svg`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`explore-pars-test.lux.network`) || Host(`explore.pars-test.network`)
services: [{name: explore-fe-pars, port: 80}]
- kind: Rule
match: (Host(`api-explore-pars-test.lux.network`) || Host(`api-explore.pars-test.network`)) && (PathPrefix(`/v1/`) || Path(`/health`))
middlewares: [{name: cors-allow-all}]
services: [{name: explorer, port: 8090}]
- kind: Rule
match: Host(`api-explore-pars-test.lux.network`) || Host(`api-explore.pars-test.network`)
middlewares: [{name: blockscout-prefix-pars}, {name: cors-allow-all}]
services: [{name: explorer, port: 8090}]