The Keycloak Upgrade Ledger

Every upgrade we have rehearsed, with the environment stated and the clock running.

2026-08-31 · run 2026-08-31-26.7.1-to-26.7.3-1

26.7.1 → 26.7.3

Upgrade
26.7.1 → 26.7.3
Scale
1 realm (lab), 1,000 users, 11 clients (5 seeded + 6 default), 1 group (corp + 3 children), 2 IdP brokers, 1 LDAP component, 1 organization, 1 fine-grained-authz client
Database
Postgres 16, single node
Topology
single container
Host
laptop (Arch Linux, docker 29.7.2 / compose 5.5.0)
Rehearsal
attempt 1 of 3 — this lab holds a path to three clean runs, one exercising rollback
Condition
routine — no adverse condition applied
Elapsed
24s (stop → ready)

Environment

FieldValue
Keycloak from → to26.7.1 → 26.7.3
Stepping path (if multi-hop)direct (patch hop, no stepping)
Distributionquay.io/keycloak/keycloak (official image)
Start modestart w/ external Postgres — never start-dev
DatabasePostgres 16, single node
Postgres tuningstock defaults (no shared_buffers / maintenance_work_mem / statement_timeout override)
Adverse scenarionone — routine patch hop, motivated by the 2026-08 advisory batch
Dataset scale1 realm (lab), 1,000 users, 11 clients (5 seeded + 6 default), 1 group (corp + 3 children), 2 IdP brokers, 1 LDAP component, 1 organization, 1 fine-grained-authz client
Seeding methodpartialImport (1,000 users in 69s)
Fixture profilekitchen-sink
Topologysingle container
Hostlaptop (Arch Linux, docker 29.7.2 / compose 5.5.0)
JVM heap-Xms1g -Xmx4g
Elapsed clock24s (stop → ready)

Procedure

./bin/lab-up.sh 26.7.1
./bin/seed-realm.sh --profile kitchen-sink --users 1000
./bin/upgrade.sh 26.7.3     # stop → pg_dump backup → image swap → up → wait-ready → index-audit

Timings

PhaseDurationNotes
Container start → DB connectnot isolated this run
Liquibase / schema migration0 changesetsno migration log lines emitted; see Finding
Cache/realm warmnot isolated
First successful token issueadmin-cli token issued immediately after ready
Total to ready24sincludes image pull for 26.7.3

Outcome

Breakage observed

None attributable to the migration. One pre-existing seed-time issue (not a migration result):

seed-realm --user-profile 400 on 26.7.1

Rollback

Verification

ClaimPrimary sourceChecked
26.7.1 already carries the 2026-08-06 advisory batch (7 CVEs, all keycloak-services)GHSA-95cx-vmr5-3cmr etc.; affected range < 26.7.1, patched 26.7.1yes
26.7.3 adds the 26.7.2 + 26.7.3 security batches (~27 fixes) missing from 26.7.126.7.2 / 26.7.3 release notes (github.com/keycloak/keycloak/releases)yes
26.7.1 → 26.7.3 emits no Liquibase changesetsthis run's log (no liquibase/changelog lines)yes
Schema indexes correct at 26.7.3index-audit.sh 26.7.3: 119/119 correct, 0 missing/wrongyes
26.7.2 → 26.7.3 removes 4 SPI signaturesreports/diffs/api-26.7.2-to-26.7.3.txtyes

Publishable extract

(empty — internal; needs the two remaining clean runs + rollback before a ledger entry can be derived.)

← All runs