26.0.0 → 26.7.1
- Upgrade
- 26.0.0 → 26.7.1
- Scale
- unchanged: 1000 users, carried through the previous upgrade
- Database
- PostgreSQL 16.15 (Debian pgdg13), single node, container
- Topology
- single container, single replica
- Host
- Hetzner CCX33 (fsn1) — 8 vCPU dedicated, 30GB usable RAM, 226GB local NVMe, Debian 13, kernel 6.12.101+deb13-cloud-amd64
- Rehearsal
- attempt 1 of 3 — this lab holds a path to three clean runs, one exercising rollback
- Condition
- routine — no adverse condition applied
- Elapsed
- not captured | operator error — the elapsed line was filtered out of the captured output. Re-run required for a clean total.
Environment
Identical to 2026-08-25-25.0.6-to-26.0.0-1 (same box, same fixture, same
container) except:
| Field | Value |
|---|---|
| Keycloak from → to | 26.0.0 → 26.7.1 |
| Distribution | quay.io/keycloak/keycloak 691MB → 766MB |
| Dataset scale | unchanged: 1000 users, carried through the previous upgrade |
| Prior state | realm had already been migrated 25.0.6 → 26.0.0 in the run above |
Caveat on comparability: this realm reached 26.0.0 by migration, not by a clean 26.0.0 install. A realm that was born at 26.0.0 may migrate differently. Stated because our fixture-comparability rule makes differently-shaped fixtures non-aggregatable, and this is a shape difference.
Procedure
./bin/snapshot.sh baseline-26.0.0-typical-1k
./bin/upgrade.sh 26.7.1
Timings
| Phase | Duration | Notes |
|---|---|---|
| Container start → server "started" | 3.029s | Quarkus self-report, 15:32:28,510 |
| Liquibase / schema migration | ~3.3s | 15:32:29,111 "Updating database" → 15:32:32,414 reaching 26.7.0 |
| Model migration chain | within the above | stepped internally through 26.3.0 → 26.4.0 → 26.4.3 → 26.6.1 → 26.6.2 → 26.7.0, each migrating both lab and master |
| Total to ready | not captured | operator error — the elapsed line was filtered out of the captured output. Re-run required for a clean total. |
Outcome
- Reached ready
- Realm config intact — 1000 users
-
Login flow works —
labuser7token issued - Custom SPI / themes / federation — not in fixture
Breakage observed
Schema migration ran AFTER the server reported "started"
- Symptom: Quarkus logged
started in 3.029s. Listening on: http://0.0.0.0:8080at 15:32:28,510 — thenUpdating databasebegan at 15:32:29,111 onexecutor-thread-1, finishing ~15:32:32,4. On the 25.0.6 → 26.0.0 run the same work ran on(main)before ready. - Evidence: container log, both runs, timestamps above.
- Cause: suspected, NOT confirmed. Two candidate explanations and this run cannot distinguish them: (a) 26.7.x defers schema migration out of the startup path, or (b) migration is lazily triggered by the first inbound request, and the trigger here was
wait-ready.shpolling the token endpoint. Theexecutor-thread-1context is consistent with (b). - Fix or workaround: none — behaviour, not a fault.
- Would this hit a customer? Potentially serious if (a) holds. A server that reports started and opens its port while the schema is still migrating will pass a naive TCP or
/health/startedcheck, so a load balancer or Kubernetes readiness probe could route production traffic mid-migration. That is precisely the Infinispan/rolling-update failure class the ledger already lists. - RESOLVED 2026-08-25 by
2026-08-25-26.0.0-to-26.7.1-2: explanation (a) holds — migration runs unprompted, confirmed from Postgres with the server left untouched for 120s. But the consequence stated here was wrong:/health/readycorrectly reports 503 throughout, so a readiness probe is safe. The exposure is/health/startedand TCP port checks. See that record. NEXT ACTION — this is the highest-value follow-up from today.Re-run with no client polling at all, watching the log passively, to establish which explanation holds. It is cheap, and if (a) is true it is publishable ledger content that nobody else has measured.
Hostname v1 warning changed emission path between 26.0.0 and 26.7.1
- Symptom: same message, different form. 26.0.0:
ERROR [org.keycloak.quarkus.runtime.configuration.mappers.PropertyMappers] (main) Hostname v1 options [hostname-strict-https] are still in use. 26.7.1:WARNING: Hostname v1 options [hostname-strict-https] are still in use— no timestamp, no logger name, i.e. emitted by the CLI layer rather than the logging subsystem. - Evidence: logs from both runs, quoted above.
- Cause: suspected — the message moved from the logger to CLI-level output between these versions. Not confirmed against release notes.
- Would this hit a customer? Only as an alerting artifact: anyone who wrote a log-scraping rule against the 26.0.0 ERROR form will silently stop matching on 26.7.x. Minor, but it is exactly the kind of thing that erodes trust in an alerting pipeline.
- Additionally on 26.7.1:
WARNING: With HTTPS not enabled, proxy-headers unset, and hostname-strict=false, the server is running in an insecure context.Expected for this lab config; would be a real finding on a customer system.
Rollback
- Exercised this run? no
- Method: snapshot
baseline-26.0.0-typical-1kexists, not restored - Verdict: not established.
Verification
| Claim | Primary source | Checked |
|---|---|---|
| 26.7.x defers schema migration out of the startup path | UNRESOLVED — see NEXT ACTION above | ☐ |
| Hostname v1 message moved from logger to CLI output | Keycloak release notes 26.1–26.7 — not checked | ☐ |
Publishable extract
Withheld — the headline observation is explicitly unconfirmed.