Running Neon Law Navigator on AWS, Azure, or self-hosted Kubernetes

Neon Law Navigator's application code is cloud-agnostic. The Rust workspace depends on two abstractions — cloud::StorageService and store::Db — plus a handful of SaaS-shaped env-driven integrations (OIDC, OPA, Restate, SendGrid). Nothing in the canonical build pulls in a GCP-only SDK at compile time.

What ships wired up is the GCP path (see oss-install.md). What ships sketched below are the moving parts you'd swap to run on a different cloud. None of the sketches has production-equivalent test coverage today — patches welcome.

What's actually cloud-bound

AWS / EKS sketch

  1. Identity: register an Auth0 or Cognito user pool. Point OAUTH_ISSUER_URL, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, and OAUTH_REDIRECT_URI at it. The browser-side flow doesn't change.
  2. Postgres: RDS Postgres or Aurora Postgres. Set DATABASE_URL to the instance's wire endpoint (with ?sslmode=require).
  3. Storage: select NAVIGATOR_STORAGE_BACKEND=s3 and provide a region, endpoint, bucket names, and credentials. S3Storage uses SigV4 and forced path-style addressing, so AWS S3 and conforming S3-compatible services share the same application contract.
  4. Workflow runtime: run the Restate Operator in your EKS cluster (it has no GCP-only assumptions), or sign up for Restate Cloud (multi-region; works from anywhere).
  5. Kubernetes manifests: start from examples/deploy/k8s/gke/ and remove the GKE-specific bits — ManagedCertificate, BackendConfig, iam.gke.io/gcp-service-account annotations, the Workload Identity wiring. Replace the Ingress class with alb or nginx. Cert-manager + Let's Encrypt is the easy path for TLS.
  6. Email: SendGrid runs from anywhere. If you want SES instead, write an SesEmail: EmailService and add a ses branch to workflows-service::email_config::select_backend.

Azure / AKS sketch

The shape is identical to EKS, with two substitutions:

The Kubernetes manifests don't need cluster-specific changes beyond the ingress class and the cert source.

Self-hosted / generic Kubernetes

If you're running k3s, k0s, kind, or a vanilla kubeadm cluster:

This is essentially the KIND dev path scaled out — see cli/README.md.

Garage is AGPL-3.0 software. Navigator runs the unmodified dxflrs/garage:v2.3.0 image as a separate service and communicates with it only through the S3 network API; its license and source remain those of the upstream project.

Status of the cloud-agnostic surface

ItemStatus
cloud::StorageService traitexists, used by web
cloud::FsStorage (dev)ships
cloud::GcsStorage (GCP)ships
cloud::S3Storage (S3-compatible)ships; Garage is the open local/on-prem default
cloud::AzureBlobStoragenot implemented
EmailService::SendGridEmailships
EmailService::SesEmailnot implemented
EmailService::SmtpEmail (generic)not implemented
AgentRouter::GeminiRouterships
AgentRouter::NullRouterships
AgentRouter::ClaudeRouter / BedrockRouter / AzureOpenAIRouternot implemented

Pull requests adding SesEmail or BedrockRouter are welcome — each is a self-contained addition behind an existing trait, and the test surface is small.