GoRunner docs
Search or askSearch⌘K

Helm values

Every value of the GoRunner Helm chart, with its default.

Self-hosted

Set them in your values file, or with --set. helm install and helm upgrade check them first, and say in one sentence what is wrong. To see them with their comments:

bash
helm show values oci://ghcr.io/ralve-org/charts/gorunner --version 2026.10.30

Below, <release> is the name the chart gives its objects: gorunner for a release named gorunner, so gorunner-api. A setting with a value of its own here, such as worker.concurrency, is refused under config.

Helm chart values, by group
NameDefaultWhat it does
The image5
ghcr.io/ralve-org/gorunner-selfhost

Where the image comes from. Change it for a mirror inside your company.

the chart’s release

The version to run. Leave it empty: each chart version runs its own release.

—

sha256:… pins the exact image, and wins over the tag.

IfNotPresent

When the cluster downloads the image again.

[]

The Secret with the registry’s user name and token, such as [{name: ghcr}]. GoRunner’s image is private, so this is needed. The chart is private for now too: sign Helm in first (helm registry login ghcr.io). Every pod that runs GoRunner’s image uses it, the bundled file store’s relay included.

Where people reach it10
from ingress.host

The address people open. Every email, approval page and OAuth redirect is built from it. Empty: ingress.host, with https when ingress.tls.enabled.

true

Make an Ingress. Off: route to the <release>-api Service yourself, on port 80.

nginx

The IngressClass, such as nginx, traefik or alb. Empty: the cluster’s default.

—

The domain name. Required with an Ingress.

/

GoRunner needs the whole host; a sub-path isn’t supported. With ingress.pathType, Prefix.

false

Serve the address over https. Turn it on unless something in front ends https.

<release>-tls

The certificate’s Secret, or the one cert-manager writes.

{}

Your own, such as cert-manager.io/cluster-issuer. They win over the chart’s.

true

With className: nginx: no response buffering, an hour’s read and send timeout, and a 6 MiB body.

—

Who may name the caller’s address. Empty trusts every private address, safe only while the network policy is on.

More

With networkPolicy.enabled off, it is required and must name your controller’s own addresses; private_ranges is then refused.

The first admin and sign-in4
—

Only this address can make the first account. Optional without existingSecret; with it, see admin.allowOpenFirstSignup. It does nothing once an account exists.

false

With existingSecret and no admin.email: true lets whoever has the setup code be first.

More

false: the first admin must be ADMIN_EMAIL in your Secret, and without that key nobody can be.

false

false: people join by invitation. true: anyone who can open the address can make an account.

selfhosted

Leave it.

Secrets5
—

Your own Secret, its keys the setting names. Set, the chart writes none, and every secret value here is ignored.

More

Keys: ENCRYPTION_KEY always; ADMIN_EMAIL unless admin.email is set; DATABASE_URL (or POSTGRES_PASSWORD) and REDIS_URL (or REDIS_PASSWORD) unless bundled; S3_ACCESS_KEY, S3_SECRET_KEY; RESEND_API_KEY or SMTP_PASSWORD; HTTPS_PROXY, HTTP_PROXY; and if used LICENSE_KEY, PLATFORM_ADMIN_SECRET, METRICS_TOKEN, SENTRY_DSN, OTEL_EXPORTER_OTLP_HEADERS, OAUTH_MANAGED_<PROVIDER>_CLIENT_SECRET. After changing it, restart the pods: kubectl rollout restart deployment -l app.kubernetes.io/instance=<release>.

—

64 hex characters (openssl rand -hex 32). Opens every stored credential. The chart never makes one up.

Warning Keep it apart from the database’s backups, and never change it once there is data.

—

The license. Optional: the first admin is asked for one after signing in. One loaded in the dashboard comes first while in force.

—

The key to the operator console at /admin. Empty keeps it closed; set it only when GoRunner asks.

{}

Any other secret setting by its name, such as OAUTH_MANAGED_GOOGLE_CLIENT_SECRET.

Mail7
none

none: people sign in with a password. resend or smtp: sign-in by emailed link.

—

The sender, on a domain your mail service may send for.

—

With backend: resend.

—

With backend: smtp.

587

587, or 465 for TLS from the first byte.

—

starttls, tls or none. Empty: tls on 465, otherwise STARTTLS.

—

With mail.smtp.password. Leave both empty for a server with no sign-in.

PostgreSQL7
—

Your database, PostgreSQL 15 or newer, as one address. It wins over the fields below.

—

The host alone, without its port. With port (5432), database (gorunner), user and password.

require

disable, require, verify-ca or verify-full.

—

The CA for verify-ca or verify-full, as a path in the pods, such as /certs/rds.pem.

empty: 50

The most connections each pod keeps (DB_MAX_CONNS). All pods, plus one of each while an upgrade rolls, must fit max_connections.

empty: 5

Connections the check keeps free for backups and an admin, at least 5.

false

Run the chart’s own PostgreSQL 15.6: one pod, an 8Gi volume, no backups. Evaluation only.

Redis4
—

Your Redis 6.2 or newer as one address, rediss:// for TLS. Not in cluster mode, with noeviction.

—

Separate fields: port (6379), db (0), user, password.

false

true for an encrypted connection.

false

Run the chart’s own Redis: one pod, a 2Gi volume, no replica. Evaluation only.

Object storage7
none

none: step data stays in PostgreSQL. external: your bucket. bundled: one SeaweedFS pod, evaluation only.

gorunner

With objectStorage.region, us-east-1.

0

Step data larger than this goes to the bucket. 0: all of it.

