Причина (воспроизведена): вкладка держит SSE-соединение /api/events. При любой правке .py (pull, switch, merge) uvicorn --reload останавливает старый процесс, а тот в graceful shutdown ждёт закрытия всех соединений. --timeout-graceful-shutdown по умолчанию не задан, поэтому ожидание длится вечно. Слушающий сокет остаётся у reloader'а: соединения принимаются, но не обслуживаются, и /api/users/me висит, а на экране вечный спиннер. В логе только Reloading.... Сервер оживает ровно в момент, когда закрывается SSE.
run.ps1 и run.sh: запускать uvicorn с --timeout-graceful-shutdown 2 (с комментарием, зачем).
backend/entrypoint.sh (test/prod): --timeout-graceful-shutdown 10. Тот же механизм сейчас держит остановку контейнера до SIGKILL по stop_grace_period: 30s.
README.md и CLAUDE.md: флаг в ручных командах запуска плюс пометка у описания SSE.
Код приложения не меняется: EventSource на клиенте переподключается сам.
Критерии готовности
При открытом /api/events правка .py перезапускает бэкенд, и /api/health отвечает 200 за несколько секунд.
run.ps1 остаётся ASCII и парсится PowerShell 5.1; run.sh и entrypoint.sh проходят bash -n.
pytest зелёный.
Ветка:issue-47-endless-loading от dev
## План выполнения
**Причина (воспроизведена):** вкладка держит SSE-соединение `/api/events`. При любой правке `.py` (pull, switch, merge) `uvicorn --reload` останавливает старый процесс, а тот в graceful shutdown ждёт закрытия всех соединений. `--timeout-graceful-shutdown` по умолчанию не задан, поэтому ожидание длится вечно. Слушающий сокет остаётся у reloader'а: соединения принимаются, но не обслуживаются, и `/api/users/me` висит, а на экране вечный спиннер. В логе только `Reloading...`. Сервер оживает ровно в момент, когда закрывается SSE.
1. `run.ps1` и `run.sh`: запускать uvicorn с `--timeout-graceful-shutdown 2` (с комментарием, зачем).
2. `backend/entrypoint.sh` (test/prod): `--timeout-graceful-shutdown 10`. Тот же механизм сейчас держит остановку контейнера до SIGKILL по `stop_grace_period: 30s`.
3. `README.md` и `CLAUDE.md`: флаг в ручных командах запуска плюс пометка у описания SSE.
4. Код приложения не меняется: EventSource на клиенте переподключается сам.
**Критерии готовности**
- При открытом `/api/events` правка `.py` перезапускает бэкенд, и `/api/health` отвечает 200 за несколько секунд.
- `run.ps1` остаётся ASCII и парсится PowerShell 5.1; `run.sh` и `entrypoint.sh` проходят `bash -n`.
- `pytest` зелёный.
**Ветка:** `issue-47-endless-loading` от `dev`
Итог: вечная загрузка возникала, когда uvicorn --reload перезапускался при открытой вкладке: старый процесс бесконечно ждал закрытия SSE-потока /api/events. Теперь uvicorn запускается с --timeout-graceful-shutdown (2 с в dev, 10 с в контейнере), и перезапуск завершается сам. Проверки: воспроизведение до/после (после правки .py при открытом SSE бэкенд отвечает 200 через ~4 с вместо бесконечного ожидания); run.ps1 — ASCII и парсится PS 5.1; bash -n для run.sh и entrypoint.sh; pytest — 95 passed. entrypoint.sh в Docker вживую не проверялся. Смежная находка:#49 — через vite-прокси обрыв SSE не доходит до клиента, и после перезапуска бэкенда вкладка молча перестаёт получать события. Статус:Status/In Review Осталось за вами: ревью и мёрж PR — задача закроется автоматически.
Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/48
**Итог:** вечная загрузка возникала, когда `uvicorn --reload` перезапускался при открытой вкладке: старый процесс бесконечно ждал закрытия SSE-потока `/api/events`. Теперь uvicorn запускается с `--timeout-graceful-shutdown` (2 с в dev, 10 с в контейнере), и перезапуск завершается сам.
**Проверки:** воспроизведение до/после (после правки `.py` при открытом SSE бэкенд отвечает 200 через ~4 с вместо бесконечного ожидания); `run.ps1` — ASCII и парсится PS 5.1; `bash -n` для `run.sh` и `entrypoint.sh`; `pytest` — 95 passed. `entrypoint.sh` в Docker вживую не проверялся.
**Смежная находка:** #49 — через vite-прокси обрыв SSE не доходит до клиента, и после перезапуска бэкенда вкладка молча перестаёт получать события.
**Статус:** `Status/In Review`
**Осталось за вами:** ревью и мёрж PR — задача закроется автоматически.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
После запуска полного дева сайт уходит в вечную загрузку, в логах ничего необычного.
План выполнения
Причина (воспроизведена): вкладка держит SSE-соединение
/api/events. При любой правке.py(pull, switch, merge)uvicorn --reloadостанавливает старый процесс, а тот в graceful shutdown ждёт закрытия всех соединений.--timeout-graceful-shutdownпо умолчанию не задан, поэтому ожидание длится вечно. Слушающий сокет остаётся у reloader'а: соединения принимаются, но не обслуживаются, и/api/users/meвисит, а на экране вечный спиннер. В логе толькоReloading.... Сервер оживает ровно в момент, когда закрывается SSE.run.ps1иrun.sh: запускать uvicorn с--timeout-graceful-shutdown 2(с комментарием, зачем).backend/entrypoint.sh(test/prod):--timeout-graceful-shutdown 10. Тот же механизм сейчас держит остановку контейнера до SIGKILL поstop_grace_period: 30s.README.mdиCLAUDE.md: флаг в ручных командах запуска плюс пометка у описания SSE.Критерии готовности
/api/eventsправка.pyперезапускает бэкенд, и/api/healthотвечает 200 за несколько секунд.run.ps1остаётся ASCII и парсится PowerShell 5.1;run.shиentrypoint.shпроходятbash -n.pytestзелёный.Ветка:
issue-47-endless-loadingотdevРабота выполнена, открыт PR: #48
Итог: вечная загрузка возникала, когда
uvicorn --reloadперезапускался при открытой вкладке: старый процесс бесконечно ждал закрытия SSE-потока/api/events. Теперь uvicorn запускается с--timeout-graceful-shutdown(2 с в dev, 10 с в контейнере), и перезапуск завершается сам.Проверки: воспроизведение до/после (после правки
.pyпри открытом SSE бэкенд отвечает 200 через ~4 с вместо бесконечного ожидания);run.ps1— ASCII и парсится PS 5.1;bash -nдляrun.shиentrypoint.sh;pytest— 95 passed.entrypoint.shв Docker вживую не проверялся.Смежная находка: #49 — через vite-прокси обрыв SSE не доходит до клиента, и после перезапуска бэкенда вкладка молча перестаёт получать события.
Статус:
Status/In ReviewОсталось за вами: ревью и мёрж PR — задача закроется автоматически.