# v2026.10.4

Runs are never lost, and wait in line

A run over the limit waits in line instead of being dropped. The Storage and Queue apps keep their data in the database.

## What changed

- Runs wait in the database, so a Redis that loses its data loses no run. See [Runs](https://docs.gorunner.io/build/runs).
- A run over a limit waits in line. At most 10,000 runs of one organization and 1,000 of one workflow wait (`RUNS_WAITING_PER_ORG`, `RUNS_WAITING_PER_WORKFLOW`), test runs included. A webhook waiting for its answer gets `202` after 30 seconds in line. See [Limit runs at once](https://docs.gorunner.io/build/runs-at-once).
- Each organization can have its own runs at once. See [Limit runs at once](https://docs.gorunner.io/build/runs-at-once).
- Storage data moves to the database once. One value holds at most 16 MB, and Test steps keep their own data. See [Storage](https://docs.gorunner.io/apps/storage).
- Queue data moves too, with the same limits. See [Queue](https://docs.gorunner.io/apps/queue).
- Replacing the license in force asks for your two-factor code. `gorunner reset-two-factor` helps when the only admin loses theirs. See [Your license](https://docs.gorunner.io/self-host/license).
- Embed SDK 1.1.0. Version 1.0.0 is still served. See [Versions and upgrades](https://docs.gorunner.io/embed/versions).

## When you update

### Before you update

1. Add the private addresses your workflows call to `WORKFLOW_PRIVATE_NETWORKS`. Otherwise those steps fail with “This address can’t be reached from workflows”. Cloud metadata is never reachable. See [Outbound access](https://docs.gorunner.io/self-host/outbound-access).
2. With Embed, turn on the new switches you want. **Overview**, **Tokens**, **AI clients** and **AI building** arrive off. **Cancel runs** arrives on. The 9 new notification events arrive unticked. See [Switches](https://docs.gorunner.io/embed/switches).
3. With Embed and customers on their own domains, add each customer’s website to that account through the Partner API. Your own list holds up to 200. See [Security](https://docs.gorunner.io/embed/security).
4. If something reads the version from `/api/health` from outside the server, read it on the server, or set `HEALTH_DETAILS=public`. From outside it now gets only `ok`. See [Health checks](https://docs.gorunner.io/self-host/health-checks).
5. If your own proxy asks `/api/embed/frame-policy` itself, it must pass the page’s address on. See [Behind your own proxy](https://docs.gorunner.io/self-host/own-proxy).

### During the update

- The built-in Redis, object storage and Caddy restart once, for a few seconds. The built-in database doesn’t.
- While Storage and Queue data moves, those steps wait, about 0.2 seconds for 10,000 keys. A step that waits past its own time limit fails once with “Storage and Queue data is being moved. Try again in a minute.”
- The new indexes wait up to a minute for older database transactions, such as a running backup. If one is still open, the update stops with the old version running. Run the same command again once it ends.
- The container that holds the address open keeps its version. To move it at a quiet moment, run `./deploy.sh --replace-gate v2026.10.4`.
- New settings: `DB_ADMIN_HEADROOM` keeps 5 database connections free for admins, and `ACCESS_LOG` turns on an access log.

GoRunner’s image is private for now. With Docker, [sign in to the registry](https://docs.gorunner.io/self-host/install-docker#sign-in-to-the-registry) first. On Kubernetes, [sign Helm in and give the cluster its pull Secret](https://docs.gorunner.io/self-host/install-kubernetes#make-a-namespace). See [Update](https://docs.gorunner.io/self-host/update) for the whole procedure, or [Install with Docker](https://docs.gorunner.io/self-host/install-docker) and [Install on Kubernetes](https://docs.gorunner.io/self-host/install-kubernetes) to install this version anew.

**Docker**

```bash
# Check the image first: its Digest must be sha256:09de7241d7c9b551c208e9f3a184a3625885e19b1eb809029b81a7b6184df469
docker buildx imagetools inspect ghcr.io/ralve-org/gorunner-selfhost:v2026.10.4

# Update
./deploy.sh v2026.10.4
```

**Kubernetes**

```bash
helm upgrade gorunner oci://ghcr.io/ralve-org/charts/gorunner --version 2026.10.4 -f values.yaml
```

## Going back

- v2026.10.3’s check refuses the database this release changed, so go past it once. First run the check of this version, and go on only when it reports no problem: `docker compose run --rm check`. Then run `./deploy.sh v2026.10.3 --skip-check`.
- Runs waiting in line are started once each. v2026.10.3 reads the copy of the Storage and Queue data that Redis kept, and what it writes comes back when you update again. Redis keeps that copy for this release only.

Source: https://docs.gorunner.io/changelog/v2026.10.4
