AWS
Deploy on EKS or ECS Fargate with Amazon RDS for MySQL.
Azure
Deploy on AKS or Container Apps with Azure Database for MySQL.
Google Cloud
Deploy on GKE or Cloud Run with Cloud SQL for MySQL.
Terraform modules (beta)
These cloud-native options deploy the core Den web and Den API services without Kubernetes. They do not imply support for every optional Helm component or the hosted managed installer. All three modules are available ondev with the same
beta support level; their tested scenarios and cloud-specific limits differ:
The shared module contract
describes migration ordering, secrets preservation, tool compatibility, and the
per-cloud limits. A successful core smoke run is not production load, backup
restoration, or legacy-upgrade certification. Follow the source revision’s README
for exact inputs and test coverage. Availability on
dev does not imply a tagged
module release or production qualification.
Managed installation from hosted OpenWork
The default-off Deployments rollout lets workspace owners approve an AWS installer in their own account and track health and approved updates. The GCP implementation additionally uses the default-offmanagedDeploymentsGcp
rollout and customer-approved Google Cloud Shell. It requires a dedicated
billing-enabled project, public Cloud DNS, and an operator-published immutable
installer release. Local tests are not a live deployment receipt; the GCP
rollout must stay off until a real release and approved installation are verified.
Azure is not supported by the managed installer yet.
A locked installer message is server-side publication/configuration—not a
request for your cloud keys. Signing in to AWS or Google Cloud on your Mac
cannot publish the installer. Operators follow
the managed-deployment runbook;
manual deployments below remain independent of the rollout.
Common architecture
Every provider guide uses the same OpenWork boundaries:- Den web listens on port
3005and serves the browser experience. - Den API listens on port
8788and owns authentication, organizations, policy, and control-plane APIs. - A MySQL 8-compatible database stores shared control-plane state.
- The default migration Job is a pre-install/pre-upgrade hook, not an automatic safe rolling schema cutover.
- OpenWork Gateway is optional and disabled by default; it retains the
openwork-inferenceimage and*-inferenceresource names. It is not the separateden-gatewayWeb proxy. - HTTPS hostnames expose web and API traffic through the provider’s load-balancing layer.
Reverse-proxy client addresses
SetDEN_TRUSTED_PROXIES on Den API to a comma-separated list of your reverse
proxies’ IP addresses or CIDRs (for example, 192.0.2.10,192.0.2.11). Better Auth
uses this list to resolve forwarded client addresses for authentication rate
limits. Without it, clients can share a fallback rate-limit bucket.
Only include the proxies you operate, not broad ranges containing clients. Your
origin must accept traffic only from those proxies, and the proxies must overwrite
or safely append forwarded headers. This setting interprets the forwarded chain;
it cannot verify the direct sender. Leave it unset when there is no trusted proxy.
Keep rate limiting enabled in production.
Deployment sequence
- Create the Kubernetes cluster and private MySQL database in compatible networks.
- Reserve the public address or load-balancer entry point.
- Create the database, database user, and Kubernetes namespace.
- Generate independent database, Better Auth, and Den encryption secrets.
- Prepare provider-specific Helm values for the web and API hostnames.
- For a fresh database, install the matching chart/images and verify initialization before opening traffic. For an existing database, follow the release-specific migration and rollout procedure; Gateway requires the quiesced upgrade guide, not an unattended rolling upgrade.
- Point DNS at the load balancer and verify trusted HTTPS.
- Create the first administrator.
- Configure SAML or OIDC SSO and invite or provision members.
Before you start
You need:- a cloud account with permission to create Kubernetes, networking, load-balancing, managed MySQL, DNS, certificates, and secrets;
kubectland Helm, plus the provider CLI and Kubernetes authentication plugin;- two DNS names, normally one for Den web and one for Den API;
- a real email address for the initial owner;
- a backup, restore, upgrade, and rollback plan.
The provider pages give the supported architecture and point to the repository’s detailed operator runbooks for exact commands. Pin a chart version in production and use the runbook from the matching release or branch.
After deployment
To configure Gateway, follow Enable OpenWork Gateway. This requires the Gateway-capable chart implementation introduced in0.2.0 or later, matching release images, and an authenticated capability-version-1 response. Gateway is GA for admins in every organization when configured; no platform-admin organization grant or organization API toggle is needed. GATEWAY_ENABLED and deploymentCapabilities.aiGateway remain installation configuration checks. Neither legacy service enablement nor existing OpenWork Models billing enables the deployment automatically.
Scheduled maintenance jobs
Two maintenance tasks run on a schedule instead of on every request, so busy write paths never queue behind a shared totals row. Other background work (SCIM cleanup, Automations, worker reconciliation, provider token refresh) runs inside Den API or the Gateway and needs no setup.
Both endpoints answer
404 when their token is not configured and 401 for a wrong token. Both are safe to rerun.
With Helm, enable each job and its token as described in Enable OpenWork Gateway and the chart README’s Audit usage refresh section. On Cloud Run, ECS Fargate, or Docker Compose, schedule the calls yourself with Cloud Scheduler, EventBridge Scheduler, or host cron, from a network location that can reach the internal service: