Redis のパスワードが展開されていなかった
Redis を使う処理が、すべて AuthenticationError で 500 になっていました。パスキーの challenge 保存(backend/app/routers/passkey.py:165)と、Celery への解析投入です。
Fly の [processes] のコマンドはシェルを通らずに実行されるため、${REDIS_PASSWORD} が展開されません。この文字列そのものが Redis のパスワードになっていました。API と worker の REDIS_URL には本物のパスワードが入っているので、認証が合いませんでした。
- 実測: 文字列
${REDIS_PASSWORD}でredis-cli -aするとPONG、secret の値ではWRONGPASS
@@ -10,11 +10,14 @@ # 起動コマンド+# Fly は process コマンドをシェルを通さず実行し ${VAR} を展開しない。+# 直書きすると "${REDIS_PASSWORD}" という文字列がパスワードになる (2026-10-16 本番で発生)。+# 必ず sh -c で包んで環境変数を展開させる。 [processes]- app = "redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes --dir /data"+ app = "sh -c 'exec redis-server --requirepass \"$REDIS_PASSWORD\" --appendonly yes --dir /data'"
- Redis を再デプロイした後、API から
ping→True - 文字列
${REDIS_PASSWORD}での認証 → 失敗 - パスキーのログイン開始(options)→ 200