mirror of
https://github.com/luxfi/bridge.git
synced 2026-09-24 00:26:46 +00:00
User directive: 'drop LUX_ keep it brand neutral do not use nats/consul
must use standalone ~/work/lux/mpc with our native ~/work/lux/consensus
or b/m-chains'.
This commit lands all three asks.
────────────────────────────────────────────────────────────────────────
Brand neutralization
────────────────────────────────────────────────────────────────────────
Env vars renamed (LUX_* → BRIDGE_*):
LUX_IAM_ISSUER → BRIDGE_IAM_ISSUER
LUX_KMS_URL → BRIDGE_KMS_URL
LUX_KMS_ORG → BRIDGE_KMS_ORG
LUX_KMS_CLIENT_ID → BRIDGE_IAM_CLIENT_ID
LUX_KMS_CLIENT_SECRET → BRIDGE_IAM_CLIENT_SECRET
LUX_MPC_URL → BRIDGE_MPC_URL
(+ BRIDGE_MPC_WALLET_ID new — default wallet for native sign)
Client classes renamed (Lux* → brand-neutral):
LuxIAMClient → IAMClient
LuxKMSClient → KMSSecretClient (avoids collision w/ AWS SDK's KMSClient)
LuxMPCClient → MPCClient
Audience strings renamed (lux-* → bare service name):
'lux-kms' → 'kms'
'lux-mpc' → 'mpc'
File renames:
src/clients/lux-iam.ts → src/clients/iam.ts
src/clients/lux-kms.ts → src/clients/kms.ts
src/clients/lux-mpc.ts → src/clients/mpc.ts
(+ matching __tests__/ files)
────────────────────────────────────────────────────────────────────────
NATS + Consul: gone
────────────────────────────────────────────────────────────────────────
Deletions:
- app/server/src/services/mpc-service.ts (498 LOC NATS+Consul wrapper)
- app/server/src/utils/trigger-keygen.ts (dev script, NATS)
- app/server/src/scripts/trigger-keygen.ts (dev script, NATS)
- app/server/src/scripts/test-signing.ts (dev script, NATS)
- app/server/src/types/nats.d.ts (vendored type stubs)
- consul + nats sections of app/server/src/types/index.d.ts
- nats + consul devDependencies in app/server/package.json
- NATS + Consul + Vault containers in compose.local.yml
Rewritten:
- app/server/src/domain/mpc-bridge.ts (497 → 197 LOC)
Preserves the public surface (bridgeMPC.initialize() /
.generateMPCSignature() / .completeSwap() / .getHealthStatus())
so domain/mpc-modern.ts callers stay untouched. Internally:
- One MPCClient HTTP call replaces the NATS publish + subscribe
pub/sub dance. mpcd handles the threshold round atomically.
- Consul KV completion marker replaced with Prisma's
Swap.metadata_sequence_number update (single source of truth).
- Lazy IAM + MPCClient construction so the bridge boots cleanly
when BRIDGE_MPC_URL / BRIDGE_IAM_* are unset (standalone mode).
Sign calls return a clear error rather than crashing the
process.
- app/server/src/server.ts startup: no more mpcService.initialize();
bridgeMPC.initialize() now soft-fails (logger.warn) on missing
env. /health endpoint reads through bridgeMPC.getHealthStatus()
which reports { online: 0, total: 0, standalone: true } when
MPCClient isn't configured.
- compose.local.yml: replaces 6-service NATS/Consul/Vault topology
with bare 3-service (iam + iam-db + bridge postgres). Out-of-band
mpcd + KMS instructions documented in the file header.
────────────────────────────────────────────────────────────────────────
docs/LLM.md
────────────────────────────────────────────────────────────────────────
All LUX_* env mentions retargeted to BRIDGE_*. The 'Native Lux services'
section now describes the HTTP-only, env-neutral integration pattern.
Standalone mode section unchanged in shape but with refreshed env names.
────────────────────────────────────────────────────────────────────────
Tests + typecheck
────────────────────────────────────────────────────────────────────────
SDK pkg/bridge: 58 / 58
Server app/server: 123 / 123 (no regression — same set as v1.1.21
with renamed env vars)
Typecheck: clean on both packages
────────────────────────────────────────────────────────────────────────
Net effect
────────────────────────────────────────────────────────────────────────
Bridge backend is now genuinely brand-neutral:
- No 'LUX_' in any env var (the BRIDGE_ prefix is service-scoped, not
brand-scoped; same prefix the SDK uses for runtime config)
- No NATS, no Consul anywhere in the codebase or compose files
- Native m-chain signing goes through HTTP to mpcd (the canonical
~/work/lux/mpc daemon, github.com/luxfi/mpc), one round-trip per
sign, with the same wire protocol as ~/work/lux/kms/pkg/mpc/client.go
- Standalone mode preserved: when BRIDGE_MPC_URL is unset, the bridge
runs without crashing; sign calls return a clear error
94 lines
3.1 KiB
YAML
94 lines
3.1 KiB
YAML
# Lux Bridge — STANDALONE compose.
|
|
#
|
|
# Boots the absolute minimum services for a working bridge: Postgres
|
|
# (state) + bridge-server (API) + bridge-ui (Vite SPA). NO Casdoor /
|
|
# Vault / NATS / Consul / MPC nodes — every external dep is either
|
|
# optional at runtime (m-chain MPC, KMS, cosigners) or absent from this
|
|
# topology entirely.
|
|
#
|
|
# Use when:
|
|
# - Running on a dev laptop without spinning up the full Lux platform
|
|
# - Reproducing a swap state for debugging
|
|
# - White-label tenants who run their own IAM / KMS / MPC out-of-band
|
|
#
|
|
# When you want the full platform, run `docker compose -f compose.local.yml
|
|
# up` instead. That brings up Lux ID + Vault + NATS + Consul + 3-node MPC
|
|
# alongside this one.
|
|
#
|
|
# Quick start:
|
|
# 1. Copy ./config/env.standalone.example → ./config/env.standalone
|
|
# and fill in the bridge JWT signing key + any cosigner config.
|
|
# 2. docker compose -f compose.standalone.yml up --build
|
|
# 3. Bridge UI: http://localhost:3001
|
|
# Bridge API: http://localhost:5000/healthz
|
|
# Postgres: localhost:5433 (user=bridge, pass=bridge, db=bridge)
|
|
#
|
|
# To enable external services after boot, just set the corresponding env
|
|
# vars (BRIDGE_MPC_URL, BRIDGE_KMS_URL, …) — the bridge backend graceful-degrades
|
|
# when they're unset and starts using them when they appear.
|
|
|
|
services:
|
|
postgres:
|
|
image: ghcr.io/hanzoai/sql:latest
|
|
container_name: bridge-pg-standalone
|
|
environment:
|
|
POSTGRES_USER: bridge
|
|
POSTGRES_PASSWORD: bridge
|
|
POSTGRES_DB: bridge
|
|
ports:
|
|
- "5433:5432"
|
|
volumes:
|
|
- bridge-pg-standalone:/var/lib/postgresql/data
|
|
networks: [bridge-standalone]
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U bridge"]
|
|
interval: 3s
|
|
timeout: 2s
|
|
retries: 10
|
|
|
|
bridge-server:
|
|
image: ghcr.io/luxfi/bridge-server:latest
|
|
container_name: bridge-server-standalone
|
|
depends_on:
|
|
postgres: { condition: service_healthy }
|
|
environment:
|
|
PORT: "5000"
|
|
POSTGRES_URL: postgres://bridge:bridge@postgres:5432/bridge
|
|
DATABASE_URL: postgres://bridge:bridge@postgres:5432/bridge
|
|
NODE_ENV: standalone
|
|
LOG_LEVEL: info
|
|
# All external integrations are OPTIONAL — uncomment to enable.
|
|
# BRIDGE_IAM_ISSUER: https://iam.lux.network
|
|
# BRIDGE_KMS_URL: https://kms.lux.network
|
|
# BRIDGE_KMS_ORG: lux
|
|
# BRIDGE_IAM_CLIENT_ID: lux-bridge
|
|
# BRIDGE_IAM_CLIENT_SECRET: <fetch from your secret store>
|
|
# BRIDGE_MPC_URL: https://mpc.lux.network
|
|
ports:
|
|
- "5000:5000"
|
|
networks: [bridge-standalone]
|
|
restart: unless-stopped
|
|
|
|
bridge-ui:
|
|
image: ghcr.io/luxfi/bridge:latest
|
|
container_name: bridge-ui-standalone
|
|
depends_on:
|
|
bridge-server: { condition: service_started }
|
|
environment:
|
|
# __ENV.js is templated by the SPA serving image at boot from these
|
|
# BRIDGE_* vars (one image, N envs).
|
|
BRIDGE_API_HOST: http://localhost:5000
|
|
BRIDGE_ENV: standalone
|
|
BRIDGE_IAM_ORG: lux
|
|
ports:
|
|
- "3001:80"
|
|
networks: [bridge-standalone]
|
|
restart: unless-stopped
|
|
|
|
volumes:
|
|
bridge-pg-standalone:
|
|
|
|
networks:
|
|
bridge-standalone:
|
|
driver: bridge
|