Commit Graph
105 Commits
Author SHA1 Message Date
zeekay d4e503f8a7 deps: bump nested go.mod Go to 1.26.4
Workspace-wide sync. luxfi/node already shipped on 1.26.4 in v1.30.6
(commit 121aca1fa9); nested module catch-up.
2026-06-07 12:41:37 -07:00
zeekay 1fd1081d5c charts/lux: kill etnaTimestamp — quasarTimestamp canonical
Strips etnaTimestamp from both top-level networkUpgrades/upgradeConfig
and the embedded cChainGenesis config blob in all three envs
(mainnet, testnet, devnet). Required for compatibility with
luxfi/evm v0.19.0 which enforces DisallowUnknownFields and has
renamed Etna -> Quasar.
2026-06-07 12:41:37 -07:00
zeekay b52fa408a8 infra: delete dead DO App Platform manifests
Per universe-wide policy, hanzo workloads ship on DOKS only. DO App Platform
was decommissioned February 2026 — all hanzo-apps/hanzo-platform/operator
specs here have been superseded by infra/k8s/. Removing the stale specs to
keep the only-one-way invariant.
2026-06-07 12:41:37 -07:00
zeekay 59bd643328 dockerfile: scratch runtime for api-go, drop gcr.io
Switch from gcr.io/distroless/static-debian12:nonroot to FROM scratch.
CA certs, tzdata, /etc/passwd and /etc/group (nonroot uid/gid 65532)
are copied from the build stage.
2026-06-07 12:41:37 -07:00
zeekay b2af6aff33 feat(brand): scaffold @bootnode-io/brand npm package
Matches the canonical brand-package shape (parallel to @hanzo/brand,
@luxfi/brand, @zooai/brand, @osage/brand, etc.):

