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
150 lines
4.9 KiB
YAML
150 lines
4.9 KiB
YAML
# The RUNTIME environment, and only that. luxfi/explore's .env.example.lux
|
|
# mixes build-time and runtime variables in one file -- NEXT_PUBLIC_BRAND is
|
|
# read by `pnpm build`, and the branding, marketplace and homepage URLs were
|
|
# dropped from the image -- so feeding that file to the container fails the
|
|
# validator outright. These are the variables v2.8.1-lux accepts.
|
|
cd:
|
|
automated: false
|
|
replicas: 1
|
|
selectorLabels:
|
|
app: explore-fe
|
|
brand: lux
|
|
network: mainnet
|
|
containerName: explore
|
|
image:
|
|
repository: ghcr.io/luxfi/explore
|
|
# v2.8.5-lux. This is the deployment that SERVES explore.lux.network — the
|
|
# ingress points at explorer:80, and the Go explorer proxies the brand host
|
|
# here. The `explore` sidecar inside the explorer pod is NOT the one on the
|
|
# page; bumping it changed nothing visible, which is how this was found.
|
|
#
|
|
# Moved by hand this once because the release fanout did not move it: the
|
|
# v2.8.1-lux fanout job reported success (it copies the image per org) and left
|
|
# every pin at v1.1.30. The hazard this file warns about is a pin BELOW what is
|
|
# running, which applies itself as a rollback; this is the opposite, forward to
|
|
# an image proven pullable in-cluster.
|
|
tag: v2.8.5-lux
|
|
digest: sha256:4f9d6435eb819262375a4e0903903127ddb6becd435e73b25b7d97277e9b868c
|
|
pullPolicy: IfNotPresent
|
|
labels:
|
|
brand: lux
|
|
network: mainnet
|
|
env:
|
|
- name: PORT
|
|
value: '3000'
|
|
envFrom:
|
|
- configMapRef:
|
|
name: explore-env-lux
|
|
resources:
|
|
limits:
|
|
cpu: '1'
|
|
memory: 2Gi
|
|
requests:
|
|
cpu: 100m
|
|
memory: 256Mi
|
|
livenessProbe:
|
|
failureThreshold: 5
|
|
httpGet:
|
|
path: /
|
|
port: ui
|
|
scheme: HTTP
|
|
initialDelaySeconds: 90
|
|
periodSeconds: 60
|
|
successThreshold: 1
|
|
timeoutSeconds: 10
|
|
readinessProbe:
|
|
failureThreshold: 6
|
|
httpGet:
|
|
path: /
|
|
port: ui
|
|
scheme: HTTP
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 15
|
|
successThreshold: 1
|
|
timeoutSeconds: 10
|
|
startupProbe:
|
|
failureThreshold: 30
|
|
httpGet:
|
|
path: /
|
|
port: ui
|
|
scheme: HTTP
|
|
initialDelaySeconds: 15
|
|
periodSeconds: 10
|
|
successThreshold: 1
|
|
timeoutSeconds: 10
|
|
ports:
|
|
- containerPort: 3000
|
|
name: ui
|
|
servicePort: 80
|
|
# The public build config, declared here rather than hand-applied.
|
|
configMaps:
|
|
- name: explore-env-lux
|
|
data:
|
|
NEXT_PUBLIC_API_BASE_PATH: "/v1/indexer/cchain"
|
|
NEXT_PUBLIC_API_HOST: "api-explore.lux.network"
|
|
NEXT_PUBLIC_API_PROTOCOL: "https"
|
|
NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL: "wss"
|
|
NEXT_PUBLIC_APP_HOST: "explore.lux.network"
|
|
NEXT_PUBLIC_APP_PROTOCOL: "https"
|
|
NEXT_PUBLIC_IS_TESTNET: "false"
|
|
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: "18"
|
|
NEXT_PUBLIC_NETWORK_CURRENCY_NAME: "LUX"
|
|
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: "LUX"
|
|
NEXT_PUBLIC_NETWORK_ID: "96369"
|
|
NEXT_PUBLIC_NETWORK_NAME: "Lux Network"
|
|
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.lux.network/v1/chain/c/rpc"
|
|
NEXT_PUBLIC_NETWORK_SHORT_NAME: "LUX"
|
|
nodeSelector:
|
|
kubernetes.io/arch: amd64
|
|
imagePullSecrets:
|
|
- name: ghcr-luxfi
|
|
# One replica: a rollout keeps it serving until the new pod is Ready.
|
|
rollingUpdate:
|
|
maxSurge: 1
|
|
maxUnavailable: 0
|
|
topologySpread:
|
|
enabled: false
|
|
lifecycle: null
|
|
terminationGracePeriodSeconds: 30
|
|
configMaps:
|
|
- name: explore-env-lux
|
|
data:
|
|
NEXT_PUBLIC_NETWORK_NAME: Lux Network
|
|
NEXT_PUBLIC_NETWORK_SHORT_NAME: LUX
|
|
NEXT_PUBLIC_NETWORK_ID: '96369'
|
|
NEXT_PUBLIC_NETWORK_CURRENCY_NAME: LUX
|
|
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: LUX
|
|
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: '18'
|
|
NEXT_PUBLIC_NETWORK_RPC_URL: https://api.lux.network/v1/chain/c/rpc
|
|
NEXT_PUBLIC_API_HOST: api-explore.lux.network
|
|
NEXT_PUBLIC_API_PROTOCOL: https
|
|
# The Blockscout-shaped API this UI reads is mounted per chain at
|
|
# /v1/indexer/<slug>. With "/" the page asks api-explore.lux.network for
|
|
# /stats, /main-page/blocks and /config/backend-version, all of which 404,
|
|
# so every card stays a skeleton that never resolves while the same paths
|
|
# under this prefix answer 200.
|
|
NEXT_PUBLIC_API_BASE_PATH: /v1/indexer/cchain
|
|
NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL: wss
|
|
NEXT_PUBLIC_APP_HOST: explore.lux.network
|
|
NEXT_PUBLIC_APP_PROTOCOL: https
|
|
NEXT_PUBLIC_IS_TESTNET: 'false'
|
|
|
|
# The hosts this brand answers on. Without this the Deployment runs and nothing
|
|
# can reach it: every explore.* host resolves to Cloudflare and Cloudflare hands
|
|
# the request to an ingress with no router that matches, which is the 404 these
|
|
# five have been serving. The set is the one k8s/lux-mainnet/ingress-chains.yaml
|
|
# carried by hand, minus explore.spc.network, which does not resolve.
|
|
routes:
|
|
- name: explore-lux
|
|
spec:
|
|
entryPoints: [websecure]
|
|
routes:
|
|
- match: Host(`explore.lux.network`) || Host(`explore.lux.cloud`)
|
|
kind: Rule
|
|
services:
|
|
# The Service publishes ui:80 -> 3000; a router that names 3000 is
|
|
# answered with `service port not found: 3000` and the host 404s.
|
|
- name: explore-fe-lux
|
|
port: 80
|
|
tls: {}
|