Files
zeekay f3fbb687d2 purge: rip remaining Infisical residue — docs, env examples, repo boilerplate
Following the earlier AdminShell+CollectionCRUD rewrite (PR #14) which
already deleted backend/, backend-go/, cloudformation/, helm-charts/,
nginx/, sink/, wasm/, upgrade-impact/, e2e/, migration/, package.json
and switched the frontend to a 184K Hanzo-first build, complete the
cleanup by deleting the remaining Infisical-era residue:

  - docs/                                   (1.0G Infisical mintlify docs)
  - .env.example, .env.dev.example,
    .env.migration.example, .env.test.example
                                            (legacy Postgres/Redis envs;
                                             no Go code references them)
  - .eslintignore, .husky/                  (TS toolchain leftovers)
  - CODE_OF_CONDUCT.md, CONTRIBUTING.md,
    SECURITY.md                             (Infisical repo boilerplate)

Working tree drops from ~1.0G to <600K of content (1.5G total is .git/
which `git gc --aggressive --prune=now` shrinks locally; the remote
keeps its history shape — anyone pulling gets the lean checkout).

Build + test verification:
  go build ./...                            (4 cmd binaries: green)
  go test ./... -count=1 -short             (all packages: ok)

Kept: cmd/, pkg/, sdk/, frontend/ (AdminShell), schema/, examples/,
root Go (audit.go, auth.go, consensus.go, embed.go, jwks.go, mount.go,
versioning.go + tests), Dockerfile, Dockerfile.kms-fetch, Makefile,
LLM.md, CLAUDE.md, DEPRECATED.md, SOVEREIGN-KMS-ARCHITECTURE.md,
TFHE-KMS-ARCHITECTURE.md, LICENSE, README.md, VERSION, .github/
(8 Hanzo workflows: build, build-kms-fetch, check-fe-ts-and-lint,
ci, pr-preview, release, validate-pr-title, workflow-sanity).
2026-06-07 14:23:12 -07:00

368 lines
7.8 KiB
YAML

# Kubernetes Deployment for Lux KMS with Google Cloud KMS HSM
# Using Workload Identity for secure credential management
---
apiVersion: v1
kind: Namespace
metadata:
name: lux-kms
labels:
app.kubernetes.io/name: lux-kms
app.kubernetes.io/component: kms
---
# Service Account with Workload Identity annotation
apiVersion: v1
kind: ServiceAccount
metadata:
name: lux-kms-sa
namespace: lux-kms
annotations:
iam.gke.io/gcp-service-account: lux-kms-sa@PROJECT_ID.iam.gserviceaccount.com
labels:
app.kubernetes.io/name: lux-kms
app.kubernetes.io/component: kms
---
# ConfigMap for application configuration
apiVersion: v1
kind: ConfigMap
metadata:
name: lux-kms-config
namespace: lux-kms
labels:
app.kubernetes.io/name: lux-kms
data:
HSM_ENABLED: "true"
HSM_PROVIDER: "google-cloud"
GOOGLE_CLOUD_LOCATION: "global"
GOOGLE_CLOUD_KEY_RING: "lux-kms-keyring"
GOOGLE_CLOUD_CRYPTO_KEY: "lux-kms-key"
GOOGLE_CLOUD_PROTECTION_LEVEL: "HSM"
GOOGLE_CLOUD_AUTO_ROTATE: "true"
GOOGLE_CLOUD_ROTATION_PERIOD: "7776000s"
NODE_ENV: "production"
LOG_LEVEL: "info"
LOG_FORMAT: "json"
ENABLE_METRICS: "true"
RATE_LIMIT_ENABLED: "true"
RATE_LIMIT_MAX_REQUESTS: "100"
RATE_LIMIT_WINDOW_MS: "60000"
---
# Secret for sensitive configuration (create manually or via Sealed Secrets)
apiVersion: v1
kind: Secret
metadata:
name: lux-kms-secrets
namespace: lux-kms
labels:
app.kubernetes.io/name: lux-kms
type: Opaque
stringData:
GOOGLE_CLOUD_PROJECT_ID: "your-project-id"
DB_CONNECTION_URI: "postgresql://user:password@postgres:5432/lux_kms"
JWT_SECRET: "your-secure-random-secret-here"
REDIS_URL: "redis://redis:6379"
---
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: lux-kms
namespace: lux-kms
labels:
app.kubernetes.io/name: lux-kms
app.kubernetes.io/component: kms
app.kubernetes.io/version: "1.0.0"
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app.kubernetes.io/name: lux-kms
app.kubernetes.io/component: kms
template:
metadata:
labels:
app.kubernetes.io/name: lux-kms
app.kubernetes.io/component: kms
app.kubernetes.io/version: "1.0.0"
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9090"
prometheus.io/path: "/metrics"
spec:
serviceAccountName: lux-kms-sa
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: lux-kms
image: lux/kms:latest
imagePullPolicy: Always
ports:
- name: http
containerPort: 8080
protocol: TCP
- name: metrics
containerPort: 9090
protocol: TCP
envFrom:
- configMapRef:
name: lux-kms-config
- secretRef:
name: lux-kms-secrets
env:
- name: PORT
value: "8080"
- name: METRICS_PORT
value: "9090"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: http
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 3
successThreshold: 1
failureThreshold: 3
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
capabilities:
drop:
- ALL
volumeMounts:
- name: tmp
mountPath: /tmp
- name: data
mountPath: /app/data
- name: logs
mountPath: /app/logs
volumes:
- name: tmp
emptyDir: {}
- name: data
persistentVolumeClaim:
claimName: lux-kms-data
- name: logs
emptyDir: {}
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- lux-kms
topologyKey: kubernetes.io/hostname
tolerations:
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 300
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 300
---
# PersistentVolumeClaim for data storage
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: lux-kms-data
namespace: lux-kms
labels:
app.kubernetes.io/name: lux-kms
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: standard-rwo
---
# Service
apiVersion: v1
kind: Service
metadata:
name: lux-kms
namespace: lux-kms
labels:
app.kubernetes.io/name: lux-kms
app.kubernetes.io/component: kms
annotations:
cloud.google.com/neg: '{"ingress": true}'
spec:
type: LoadBalancer
selector:
app.kubernetes.io/name: lux-kms
app.kubernetes.io/component: kms
ports:
- name: http
protocol: TCP
port: 80
targetPort: http
- name: metrics
protocol: TCP
port: 9090
targetPort: metrics
sessionAffinity: ClientIP
---
# HorizontalPodAutoscaler
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: lux-kms
namespace: lux-kms
labels:
app.kubernetes.io/name: lux-kms
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: lux-kms
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 2
periodSeconds: 15
selectPolicy: Max
---
# PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: lux-kms
namespace: lux-kms
labels:
app.kubernetes.io/name: lux-kms
spec:
minAvailable: 2
selector:
matchLabels:
app.kubernetes.io/name: lux-kms
app.kubernetes.io/component: kms
---
# NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: lux-kms
namespace: lux-kms
labels:
app.kubernetes.io/name: lux-kms
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: lux-kms
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: hanzo-ingress
ports:
- protocol: TCP
port: 8080
- from:
- namespaceSelector:
matchLabels:
name: monitoring
ports:
- protocol: TCP
port: 9090
egress:
- to:
- namespaceSelector: {}
ports:
- protocol: TCP
port: 5432 # PostgreSQL
- protocol: TCP
port: 6379 # Redis
- to:
- namespaceSelector: {}
ports:
- protocol: TCP
port: 443 # Google Cloud KMS API
- protocol: TCP
port: 53 # DNS
- protocol: UDP
port: 53 # DNS