- package.json — name @bootnode-io/brand, version 0.1.0, public,
  exports ./, ./brand.json, ./loader, ./assets/*
- brand.json — canonical schema (brand, chains, iam, rpc,
  walletConnect, api blocks)
- src/index.ts + src/loader.ts — TS source compiled to dist/ via tsup
  (cjs+esm+dts)
- tsconfig.json — ES2020 + bundler resolution
- .npmignore — ship dist/, assets/, brand.json only

Existing config.ts + components.tsx + DESIGN.md preserved.

Publish (when npm @bootnode-io scope is reserved + creds available):
  cd brand && npm publish --access public
2026-05-19 08:56:13 -07:00
zeekayandGitHub ba01d2e29e feat: Go rewrite scaffold — ZAP-first, Mount() per HIP-0106 (#1)
Adds a Go subsystem alongside the existing Python FastAPI service so
bootnode can fold into `superbase` per HIP-0106. The Python service in
`api/bootnode/` stays untouched.

What landed:

- `schema/bootnode.zap` — public typed surface (chains, RPC, tokens,
  NFTs, transfers, smart wallets, ERC-4337, gas, webhooks, fleets,
  nodes, usage). No `.capnp` anywhere — ZAP only, per brand policy.
- `zap/gen/` — hand-rolled Go bindings that match what `zapc generate`
  emits, so `go build` works without zapc installed locally.
- `api/mount.go` — the HIP-0106 contract:
    func Mount(r chi.Router, deps Deps) error
  mounts every FastAPI-parity route group through `api/handlers/`.
- `api/deps.go` — cross-subsystem ZAP client interfaces (IAM, KMS,
  Base, O11y, Commerce). No business logic, no hard imports — keeps
  the Bootnode module independent of sibling subsystems until they
  ship their typed clients.
- `api/handlers/` — 149 chi routes mounted (Python has 150). Each
  handler body is a 501 stub with a `TODO(bootnode-port)` pointing at
  the Python file + symbol to port.
- `api/middleware/` — IAM-backed auth, OTEL-friendly telemetry,
  per-org rate limit (stub).
- `api/store/` — per-tenant SQLite access via `deps.Base.Open(orgID,
  "bootnode")` per HIP-0302.
- `api/web3/` — chain registry + RPC pool surface (production version
  prefers luxfi/* over upstream go-ethereum).
- `cmd/bootnode/main.go` — standalone shim; same `api.Mount` superbase
  calls in production.
- `docs/PYTHON_TO_GO_PORT.md` — endpoint-by-endpoint port map.

Build: `go build ./...` and `go vet ./...` clean. Standalone shim
smokes 200 on /health, /ready, /v1/chains; 401 on auth-required
endpoints with no JWT; 501 on every TODO route.

Out of scope (not in this commit):
- Handler bodies (Phase 2 — porting in RPC → tokens → NFTs → ...
  priority order).
- superbase wiring (lands when the superbase repo opens its main).
- Python service removal (stays until handlers reach prod parity).
2026-05-18 23:36:46 -07:00
zeekay 41a22e0f5e api-go/client: declare canonical Bootnode interface 2026-05-13 02:08:16 -07:00
zeekay 06270f76c5 api-go: Go port scaffold (foundation + auth + chains + projects + wallets)
Lays down the Go skeleton parallel to api/ (FastAPI). Foundation:
  - config: env-driven Settings
  - db: pgx pool + idempotent schema migrations + typed row structs
  - iam: HS256 JWT Verifier + bearer-auth middleware
  - api: chi router with /healthz + /readyz + versioned /v1 mount

Routes ported:
  - /auth: login + signup + refresh (bcrypt + JWT)
  - /chains: registry + status
  - /projects: full CRUD scoped by org
  - /wallets: list + create scoped by project+org

Stubs (route wired, handler returns 501):
  - /api-keys, /webhooks, /rpc, /tokens, /nfts

cmd/bootnode/main.go is the production entrypoint with graceful
shutdown (SIGINT/SIGTERM) and slog JSON logging. Dockerfile builds a
distroless image with CGO disabled.

Remaining surface to port (in order of priority): rpc upstream
dispatcher, api-keys CRUD + auth, tokens + nfts read-only, webhooks
delivery worker, fleet + node + cluster routes, bundler + gas, billing.
The Python service in api/ keeps running until parity ships.
2026-05-13 02:00:07 -07:00
zeekay 6ca448543f ci: add id-token: write to caller permissions
Required for hanzoai/.github/.github/workflows/docker-build.yml@main —
without it the workflow_call dies as startup_failure with no jobs
dispatched. Caller permissions are a CEILING.
2026-05-07 09:09:27 -07:00
zeekay 0687420325 deploy: pin :latest → semver across image refs
Replaces all ghcr.io/hanzoai/<svc>:latest pins with the latest published
semver tag for each service. Per CLAUDE.md auto-bump policy: mutable
branch tags (:latest, :main, :dev) are deprecated for cluster pins —
only immutable semver permitted.

Bulk update across services with published v* tags. Services without a
published semver remain on :latest until their release pipeline cuts a
v* tag.
2026-05-07 08:34:59 -07:00
zeekay a14d73f4dd fix(brand): RootLayout brand also detected from Host header
generateMetadata() already used the host header, but RootLayout itself
read only process.env.BRAND with a hard-coded "bootnode" fallback. That
made the body theme/SSR brand drift from the metadata brand on per-host
deploys. Make RootLayout async and reuse the host detection so both
paths agree.
2026-05-01 20:29:24 -07:00
zeekay d18390449c ci: push web image under bootnode package with -web tag suffix
GHCR 403s on first-push package creation for ghcr.io/hanzoai/bootnode-web.
Push web build to the existing bootnode package with tag-suffix=-web,
api with tag-suffix=-api, so they coexist without colliding tags.

Deployment image becomes:
  ghcr.io/hanzoai/bootnode:vX.Y.Z-web
  ghcr.io/hanzoai/bootnode:sha-XXXXXXX-web

Update K8s deployments via kubectl set image after CI succeeds.
2026-05-01 20:14:48 -07:00
zeekay 8c26e7cc93 fix(brand): add missing zoo logo SVGs to public/logo
The zoo brand config in web/lib/brand.ts references /logo/zoo-icon.svg,
/logo/zoo-logo.svg, /logo/zoo-logo-white.svg but only the references
existed — the files were missing, producing 404s on web3.zoo.ngo and
zoo.cloud. Added the canonical Zoo CMYK Venn mark from
zoo.industries/public/zoo-logo.svg.
2026-05-01 20:14:38 -07:00
zeekay b4341e1f0e fix(brand): remove hardcoded Bootnode leaks (terms, navbar, ai-chat, region-data, wallets sdk sample) + zoo IAM → zoolabs.id
- web/lib/brand.ts: zoo iam.url + iam.domain → zoolabs.id (zoo.id is NXDOMAIN)
- web/components/navbar.tsx: brand-aware `npm i {sdk}` snippet
- web/components/ai-chat.tsx: brand-namespaced localStorage keys
- web/components/lux/region-data.ts: brand-namespaced localStorage keys
- web/app/products/wallets/page.tsx: brand-aware SDK class + package in sample
- web/app/terms/page.tsx: BOOTNODE → {brand.name.toUpperCase()} in legal text
- web/lib/sdk-package.ts: shared brand→pkg/client map (single source of truth)
2026-04-30 00:24:49 -07:00
zeekay 6c071fe9c8 ci: retrigger docker-release after bootstrapping bootnode-web GHCR package 2026-04-29 15:57:46 -07:00
zeekay 7d8147cbb3 feat(brand): SSR also detects zoo.cloud as zoo brand 2026-04-29 15:39:30 -07:00
zeekay d1757172a2 feat(brand): route zoo.cloud through bootnode-web-zoo
- web/lib/brand.ts: detect zoo.cloud as zoo brand (alongside zoo.ngo, zoo.network)
- infra/k8s/ingress.yaml: add zoo.cloud + www.zoo.cloud as additional hosts on
  bootnode-zoo-ingress (TLS SAN via cert-manager, rules → bootnode-web-zoo:3001)

Makes zoo.cloud serve the same Bootnode platform as web3.zoo.ngo with Zoo brand.
2026-04-29 15:37:15 -07:00
zeekay 81ddc5db01 chore: symlink AGENTS.md and CLAUDE.md to LLM.md
Canonical project context lives in LLM.md. Symlinks ensure
agentic coding tools (agent, Cursor, etc.) find context
automatically regardless of which filename they look for.
2026-04-01 14:10:56 -07:00
zeekay 555e55648a fix: ingressClassName is 'ingress' not 'hanzo' 2026-03-26 22:57:39 -07:00
zeekay ad970becd1 infra: replace all nginx references with hanzo ingress
Migrate every ingress resource from nginx annotations to
traefik.ingress.kubernetes.io for hanzoai/ingress controller.
Update network policies to match hanzo-ingress pod selector.
Update operator config to use className: hanzo.
2026-03-25 12:11:56 -07:00
zeekay 7eb2a5162c fix: SSR title uses Host header for brand detection
NEXT_PUBLIC_BRAND gets baked at build time by Next.js, always resolving
to the Dockerfile default ("bootnode"). Use headers() + Host-based
detection in generateMetadata() so cloud.lux.network shows "Lux Cloud"
at request time, not "Bootnode".
2026-03-24 23:10:48 -07:00
zeekay da88c46607 ci: remove direct deployment — managed by universe E2E-gated pipeline
- Remove deploy job (kubectl to bootnode-k8s + lux-k8s)
- Remove KMS credential fetching, doctl, manifest apply steps
- Images still build and push to GHCR via reusable workflow
2026-03-16 18:22:01 -07:00
zeekay 1e422e81f1 rebrand: purge PostHog references 2026-03-13 17:46:50 -07:00
zeekay 0773cd47c7 ci: revert to ubuntu-latest runners (hanzo-build offline) 2026-03-12 18:33:31 -07:00
zeekay 4aa697fcde fix: refresh ghcr-secret on every deploy, cleanup stale pods
Root cause: ghcr-secret was expired/missing, causing ImagePullBackOff
on all web portal pods. Now auto-refreshes using GITHUB_TOKEN on each
deploy. Also cleans up stale pending pods from previous failed rollouts.
2026-03-12 18:22:03 -07:00
zeekay c5cc1e71f4 ci: add pod failure diagnostics to deploy workflow 2026-03-12 17:45:22 -07:00
zeekay 06305ae696 ci: install kubectl on hanzo-k8s runner before deploy 2026-03-12 17:06:12 -07:00
zeekay f62ba98e30 fix: add /api/health endpoint, fix web pod probes and resources
- Add lightweight /api/health Next.js route for K8s probes
- Increase readiness probe: initialDelaySeconds 5→15, timeout 5s, failureThreshold 5
- Increase liveness probe: initialDelaySeconds 10→30, periodSeconds 15
- Bump memory limit 512Mi→1Gi for Next.js SSR cold start
- Bump CPU request 100m→200m, limit 500m→1000m
2026-03-12 17:02:54 -07:00
zeekay d1c1376163 ci: switch all jobs to Hanzo self-hosted runners
- CI: test-api, test-web, e2e-test → hanzo-build
- Docker Release: gate → hanzo-build, deploy → hanzo-k8s
- Builds already use hanzo-build/hanzo-build-arm64 via reusable workflow defaults
2026-03-12 16:59:38 -07:00
zeekay b8ffa964f2 ci: fetch deploy credentials from Hanzo KMS via Universal Auth
Instead of storing DIGITALOCEAN_ACCESS_TOKEN and cluster names as
GitHub Secrets, authenticate to KMS at deploy time and fetch them
from /deploy path. Falls back to GitHub Secrets if KMS is unavailable.

Matches the pattern used by hanzo/app and other Hanzo services:
only KMS_CLIENT_ID + KMS_CLIENT_SECRET stored in GitHub.
2026-03-12 16:27:07 -07:00
zeekay 944b2ec47a ci: skip lux-k8s deploy when LUX_K8S_CLUSTER_NAME secret is missing 2026-03-12 16:12:23 -07:00
zeekay 89933bfc5a feat: hanzo.ai-style mega-menu navbar with Products/Solutions dropdowns
Replace NavigationMenu with custom NavMenu hover dropdowns:
- Products: 3 featured hero cards (Node/Explorer/MPC) + 5-column category grid + SDK footer
- Solutions: Enterprise/Startup panels + Use Cases/By Role/By Chain columns
- Hover-to-open on desktop (150ms close delay), click on mobile
- Full-viewport-width backdrop-blur dropdowns matching hanzo.ai pattern

Also fix API deployment: increase probe timeouts, add ENVIRONMENT=staging
2026-03-12 16:11:50 -07:00
zeekay 84b449a466 ci: make API rollout non-blocking so web portals still deploy
API pods timing out on rollout shouldn't prevent web portal deployment.
Use continue-on-error for API, tolerant errors for web brands.
2026-03-12 15:16:24 -07:00
zeekay c48c5deee0 ci: make external-secrets apply non-fatal in deploy
ClusterSecretStore CRDs may not be installed yet on the cluster.
Allow deploy to continue and warn instead of failing.
2026-03-12 14:58:49 -07:00
zeekay d854c9bb90 ci: remove legacy build/deploy from CI, use docker-release.yml
The build-and-push and deploy jobs were duplicated in ci.yml with missing
REGISTRY env vars, causing Docker login failures. docker-release.yml is
the canonical deploy pipeline (triggers on CI workflow_run completion).
2026-03-12 14:52:40 -07:00
zeekay b65fb6b77c feat: add Explorer + MPC product pages, fleet management, operator, Helm charts, and CI/CD
- Add Explorer product page with branded block explorer deployment, contract
  verification, Etherscan-compatible API, and multi-chain support
- Add MPC product page with deep Lux MPC integration: CGGMP21 (ECDSA),
  FROST (EdDSA), LSS resharing, 15+ chain support, threshold signing API
- Update landing page with 6-product grid (Node, Data, Wallets, Explorer,
  MPC, Rollups) and 8 API cards including Explorer API and MPC Signing
- Update navbar and command menu with Explorer and MPC products
- Add Lux fleet management dashboard, observability, and services pages
- Add AI chat component and unified navigation with org switcher
- Add Kubernetes operator (Rust) for multi-chain node lifecycle management
- Add Lux Helm charts with genesis configs for devnet/testnet/mainnet
- Add docker-release.yml CI/CD pipeline for automated DOKS deployment
- Add monitoring, network policies, web deployments, and ingress updates
- Refactor API: fleet management, billing tracker, observability endpoints
- Update brand config, API client, and infrastructure manifests
2026-03-12 14:48:40 -07:00
zeekay 8368aee579 fix(ci): use v3 KMS API with workspaceId and Universal Auth
- environment=production → environment=prod (matches KMS config)
- v1/secrets/raw → v3/secrets/raw with workspaceId
- Added KMS_CLIENT_ID/SECRET Universal Auth with HANZO_API_KEY fallback
2026-03-11 16:00:38 -07:00
zeekay 3f878c3858 ci: migrate deploy to HANZO_API_KEY + KMS
Replace direct DIGITALOCEAN_ACCESS_TOKEN with KMS credential fetch
using HANZO_API_KEY for multi-cluster bootnode deployment.
2026-03-11 14:35:49 -07:00
zeekay 9e02248725 fix: update IAM auth integration for bootnode 2026-03-09 23:27:10 -07:00
zeekay 4db33d9114 feat: add Graph Node + IPFS + subgraph infrastructure
- Add graph-node, graph-ipfs, graph-postgres to compose.yml (subgraph profile)
- Add k8s manifests for Graph Node stack (lux/graph-node.yaml)
- Add deploy-subgraph.sh for AMM V3/V2 subgraph deployment
- Update deploy.sh with 'graph' target for Graph Node infrastructure
- Matches existing lux-k8s lux-explorer namespace setup
2026-03-07 00:03:44 -08:00
zeekay 9fc2ab684e fix: convert DATABASE_URL to asyncpg scheme for async SQLAlchemy engine
The K8s DATABASE_URL env var uses postgresql:// which makes
create_async_engine try to load psycopg2 (sync driver). Add
_ensure_async_dsn() to convert postgresql:// and postgres:// to
postgresql+asyncpg:// at engine creation time. asyncpg is already
in dependencies.
2026-03-03 08:13:33 -08:00
zeekay b8a38b2c4d ci: push canonical image to ghcr.io/bootnode/bootnode
Add BOOTNODE_GHCR_PAT secret-based login to push API and web images
to the canonical ghcr.io/bootnode/bootnode registry in addition to
ghcr.io/hanzoai/bootnode. Also add provenance=false/sbom=false to web
build to avoid attestation timeouts on linux/amd64.
2026-03-01 14:06:16 -08:00
zeekay b7bc9039c6 ci: disable stale operator build job (operator is in bootnode/universe) 2026-03-01 14:02:19 -08:00
zeekay 9c3e36344e ci: remove cross-org ghcr.io/bootnode push (needs PAT, not GITHUB_TOKEN) 2026-03-01 13:57:06 -08:00
zeekay 4638f35c50 ci: also push to ghcr.io/bootnode/bootnode canonical image name 2026-03-01 13:53:52 -08:00
zeekay 791b1855c5 fix: run ZAP Cap'n Proto server inside capnp.kj_loop() background task
capnp.AsyncIoStream.create_server() must be called from within an active
KJ event loop context. Wrap the entire serve lifecycle in a background
asyncio Task that runs under `async with capnp.kj_loop()`, fixing the
startup error: "The KJ event-loop is not running on this thread".

The server now signals readiness via `_running=True` after bind and
the caller polls for up to 1 s before raising if startup fails.
2026-03-01 13:50:47 -08:00
zeekay 0738ba5e98 fix: use venv directly instead of uv run to avoid hanzo-kms resolution
uv run also tries to resolve all extras. Use .venv/bin/ directly
to run pytest and uvicorn since uv pip install already set up the venv.
2026-02-13 17:13:53 -08:00
zeekay 84ffdc5cfd fix: use uv pip install in CI to avoid resolving hanzo-kms extra
uv sync resolves ALL extras including hanzo (which depends on
hanzo-kms, not published to PyPI) even with --no-extra flag.
Switch to uv pip install -e ".[dev]" which only resolves the
specified extras.
2026-02-13 17:02:37 -08:00
zeekay 9af7064e1e fix: exclude hanzo extra from CI dependency resolution
uv resolves all extras by default. Explicitly exclude the hanzo
extra (hanzo-kms, hanzo-iam) which aren't published to PyPI.
2026-02-13 16:57:58 -08:00
zeekay 63b0aaf38e fix: CI uses --extra dev to avoid hanzo-kms dep + add hanzo-ns k8s manifests
CI was failing because `uv sync` installs all extras including hanzo-kms
which isn't on PyPI. Switch to `uv sync --extra dev` for test jobs.

Add bootnode API deployment manifest for the hanzo namespace (separate
from the bootnode namespace deployment).
2026-02-13 16:44:05 -08:00