Runs in your cluster
Your cluster. Your database. Your keys.
Bank-in-a-Box ships as a Helm chart and signed container images. Your platform team installs it next to the systems it already runs. We never operate it and never see your customers’ data.
- Kubernetes
- 1.26 or later
- Database
- PostgreSQL 16, or DynamoDB
- Packaging
- Helm chart, OCI images
- Supply chain
- cosign signatures, SPDX SBOM
- Status
- Early access, evaluation mode
- Design target
- All pods Ready within 10 min on 3 nodes
Topology
What gets installed, and where the lines are.
Install
Four steps your platform team already knows.
Abridged. The full install guide, deploy/README.md, covers every value, image verification, ingress
and store options, and upgrades.
-
01
Verify what you’re about to run
Every release is signed with cosign and ships an SPDX SBOM as a signed attestation. The public key, cosign.pub, is attached to each release. The full verification commands are in deploy/README.md.
VERSION=<release tag> IMAGE=ghcr.io/ryabinski-labs/bank_in_a_box/channel:$VERSION cosign verify --key cosign.pub "$IMAGE" cosign verify-attestation --key cosign.pub --type spdxjson "$IMAGE" -
02
Create your Secrets
The chart never contains a credential. It references Secrets you create, by name and key.
kubectl create namespace biab kubectl -n biab create secret generic biab-postgres \ --from-literal=dsn="$BIAB_POSTGRES_DSN" kubectl -n biab create secret generic biab-ses \ --from-literal=access-key-id="$SES_ACCESS_KEY_ID" \ --from-literal=secret-access-key="$SES_SECRET_ACCESS_KEY" -
03
Install the evaluation profile
Evaluation access is granted on request: we share the chart and signed images with your platform team. The evaluation profile runs a fictional sandbox tenant on localhost with one-click persona sign-in, so no mail server is needed. The production profile, for your own domain and real customers, comes with general availability.
helm upgrade --install biab deploy/helm/bank-in-a-box -n biab \ --set profile=simulation \ --set demo.enabled=true \ --set origin=http://localhost:8080 \ --set-file 'tenantConfig.files.tenant\.json=examples/kesef-bank.tenant.json' \ --wait --timeout 10m -
04
Wait for ready, then open it
Readiness checks the database. If PostgreSQL is unreachable, /health/ready returns 503 and the pod stays out of service.
kubectl -n biab wait --for=condition=Ready pods --all --timeout=10m kubectl -n biab port-forward svc/biab-bank-in-a-box-web 8080:8080 & curl -fsS http://localhost:8080/health/ready
Data residency
What stays with the bank: all of it.
| Data | Where it lives |
|---|---|
| Customer accounts, balances, transactions, loans | Your core. The adapter reads them live and the API caches them briefly (30 s fresh, 5 min at most, by default). |
| Sessions, passkeys, transfer operations, audit trail | Your PostgreSQL or DynamoDB, through one store interface with the same tests on both. |
| Core API key, database DSN, email credentials | Kubernetes Secrets you create. The chart only references them. |
| Logs and metrics | Your cluster. Prometheus metrics on /metrics. Request logs leave out bodies, cookies, tokens and query strings. |
| Anything sent to us | Nothing. There is no telemetry or call-home in the code: the software makes outbound calls only to your core system, your mail provider and your database. That describes how it’s built, not a third-party audit; you can enforce it with a default-deny egress NetworkPolicy. |
Guardrails
Hard to misconfigure on purpose.
-
Demo mode can’t reach production
The chart has two profiles,
customerandsimulation. Turning on demo mode in the customer profile fails at render time withdemo mode requires simulation profile. -
Unknown adapters stop startup
A typo in
integration.adapterIdexits non-zero withunknown adapterIdinstead of falling back to something else. -
Bundled database is demo-only
The chart can run its own PostgreSQL for our demo cluster. With the customer profile, that option fails rendering: you bring your own.