App URL: https://archirapid.streamlit.app
Repo: private (Archirapid/archirapid-mvp), branch main
Python: 3.10 (runtime.txt)
Streamlit: 1.56.0 (pinned)
I believe this is a second, distinct issue caused by the same forced full-container
rebuild that resulted from the bullseye-security InRelease expiration incident
(2026-09-08/09) — not a regression in my own app code. Evidence below.
Symptom 1 — session cookie set correctly, but “orphaned” (its hash matches no row
our server ever wrote)
My app writes an auth cookie (_ar_session, a random urlsafe token) server-side after
login, and stores a hash of that same token in our own database for later verification
on page reload. This has worked reliably for months.
Since the rebuild:
- Cookie IS present in the browser (confirmed via DevTools > Storage > Cookies:
correct domain, path=/, SameSite=Lax, 24h expiry, well-formed 43-char urlsafe token). - Computing sha256(cookie_value) does NOT match the hash we stored server-side for that
exact login (confirmed by comparing timestamps to the second, and checking ALL rows
in the relevant time window, not just the closest one). - Result: every page reload (F5) or browser Back navigation logs the user out, in every
browser tested (Firefox, Chrome), in Incognito, with any browser-level privacy/AV
tooling disabled to rule that out. - Reproduced 100% of the time in production. Cannot reproduce locally
(streamlit run app.pyon the same code, same Python/Streamlit version) — it works
perfectly locally, every time.
I initially suspected an unpinned tornado transitive dependency resolving to a newer
6.5.x release during the forced rebuild (streamlit==1.56.0’s own metadata excludes
tornado==6.5.0 explicitly, suggesting Streamlit is aware of a WS/cookie regression in
that release line). I pinned tornado==6.4.2 and redeployed — confirmed installed in the
build log — but the symptom persists identically. So this doesn’t look like a pip-level
dependency issue on my end.
Symptom 2 — external WebSocket client gets HTTP 502 on the exact same endpoint
I have a GitHub Actions workflow that keeps the app warm by opening a raw WebSocket
connection every ~hour to wss://archirapid.streamlit.app/~/+/_stcore/stream (no
cookies, no login — just a bare websockets.connect() from Python, anonymous). This
ran green for months.
Since ~2026-09-08 02:55 CEST it fails almost every run with:
Keepalive FAILED: server rejected WebSocket connection: HTTP 502
with occasional green runs interspersed (suggesting partial/intermittent recovery, not
a full fix yet). This is a completely independent client (no browser, no cookies, no
app code of mine involved) hitting the same WS upgrade endpoint and getting rejected at
the edge/proxy level — which lines up with real users’ sessions also breaking at
what looks like the same layer (cookie delivery during the WS upgrade handshake).
Timeline
- Aug 22 – Sep 8 01:18 CEST: keepalive green consistently.
- Sep 8 ~02:55 CEST onward: keepalive fails with HTTP 502 almost every run, a few
scattered greens since (partial stabilization?). - Sep 8-9: apt-get bullseye-security incident (separate, now resolved per forum thread
122420). - Sep 9 ~12:00 UTC onward: real users’ sessions confirmed not surviving reload in
production, while the identical code works locally.
Question
Is the WebSocket upgrade path (/_stcore/stream, reached via the app’s /~/+/ proxy
route on *.streamlit.app subdomains) still degraded platform-side following the
bullseye-security rebuild? Specifically: is the Cookie header being forwarded
correctly by the edge/proxy during the WS upgrade handshake?
Happy to share more diagnostic data (exact timestamps, hash comparisons, keepalive
workflow file) if useful.