Client Prerequisites
Everything on this page must exist before the deployment window. Items marked (blocking) stop the install; items marked (degraded) let the install finish but leave a feature broken until provided.
1. AWS account & access (blocking)
- A dedicated or shared AWS account where OpenBox will run. The deploy region must be one of:
us-east-1,us-east-2,us-west-2,eu-west-1,eu-west-2,eu-central-1,ap-southeast-1,ap-southeast-2,ap-south-1,ap-northeast-1(EKS Auto Mode availability — other regions need explicit vendor sign-off). - An IAM deploy role the operator can assume, with administrator-level access for the deployment window (CloudFormation, EKS, EC2, IAM role creation, Route53, ACM, Secrets Manager, Lambda, S3). If your org enforces an IAM permissions boundary, give us its ARN — the CDK attaches it to every role it creates.
- One or more IAM role ARNs that should get cluster admin (EKS access entries) — usually your platform team's role. At least one is required.
- CDK bootstrap is allowed in the account/region (we run
cdk bootstraponce if it has never been done).
2. Service quotas (blocking — longest lead time, request first)
Check in Service Quotas → EC2, in the deploy region:
| Quota | Minimum | Why |
|---|---|---|
| Running On-Demand G and VT instances | ≥ 8 vCPUs | LlamaFirewall's vLLM runs on one g5.xlarge GPU node (4 vCPUs); headroom for node replacement during upgrades |
| Running On-Demand Standard (A,C,D,H,I,M,R,T,Z) | ≥ 64 vCPUs | cpu/memory/database/guardrails node pools (c6a, m7a, r* families) |
A brand-new account commonly has the G-family quota at 0 — the request can take 24–48 h, so file it first. If GPU capacity is impossible for you, tell us in advance: LlamaFirewall can be disabled, which removes prompt-scanning (guardrails-api's LLM checks degrade).
3. Networking — you create it, we import it (blocking)
The CDK never creates networking. Provide:
- A VPC in the deploy region.
- ≥ 2 private subnets in distinct AZs with outbound internet via NAT (image pulls from ghcr.io/quay.io, ACM/STS/Secrets Manager calls). Tag-free is fine; we reference by subnet ID.
- ≥ 1 security group you own (used by the preflight Lambda and the node NodeClass; we never create SGs). Default egress-all is sufficient.
- VPC DNS attributes both enabled —
enableDnsSupport=trueANDenableDnsHostnames=true(a VPC created viaaws ec2 create-vpcdefaults hostnames to false; EKS nodes cannot join without it):aws ec2 modify-vpc-attribute --vpc-id <vpc> --enable-dns-support
aws ec2 modify-vpc-attribute --vpc-id <vpc> --enable-dns-hostnames - Subnet role tags for the load balancer controller — without these the NLB cannot be
placed and the ingress never gets an address:
# every private subnet you hand us:
aws ec2 create-tags --resources <private-subnet-ids> \
--tags Key=kubernetes.io/role/internal-elb,Value=1
# public subnets too, only if you chose ingressPublic:
aws ec2 create-tags --resources <public-subnet-ids> --tags Key=kubernetes.io/role/elb,Value=1 - ≥ 2 public subnets in distinct AZs — required by default, since the ingress is now internet-facing (restricted to your
allowedCidrs). Only optional if you chooseingressPublic: falsefor an internal NLB - Decide cluster API endpoint mode: public+private (default, lets us deploy from outside) or private-only (we must deploy from inside your network — adds setup).
CIDR planning: nothing OpenBox-specific, but if you'll peer the VPC to a corporate VPN later, make sure the CIDR doesn't collide with your VPN-side ranges.
4. DNS & domain (blocking)
- A public Route53 hosted zone in the same account, and the domain you want OpenBox under (the zone's name itself or a subdomain of it).
- If the parent domain lives elsewhere (Cloudflare, GoDaddy, corporate DNS): delegate the zone by adding its 4 NS records at the parent before the deployment window and verify
dig NS <your-zone>answers with the Route53 name servers.
Why blocking: the CDK requests an ACM wildcard certificate validated by DNS. If the zone isn't publicly resolvable, cert validation hangs and the deployment stalls at the certificate step. We create 5 records under the domain (identity, openbox-api, opa, openbox-core, openbox-eks) — the record names are chart defaults; nothing else in the zone is touched.
5. Container images: registry token or Marketplace subscription (blocking)
Which one depends on the chart source agreed with us (see GHCR or AWS Marketplace chart).
AWS Marketplace chart: subscribe your deployment account to the OpenBox listing on AWS Marketplace before the window. There is no token: the cluster's nodes pull images with their own IAM role. Your private subnets' egress must reach 709825985650.dkr.ecr.us-east-1.amazonaws.com, api.ecr.us-east-1.amazonaws.com and prod-us-east-1-starport-layer-bucket.s3.us-east-1.amazonaws.com (the registry is in us-east-1 whatever your region; image layers download from that S3 bucket). The pre-flight check verifies all three. You also need an admin email (§ hand-over item 8) — this chart always creates your organization.
GHCR chart (default): images are pulled from GitHub Container Registry (ghcr.io/openbox-ai/*). The vendor issues a scoped read token (classic PAT with read:packages — fine-grained PATs do not work with ghcr). You store it in your Secrets Manager as a complete .dockerconfigjson document and give us the secret ARN. Secret material never passes through config files or the CDK code — the deployment reads it from Secrets Manager at apply time.
6. Application config & secrets (recommended)
Both services take their configuration purely from the environment — there is no .env file. You supply two things per service:
- Non-secret config (
coreEnv/backendEnvin the deploy config): plain key/value pairs such asSES_FROM_EMAIL,SES_ROLE_ARN,S3_REGION,CONTROL_PLANE_URL,GITHUB_APP_ID. Validation rejects secret-looking keys here, because these are stored in plaintext.
AWS credentials are not yours to create. The deployment generates a dedicated IAM user, access key, and assumable role for each service and injects them automatically, including the backend's KMS_* set. Your AWS-facing job is only to allow those roles whatever they must reach (e.g. SES sending).
7. Email / SES (degraded if missing)
The backend sends email (organization invitations, password reset) through AWS SES using credentials and region from the backend env file.
You must provide either:
- an SES-verified domain or sender identity in a region of your choice, plus an IAM keypair allowed to
ses:SendEmail, or - an explicit "no email" decision.
If SES is not provided: the install completes and the platform runs — the backend boots with placeholder regions — but every email-dependent flow fails at the send step: invited users never receive invitations and password-reset emails never arrive. Admin-driven workarounds (manual password set in Keycloak) exist but are not a substitute. If your SES account is still in sandbox mode, only verified recipient addresses receive mail — request production access early; it can take 24 h.
8. reCAPTCHA: keys or an explicit opt-out (blocking)
Registration and login forms are protected by Google reCAPTCHA. Choose one:
- Use reCAPTCHA — supply the keys below.
- Switch it off — tell us, and we set
recaptchaDisabled: true. Sign-in then works without Google keys.
The deployment refuses a config with neither: reCAPTCHA stays on by default, and without keys nobody could sign in. With keys:
-
Public egress CIDRs for the ingress allowlist (
curl -s https://checkip.amazonaws.comfrom your network; ask your network team for the FULL range). Without them a public install fails validation. -
Site key (public) and secret key (private) — both go into the deploy config (
recaptchaSiteKey/recaptchaSecretKey) and must be supplied together; a site key without its secret key makes every verification fail. -
The site key's allowed domains list in the Google admin console must include your OpenBox domain (a parent domain covers subdomains).
If missing or the domain isn't allow-listed, the app loads but registration/login form submissions fail captcha verification.
9. Application KMS key (nothing to provide)
The backend's symmetric KMS key is created automatically in your account (install-scoped alias, rotation off, RETAIN — deleting the stack never deletes the key). You only need the IAM credentials in your backend env file to allow kms:*; the key's ARN comes back as a stack output.
10. License (blocking unless PoC)
A licensed install needs three values from your OpenBox license bundle: the license token (stored in your Secrets Manager), your tenant ID, and the control-plane URL. PoC/evaluation installs waive all three by agreement.
11. Optional: OPA policy bundle (nothing to provide)
The policy-bundle bucket and OPA's read access are created automatically (IRSA — no S3 keys to issue or rotate). If you maintain custom OPA policies, upload bundle.tar.gz to that bucket after the install (command is a stack output) and ask us to set opaBundleEnabled: true. Until then OPA runs with the chart's built-in policy — fine for most installs.
Hand-over summary
Send us, in writing, before the window:
- Account ID, region, deploy role ARN (+ permissions boundary ARN if any)
- VPC ID, ≥2 private subnet IDs, SG ID(s), (public subnet IDs if public ingress)
- Hosted zone ID + domain (delegation verified)
- Admin role ARN(s) for cluster access
- Chart source (GHCR or AWS Marketplace). GHCR: the Secrets Manager ARN of the registry token. Marketplace: confirmation that the account is subscribed. Plus backend/core env values and the license ARN
- reCAPTCHA site and secret key, or a decision to switch reCAPTCHA off; SES decision
- Kubernetes version preference (1.31–1.36; we default to a recent stable minor)
- Admin email for org pre-seeding — must be on your corporate domain; the domain becomes your organization ID. Optional for the GHCR chart, required for the Marketplace chart
Every one of these maps 1:1 to a field in Config Reference.