empty: 15

How long one storage call may take. maxAttempts: how often it is tried, 4.

—

Your store’s address.

false

true for MinIO and SeaweedFS.

—

With secretKey.

Bundled stores (evaluation)5
15.6

docker.io/library/postgres (image.repository). image.digest is empty: a new image string would restart the database. Set it yourself to pin one.

7-alpine

docker.io/library/redis. The release sets image.digest to the one the tag named when it was tested.

4.33

docker.io/chrislusf/seaweedfs, with its digest set by the release.

8Gi

Redis 2Gi, SeaweedFS 10Gi. Each also takes persistence.storageClass (empty: the cluster’s default) and resources.

made once

Also redis.bundled.password and objectStorage.bundled.accessKey / secretKey. Empty: made once and kept in the <release>-bundled Secret, which outlives an uninstall.

More

A first install derives them from encryptionKey, so helm template (Argo CD, Flux) renders the same ones every time. With existingSecret and helm template, set them yourself.

The app15
2

Keep at least 2, so a drain or a crash never leaves nobody to answer.

100m CPU, 256Mi–1Gi

CPU and memory for each.

90

Runs that finished longer ago than this are deleted hourly, with their data. Each workflow keeps its newest finished run in each environment.

empty: 1200

Requests a minute per credential. Also webhook 3000, oauth 120, embedApi 3000, embedAccount 300, embedOauthRequest 600 (from v2026.10.31), embedPerson 20, embedRenew 4.

empty: 12

How long the embed renews its own session, 1 to 24 hours.

—

Other websites that may call the API from a browser, separated by commas.

empty: on

off: AI apps’ sign-in addresses (discovery, register, token, revoke) keep the API’s own CORS instead of answering any website. For an installation reached only from your own network (OAUTH_PUBLIC_CORS, from v2026.10.31).

—

More app callbacks AI apps may register: whole addresses, separated by commas, no query (OAUTH_EXTRA_REDIRECT_URIS, from v2026.10.31).

false

Adds the caller’s address and browser to each request’s line (ACCESS_LOG).

—

public: health checks show their details to anyone (HEALTH_DETAILS).

60

When a pod stops, how long it has to finish requests, after preStopSeconds (10).

true

Keep at least minAvailable (1) app pod through node drains.

ClusterIP

The Service in front of the app, on port 80, with annotations of your own.

[]

More environment variables for the app pods, as a Kubernetes env list.

{}

Also tolerations, affinity, topologySpreadConstraints, priorityClassName, podAnnotations, podLabels.

The workers9
1

More workers is the safer way to grow than larger ones.

4

Runs one worker runs at once. Raise its memory limit with it.

250m CPU, 512Mi–2Gi

CPU and memory for each.

2

Keel conversations one worker serves at once. 0 turns Keel off on it.

—

off: Keel builds without its compile step. Leave it unless GoRunner asks.

empty: 4

Notifications to your server one worker sends at once.

empty: 2

Test step and connection tests one worker serves at once.

330

How long a stopping worker may finish its runs. After that, another worker picks them up.

[]

And the same placement values as the app.

Workflows3
—

Private addresses steps may reach: empty for none, all, or ranges. See Outbound access.

empty: 10000

Runs of one organization that may wait before new ones are refused. 0: no cap.

empty: 1000

The same for one workflow, editor test runs included.

Migrations and the check6
true

Run the migrations Job at every install and upgrade. Leave it on.

[]

Extra flags, only when GoRunner asks.

6

Retries. activeDeadlineSeconds: 900 in all.

86400

The finished Job and its log go after a day.

More

The Job is named after the Helm revision and the image (<release>-migrate-r3-…), so helm template and GitOps tools make a new Job for every version instead of changing a finished one. Read its check with kubectl logs job/<name> -c check.

50m CPU, 64Mi–256Mi

CPU and memory for the Job.

true

A problem the check finds fails the Job. false: only logged, except one that protects data.

A company proxy3
—

With proxy.http: the proxy’s address, kept in the Secret.

—

Names reached directly. GoRunner adds its own, the cluster’s .svc and .cluster.local among them.

—

name or ip. See By name, or by address.

Certificates and extra volumes1
[]

More volumes on every pod, with extraVolumeMounts. Every .pem mounted at /certs is trusted.

Monitoring5
—

LOG_LEVEL. And logFormat: LOG_FORMAT.

—

OTEL_EXPORTER_OTLP_ENDPOINT. Each telemetry.otel.* value is the OTEL_* setting of the same meaning; headers is kept in the Secret.

false

METRICS_ENABLED: /metrics on port 9464 of every pod, with token and workflowLabels.

—

SENTRY_DSN, kept in the Secret, with environment.

—

CLIENT_ERRORS_ENABLED. Also auditRetentionDays, auditCredentialUseRetentionDays, auditIpRetentionDays and eventStreamingEnabled.

Any other setting1
config
{}

Any setting the values above don’t cover, by its name, such as OUTBOUND_ALLOW_PRIVATE: "true".

Kubernetes8
true

GoRunner never calls the Kubernetes API, so the account holds no token. Also name and annotations.

user 10001, non-root

With the default seccomp profile.

read-only root

No privilege escalation, every capability dropped.

true

Only your controller and helm test reach the app; the workers accept nothing. Needs a plugin that enforces NetworkPolicy.

the ingress-nginx namespace

Who may reach the app. Change it for any other controller, or the app answers nobody.

[]

Who may read /metrics on port 9464.

true

The checks helm test runs.

—

With fullnameOverride: other names for the chart’s objects.