Files
zeekayandHanzo AI 0412e26125
CI/CD / render (push) Waiting to run
Serve the Zoo sites from files, not from pods
zoo.vote and zoo.industries are static bundles a pod was re-serving on every
request. Both move to the site plane: the `public/` tree of the image digest
each Deployment ran is synced to s3://hanzo-sites/zoo/vote and
s3://hanzo-sites/zoo/industries, and each file now declares the Middleware that
reads the prefix together with the route that names it. zoo-industries' server
generated /public/config.json at boot from three SPA_* variables; the plane has
no boot, so that file travels in the prefix carrying the values the pod served.

zoo-ngo is deleted rather than converted. zoo.ngo and www.zoo.ngo already route
to s3://hanzo-sites/zoo/ngo, and that prefix holds a newer build than the pod
was serving to nobody -- no route in this namespace named it. A site declared
twice is a site that goes stale in one of them.

Co-authored-by: Hanzo AI <[email protected]>
2026-09-08 15:02:38 -07:00

50 lines
1.7 KiB
YAML

# zoo.industries is files: one Middleware that serves them, one route that names
# it, and the endpoint-less Service the route schema requires. No image, so the
# chart renders no Deployment -- a static site is not a pod.
#
# The objects are the `public/` tree of
# ghcr.io/zooai/zoo-industries@sha256:7546cebac2b23f3131ca3b888c42db9c55f5e2b66b69bf0a9263dce1445dc26c,
# the digest the Deployment ran, plus one file it used to generate. That server
# wrote /public/config.json at boot from SPA_API_HOST, SPA_IAM_HOST and SPA_ENV;
# the plane has no boot, so the same three values travel as an object in the
# prefix, byte-for-byte what the running pod served:
#
# {"apiHost":"https://api.zoo.ngo","env":"prod","iamHost":"https://zoo.id","v":1}
#
# A rebuild ships by syncing `public/` to this prefix and keeping that file.
#
# The Deployment carried no route at all, so nothing has reached this bundle from
# inside the cluster. The route below is the first one.
cd:
automated: true
ports:
- name: http
containerPort: 80
middlewares:
- name: industries
spec:
staticFiles:
root: s3://hanzo-sites/zoo/industries
# Next `output: export` writes real HTML per route -- 56 files, one each
# for /about, /capabilities and the rest. A fallback would answer
# 200-with-the-homepage for a missing chunk, which reads exactly like a
# good visit, so a miss stays a miss.
spaMode: false
indexFiles:
- index.html
routes:
- name: industries
spec:
entryPoints:
- websecure
routes:
- match: Host(`zoo.industries`) || Host(`www.zoo.industries`)
kind: Rule
priority: 100
middlewares:
- name: industries
services:
- name: zoo-industries
port: 80
tls: {}