Skip to main content
Version: 5.x

Deployment Config

Defined in default/deployment/ and default/docker.yaml. These keys are only read by the deployment scripts (yarn deploy, yarn docker, yarn check-secrets, and yarn deploy:chat), never by the running services (with two exceptions noted below). See Deploying to Kubernetes for the walkthrough.

Cloud​

Defined in default/deployment/_index.yaml.

KeyDefaultTypeWhat it does
deployment.cloud"local""local" or "custom"local deploys to the cluster in your ~/.kube/config, which must be Rancher Desktop or Docker Desktop (current context rancher-desktop or docker-desktop), with Traefik disabled, and with exactly one enabled cluster. custom deploys to each enabled cluster using its kubeconfig value.

Pulumi​

Defined in default/deployment/pulumi.yaml. Redwood uses Pulumi to create Kubernetes resources and keeps its state in a Pulumi backend.

KeyDefaultTypeSecretWhat it does
deployment.pulumi.local-modetrueboolStore state on your machine (file://~) instead of url. Also skips the Pulumi keys in the default-secrets check.
deployment.pulumi.url"https://api.pulumi.com"stringBackend URL, the same as pulumi login <url>: Pulumi Cloud, file://<path>, s3://, gs://, or azblob://. Ignored in local mode.
deployment.pulumi.access-token""stringyesPulumi Cloud access token (personal or organization). Ignored in local mode or for file:// URLs.
deployment.pulumi.allow-insecurefalseboolPass --insecure to pulumi login.
deployment.pulumi.encryption.provider"default"stringUnused in 5.x; the backend's default secrets provider is always used.
deployment.pulumi.encryption.passphrase""stringyesExported as PULUMI_CONFIG_PASSPHRASE, which file-based and cloud storage backends use to encrypt secrets in the state.
deployment.pulumi.org"organization"stringPulumi Cloud organization (passed as --default-org). Ignored for file and cloud storage backends, and when left as "organization".
deployment.pulumi.project"project"stringPulumi project name.
deployment.pulumi.stack"dev"stringPulumi stack name. Use a different stack per environment (e.g. staging, production).

DNS​

Defined in default/deployment/dns.yaml.

KeyDefaultTypeSecretWhat it does
deployment.dns.provider"none""none" or "cloudflare"When cloudflare, yarn deploy creates A records pointing at the cluster's ingress for the Director Frontend, the Director Backend, each realm's Frontend, and each realm's Backend (unless the backend host is an in-cluster svc.cluster name). An existing record with the same name but a different value is replaced. The zone is taken from the last two labels of each host, so multi-part TLDs like .co.uk aren't supported.
deployment.dns.cloudflare.proxiedtrueboolProxy the records through Cloudflare. If you do, set tls: true on the matching external connections.
deployment.dns.cloudflare.credentials.account-id""stringYour Cloudflare account ID.
deployment.dns.cloudflare.credentials.token""stringyesA Cloudflare API token that can edit DNS for your zones.

Redwood Services​

Defined in default/deployment/redwood.yaml (variableCasing: "original").

KeyDefaultTypeWhat it does
deployment.redwood.nodeSelectornullobject or nullKubernetes nodeSelector for every Redwood microservice Deployment (not Helm charts, text chat, or game servers). E.g. { "pool": "backend" }.
deployment.redwood.debugtrueboolCreate an extra <service>-debug Service per microservice exposing its Node inspector port (*.debug-port) so you can attach a debugger. staging: false.
deployment.redwood.config-dir"config/node"stringWhere the generated config is mounted inside each container. Must match the image: config/node for -dev images, config for core-runner images (the standard and staging environments set config).
deployment.redwood.prisma.sync-type"db push"stringUnused in 5.x; yarn deploy always runs prisma migrate deploy.
note

yarn deploy writes the entire resolved config of the environment into each service's ConfigMap. Prefer the secrets system for sensitive values so they don't end up in plain text there.

Kubernetes Clusters​

Defined in default/deployment/kubernetes/instances/. Like realms, every entry inherits from redwoodBase.yaml, and k8s-default.yaml defines the default cluster. Keys below are relative to deployment.kubernetes.instances.<id>.

KeyDefaultTypeSecretWhat it does
id"" (k8s-default)stringThe cluster's ID. Must equal its file name (realms find their region with deployment.kubernetes.instances.<realm k8s.id>). Referenced by director.k8s.id and realm.instances.<key>.k8s.id.
enabledfalse (k8s-default: true)boolDeploy to this cluster.
kubeconfignullstring or nullyesThe contents of a kubeconfig file (not a path). Required for deployment.cloud: custom; ignored for local.
region.name"Local"stringRegion name shown to players and used for matchmaking, for realms using Agones in this cluster. Read by the running realm services.
region.ping"127.0.0.1"stringHost or IP that clients ping to measure latency to this region. Must be publicly reachable for real clusters. Read by the running realm services.
region.provider-id"local"stringUnused in 5.x.
dependencies.ingress.valuesnullobjectHelm values merged over deployment.dependencies.ingress.values for this cluster. The ingress controller is always installed.
dependencies.grafana.enabledfalseboolInstall the Grafana agent operator and Kubernetes monitoring charts.
dependencies.grafana.agentOperatorValuesnullobjectPer-cluster Helm values for grafana-agent-operator.
dependencies.grafana.k8sMonitoringValuesnullobjectPer-cluster Helm values for grafana-k8s-monitoring.
dependencies.metricsServer.enabledfalse (production: true)boolInstall metrics-server (Rancher Desktop already has one).
dependencies.metricsServer.valuesnullobjectPer-cluster Helm values.
dependencies.openMatch.enabledtrueboolInstall Open Match. Only installed when redis.enabled is also true. Required for realms using ticketing.matchmaking.provider: open-match.
dependencies.openMatch.valuesnullobjectPer-cluster Helm values.
dependencies.postgresql.useExternalDbfalse (production: true)boolfalse installs PostgreSQL in the cluster (without persistent storage; development only) and runs migrations through a port-forward. true uses your managed database via the deployment-access settings. The cluster named by director.k8s.id decides this for migrations.
dependencies.postgresql.externalDbId""stringUnused in 5.x.
dependencies.postgresql.valuesnullobjectPer-cluster Helm values.
dependencies.redis.enabledtrueboolInstall Redis in the cluster. Required: Redwood's deployment expects the in-cluster Redis.
dependencies.redis.valuesnullobjectPer-cluster Helm values.
dependencies.seaweedfs.enabledtrueboolInstall SeaweedFS for S3-compatible blob storage.
dependencies.seaweedfs.auth.admin.accessKey / .secretKey"seaweedfs-admin"stringyesCredentials for SeaweedFS's admin identity.
dependencies.seaweedfs.auth.backend.accessKey / .secretKey"seaweedfs-backend"stringyesCredentials for the identity realms use (the realm persistence.blobs.s3.connection.credentials default to the k8s-default cluster's values).
dependencies.seaweedfs.valuesnullobjectPer-cluster Helm values.
dependencies.agones.valuesnullobjectPer-cluster Helm values for Agones, which is installed when any realm on the cluster uses the agones provider.
pools.backend / pools.game-serverstrueboolUnused in 5.x.

Helm Dependencies​

Defined in default/deployment/dependencies/ (variableCasing: "original", so Helm values keep their chart spelling). Every chart has the same fields:

FieldWhat it does
repoHelm repository URL.
versionChart version.
chartChart name, also used as the Helm release name. Don't rename it; Redwood looks up some releases by this name.
namespaceNamespace for the release.
createNamespaceCreate the namespace if missing.
waitWait for the release to be ready.
valuesHelm values for every cluster, deep-merged with each cluster's dependencies.<chart>.values. Processed for secret references.
KeyChart and versionNamespaceInstalled whenNotable defaults
deployment.dependencies.ingressingress-nginx 4.13.3defaultalwaysLong proxy read/write timeouts (3600 s) for websockets.
deployment.dependencies.grafana-agent-operatorgrafana-agent-operator 0.3.8observabilitygrafana.enabled
deployment.dependencies.grafana-k8s-monitoringgrafana-k8s-monitoring 0.2.11observabilitygrafana.enabledPlaceholder Prometheus, Loki, and OpenCost settings you must fill in.
deployment.dependencies.metrics-servermetrics-server 3.13.0metrics-servermetricsServer.enabled
deployment.dependencies.open-matchopen-match 1.8.1 (from cdn.incanta.games)open-matchredis.enabled and openMatch.enabledUses the in-cluster Redis (the hostname embeds persistence.redis.password, so it can't be a secret reference). pendingReleaseTimeout: "1m" should stay above ticketing.matchmaking.max-match-age-ms.
deployment.dependencies.postgresqlpostgresql 12.12.10 (Bitnami, PostgreSQL 15)persistenceuseExternalDb: falseNo persistent volume. values.auth.postgresPassword and values.auth.password (secrets supported) default to "password" and "redwood".
deployment.dependencies.redisredis 20.13.4 (Bitnami)persistenceredis.enabledmaxmemory 400mb with noeviction, 512Mi memory limit, no replicas or persistence. The password always comes from persistence.redis.password.
deployment.dependencies.seaweedfsseaweedfs 4.0.399persistenceseaweedfs.enabledS3 API with auth enabled.
deployment.dependencies.agonesagones 1.53.0agones-systema realm on the cluster uses agonesvalues.gameservers.namespaces is ["realm-default"]. Add every Agones realm's k8s.namespace to this list (it's a list, so copy the whole value).

Docker​

Defined in default/docker.yaml.

KeyDefaultTypeSecretWhat it does
docker.build-in-pulumitrueboolBuild images as part of yarn deploy. staging: false; we recommend building and pushing images with yarn docker <env> or CI and setting the image-tag values instead.
docker.use-buildkittrueboolUse BuildKit for builds inside yarn deploy (yarn docker always does).
docker.push-imagesfalseboolPush images built by yarn deploy to the registry. (yarn docker pushes unless you pass --skip-push.)
docker.registry.url"yourcr.com/container-registry"stringYour container registry, without a trailing slash. Leaving the placeholder value means "no registry": images must already exist in the local cluster's Docker (Rancher Desktop or Docker Desktop) and are never pulled. Any other value creates an image pull Secret in each namespace and always pulls.
docker.registry.secret-name"redwood-container-registry-secret"stringName of the image pull Secret.
docker.registry.auth.username"yourcr-username"stringRegistry username.
docker.registry.auth.password"yourcr-password"stringyesRegistry password or token.
docker.image-prefix"${docker.registry.url}/redwood"stringPrefix for every Redwood image name (<prefix>-dev, <prefix>-core-runner, <prefix>-match-function, <prefix>-game-server).