Commit Graph
88 Commits
Author SHA1 Message Date
zeekay 0418ffb9fc 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 d508ffb9eb fix: ingressClassName is 'ingress' not 'hanzo' 2026-03-26 22:57:39 -07:00
zeekay 5ee151b452 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 e67a22a0b8 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 55b5180465 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 b56ff80d88 rebrand: purge PostHog references 2026-03-13 17:46:50 -07:00
zeekay 7ab70ed08e ci: revert to ubuntu-latest runners (hanzo-build offline) 2026-03-12 18:33:31 -07:00
zeekay 79b50baf29 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 06a8abf759 ci: add pod failure diagnostics to deploy workflow 2026-03-12 17:45:22 -07:00
zeekay 17aed627f2 ci: install kubectl on hanzo-k8s runner before deploy 2026-03-12 17:06:12 -07:00
zeekay f234c74eb3 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 607a5e8619 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 5969d372cf 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 e0b7f66b87 ci: skip lux-k8s deploy when LUX_K8S_CLUSTER_NAME secret is missing 2026-03-12 16:12:23 -07:00
zeekay 62c0be939a 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 ad4a2085d0 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 94edb721bc 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 3aefe63798 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 0aa9c4e346 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 167f08bca7 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 b06e1e962c 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 72cf6e4c3b fix: update IAM auth integration for bootnode 2026-03-09 23:27:10 -07:00
zeekay 97c8a5842d 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 1ce1924c41 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 05dfdb3b8e 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 1000925467 ci: disable stale operator build job (operator is in bootnode/universe) 2026-03-01 14:02:19 -08:00
zeekay d8ac2d165b ci: remove cross-org ghcr.io/bootnode push (needs PAT, not GITHUB_TOKEN) 2026-03-01 13:57:06 -08:00
zeekay efc23bc347 ci: also push to ghcr.io/bootnode/bootnode canonical image name 2026-03-01 13:53:52 -08:00
zeekay db21b65cb7 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 e7506c1554 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 f9e6ebbbd5 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 391dc7b980 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 d66df4ae64 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
zeekay 9b6b6a1f72 feat: add cloud compute billing tiers and authorization API
Cloud compute quotas per tier (Free: 1 Linux/20hr, PAYG: 5L+2W+1M,
Growth: 20L+5W+3M, Enterprise: custom). Adds billing endpoints for
control-plane authorization, quota checks, and usage reporting.
2026-02-13 15:33:54 -08:00
zeekay 98c31d7ee6 docs: update LLM.md with gateway routes and billing migration status 2026-02-12 20:33:15 -08:00
zeekay 9e215ed3e9 fix: add Commerce billing to K8s deploy + create init.sql
- Add Commerce secretKeyRef (api-key, webhook-secret) to K8s api-deployment
- Create infra/sql/init.sql (uuid-ossp, pgcrypto extensions for PostgreSQL)
- Remove deprecated version: from docker-compose.prod.yml
2026-02-12 20:30:37 -08:00
zeekay 15a33edadb chore: gitignore test artifacts, reports, and screenshots 2026-02-12 20:26:45 -08:00
zeekay 3fe4d9fa43 fix: enforce Hanzo KMS for all secrets, remove plaintext credentials
- Remove hardcoded Secret from bootnode-deployment.yaml (conflicted with ExternalSecret)
- Fix Postgres/Redis pods to read passwords from KMS-managed bootnode-secrets
- Expand ExternalSecret from 7 to 30 secrets with UPPERCASE_UNDERSCORE keys matching Pydantic
- Enable hanzo-kms SDK as optional dependency for direct KMS access outside K8s
- Improve inject_secrets() startup logging to indicate active secrets path
- Rewrite secrets.yaml as documentation-only with flow diagram and setup guide
- Fix compose.yml Bitcoin healthcheck to use env vars instead of hardcoded password
2026-02-12 13:05:04 -08:00
zeekay 3420cb8e5a feat: add billing management page with tier comparison + checkout
- Create /dashboard/organization/billing page with plan comparison
- Wire up disabled "Manage Subscription" button to new billing page
- Fix analytics nav billing link to point to organization/billing
- Shows current plan, usage stats, and upgrade via Commerce checkout
- All 4 tiers displayed: Free, PAYG, Growth, Enterprise
2026-02-12 11:43:33 -08:00
zeekay 6a3e6aa2d7 fix: replace all hardcoded localhost URLs with env var in dashboard
All dashboard pages now use NEXT_PUBLIC_API_URL with localhost fallback
for local dev. Fixes tokens, volumes, storage, clusters, monitoring,
infrastructure, and usage pages for production deployment.
2026-02-12 11:24:10 -08:00
zeekay 8edcaa614f fix: production billing hardening + Stripe→Commerce migration
- Replace eval() with json.loads() in usage tracker (security fix)
- Webhook verification fails-closed in production when secret missing
- Add Commerce env vars to K8s deployment (URL, API key, webhook secret)
- Expose ZAP port 9999 in Dockerfile and K8s service
- Replace Stripe env vars with Square in compose.yml
- Update privacy/terms pages: Stripe→Square via Hanzo Commerce
- Add full billing API client module to web/lib/api.ts (17 endpoints)
- Fix hardcoded localhost URLs in dashboard/analytics/organization pages
- Add production webhook rejection test (57 tests passing)
2026-02-12 11:22:03 -08:00
zeekay fa2bcb0455 fix: unified billing error handling + add billing tests
unified.py: _create_customer now raises CommerceError instead of
returning fake local_ customer IDs that mask failures.
create_subscription raises CommerceError instead of bare Exception.
report_usage raises CommerceError so callers know when usage wasn't
reported.

