Files
zeekayandHanzo Dev 7417193940 A chain answers under one segment, and the fleet asks for it there
luxd moved chain APIs from /v1/bc/<alias> to /v1/chain/<alias> and deleted the
old prefix, and health moved onto typed ops at /v1/health/ops/*. Both landed in
node 1.36.181. Nothing here could move before that image existed, and the image
cannot roll out while the manifests still ask for addresses it no longer serves,
so the pin and the paths move in one commit.

What moved:
  image    1.36.171 -> 1.36.181, digest with it, on devnet/testnet/mainnet
  internal exchange-api, lux-hb2, rpc-tip-gate, the luxd startup script
  probes   /v1/health/liveness -> /v1/health/ops/liveness (bare /v1/health,
           which the local compose healthcheck used, no longer routes at all)
  public   the devnet and testnet gateway routes

Comments that RECORD an observation keep their original spelling: a note saying
/v1/bc/zoo/rpc returned 404 on a given date is a fact about that date, and
rewriting it would make the record false. Only live addresses moved.

1.36.181 also carries chains v1.7.38, so the deployed node has the zkvm
content-derived transaction identity.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-30 16:17:20 -07:00

97 lines
4.4 KiB
YAML

# zoo.exchange — hanzoai/spa serving the @zooai/exchange SPA bundle.
#
# DNS: zoo.exchange / www.zoo.exchange / exchange.zoo.network / trade.zoo.exchange
# → lux-k8s LB 134.199.138.27 → ingress → this Service.
#
# This overlay does NOT inherit from ../../base because the Zoo image is
# hanzoai/spa-architected (config.json templated from env), not the
# Uniswap-fork init-container sed pattern that the Lux brand uses.
apiVersion: apps/v1
kind: Deployment
metadata:
name: zoo-exchange
labels: { app: zoo-exchange, brand: zoo }
spec:
replicas: 2
selector:
matchLabels: { app: zoo-exchange }
strategy:
type: RollingUpdate
rollingUpdate: { maxSurge: 1, maxUnavailable: 0 }
template:
metadata:
labels: { app: zoo-exchange, brand: zoo }
spec:
imagePullSecrets:
- name: ghcr-zoo
containers:
- name: spa
image: ghcr.io/luxfi/exchange:5.149.66@sha256:1e2e1ca2526e2b4c66f14571d4ca50d432870eb65234888269bb90dc99580ab0
imagePullPolicy: Always
ports:
- { containerPort: 3000, name: http }
# Secrets sourced from KMS — single source of truth.
envFrom:
- secretRef: { name: zoo-exchange-secrets }
# Public, non-secret runtime config templated into /config.json on pod start.
env:
- { name: PORT, value: "3000" }
- { name: ROOT, value: /public }
- { name: SPA_BRAND_NAME, value: "Zoo Exchange" }
- { name: SPA_DEFAULT_CHAIN, value: "200200" }
- { name: SPA_RPC_HOST, value: "https://api.zoo.network" }
# Cross-chain RPC: each org answers on its OWN gateway at /v1/chain/C/rpc.
# Not api.zoo.exchange/<anything> — that host is a zoo-branded alias of
# the Lux mainnet gateway, it serves no org chain and sends no CORS
# headers, so a browser on zoo.exchange cannot read its responses.
- { name: SPA_RPC_HOST_LUX, value: "https://api.lux.network/v1/chain/C/rpc" }
- { name: SPA_RPC_HOST_HANZO, value: "https://api.hanzo.network/v1/chain/C/rpc" }
- { name: SPA_RPC_HOST_PARS, value: "https://api.pars.network/v1/chain/C/rpc" }
- { name: SPA_API_HOST, value: "https://api.zoo.exchange" }
- { name: SPA_GATEWAY_HOST, value: "https://api.zoo.exchange" }
# Zoo's identity ORIGIN is zoolabs.id — it serves the login SPA at / and
# the IAM API at /v1/iam, /oauth, /.well-known, and its discovery doc
# says issuer=https://zoolabs.id. Fetching discovery from the same origin
# as the issuer is what a strict OIDC client requires.
#
# Was https://iam.zoo.network: a host that never existed. No ingress, no
# router, no issuer-map entry — DNS pointed it at the lux-k8s LB, which
# answered with the Traefik default cert, so every IAM call from this SPA
# died at the TLS handshake. There is no iam.<brand> host in the design;
# iam.hanzo.ai is the one legacy IAM host (the shared Google/GitHub OAuth
# callback is registered against it) and every brand reaches IAM through
# its own id origin.
- { name: SPA_IAM_HOST, value: "https://zoolabs.id" }
- { name: SPA_ID_HOST, value: "https://zoolabs.id" }
- { name: SPA_KMS_HOST, value: "https://kms.zoo.network" }
- { name: SPA_INSIGHTS_HOST, value: "https://insights.hanzo.ai" }
# SPA_INSIGHTS_API_KEY arrives via envFrom (zoo-exchange-secrets).
readinessProbe:
httpGet: { path: /health, port: http }
initialDelaySeconds: 2
periodSeconds: 5
livenessProbe:
httpGet: { path: /health, port: http }
initialDelaySeconds: 10
periodSeconds: 10
resources:
requests: { cpu: "50m", memory: "64Mi" }
limits: { cpu: "500m", memory: "256Mi" }
volumeMounts:
- { name: brand, mountPath: /public/brand.json, subPath: brand.json }
- { name: brand, mountPath: /public/logo.svg, subPath: logo.svg }
volumes:
- name: brand
configMap: { name: zoo-exchange-brand }
---
apiVersion: v1
kind: Service
metadata:
name: zoo-exchange
labels: { app: zoo-exchange, brand: zoo }
spec:
type: ClusterIP
selector: { app: zoo-exchange }
ports:
- { name: http, port: 3000, targetPort: http, protocol: TCP }