Added 12 new tests: config AliasChoices regression (P0), commerce
client error paths, unified client error propagation, and webhook
handler edge cases. All 56 billing tests pass.
2026-02-12 10:47:45 -08:00
zeekay 82c099d128 fix: resolve config mismatch + auth security hardening
P0: config.py defined hanzo_commerce_* but billing code accessed
settings.commerce_* — causes AttributeError at runtime. Renamed fields
with AliasChoices for backward compat with HANZO_COMMERCE_* env vars.

P1: deps.py silently swallowed JWT errors (bare pass) — now logs them.
Virtual API key used fake UUID for missing projects — now raises 404.
Updated secrets.yaml to replace stale Stripe references with Commerce.
2026-02-12 10:44:47 -08:00
zeekay e12b34a4cf fix: update ZAP connection URL to bootno.de domain 2026-02-12 10:21:42 -08:00
zeekay 32900a48a2 fix: brand IAM URLs and auth provider detection
- Fix Lux brand IAM URL: lux.id → iam.lux.network (matches actual deployment)
- Use getBrand().iam.url for IAM URL in HanzoLoginButton (brand-aware auth)
- Fix missing newline at EOF in unified-navigation.tsx
- Update LLM.md with Commerce billing and IAM documentation
2026-02-12 10:21:27 -08:00
zeekay 1db85445d4 feat: enhance Lux fleet management with in-cluster + StatefulSet discovery
- Add StatefulSet discovery fallback for kubectl-deployed fleets (non-Helm)
- Add in-cluster mode: auto-detect pod ServiceAccount, skip kubeconfig fetch
- Add list_fleets_incluster() for direct K8s API fleet discovery
- Add get_statefulsets() to HelmDeployer for kubectl-based fleet listing
- Make helm_revision optional (null for non-Helm fleets)
- Add Lux devnet network (chain_id 96370), fix testnet chain_id (96368)
- Add in-cluster self-detection for /v1/infra/clusters endpoint
- Fix kubeconfig fetch: use raw HTTP (pydo can't deserialize YAML), doctl fallback
- Install kubectl in API Dockerfile for fleet management operations
2026-02-12 10:21:01 -08:00
zeekay 249e2984cd feat: integrate Commerce/Square billing (checkout, webhooks, unified API)
- Add checkout/capture endpoints via Commerce → Square payment flow
- Add order.completed/cancelled and payment.paid/failed/refunded webhook handlers
- Update Commerce API paths (/api/v1/customers → /api/v1/user, /subscribe, etc.)
- Migrate unified billing from Stripe references to Square (customer accounts)
- Add customer_id to usage sync worker for proper metered billing
- Export UnifiedBillingClient, UnifiedUser from billing module
- Add Commerce tier-to-plan slug mapping (bootnode-free/payg/growth/enterprise)
2026-02-12 10:20:42 -08:00
zeekay f46dc90a83 refactor: rename domain bootnode.dev → bootno.de
Update K8s manifests (Ingress hosts, CRD API groups, CORS origins),
ZAP schemas, pyproject.toml URLs, SDK docs import paths, e2e test
emails, and K8s annotations to use the canonical bootno.de domain.
2026-02-12 10:20:22 -08:00
zeekay bcc94c2fcb fix: multi-network OAuth login for all cloud portals
- OAuth callback accepts redirect_uri from frontend to derive correct
  IAM client_id per network (all use lux-web3 shared app)
- Token verification accepts tokens from any known IAM app audience
- Frontend sends redirect_uri in callback POST body
- Login page uses proper /login/oauth/authorize URL with client_id
- Brand configs unified to use lux-web3 IAM app for all networks
- Removed dead code (duplicate get_current_user, unreachable methods)
- IAM init data updated with cloud redirect URIs for pars/zoo/hanzo
2026-02-11 18:44:57 -08:00
zeekay 5af2afacea fix: import get_current_user from core.iam not api.deps
The networks module imported get_current_user from bootnode.api.deps
where it doesn't exist — it's in bootnode.core.iam. This broke the
entire API startup (uvicorn can't import bootnode.main:app).
2026-02-11 17:55:17 -08:00