После запуска dev сайт уходил в вечную загрузку без единой ошибки в логе. Открытая вкладка держит SSE-поток /api/events, и сервер его сам не закрывает. При любой правке .py (pull, переключение ветки, мёрж) uvicorn --reload останавливает старый процесс, а тот в graceful shutdown ждёт закрытия всех соединений. Лимита по умолчанию нет, поэтому ожидание длится вечно: новый процесс не стартует, слушающий сокет остаётся у reloader'а, соединения принимаются в backlog и никем не обслуживаются. Запрос /api/users/me висит, RequireAuth крутит спиннер, в логе только "Reloading...". Воспроизведено тем же способом, каким запускает run.ps1 (uvicorn в отдельном окне): при открытом SSE и тронутом .py /api/health не отвечал, хотя TCP-соединение устанавливалось за 12 мс. Сервер ожил ровно в момент закрытия SSE. Теперь uvicorn запускается с --timeout-graceful-shutdown: по истечении лимита он отменяет висящие задачи запросов и доводит перезапуск до конца. В dev лимит 2 с, и тот же сценарий отвечает 200 примерно через 4 с после правки файла. В entrypoint лимит 10 с: в контейнере тот же механизм держал остановку до SIGKILL по stop_grace_period (30 с), и lifespan-shutdown не выполнялся. Команды ручного запуска в README дополнены тем же флагом. #47 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfTsytzT6TojfmprRDKiV6
17 lines
881 B
Bash
17 lines
881 B
Bash
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
echo "[entrypoint] Применение миграций…"
|
||
alembic upgrade head
|
||
|
||
echo "[entrypoint] Бутстрап справочников и администратора…"
|
||
python -m app.bootstrap
|
||
|
||
echo "[entrypoint] Запуск сервера…"
|
||
# --proxy-headers + доверие к X-Forwarded-* от реверс-прокси (Caddy на VPS):
|
||
# чтобы приложение знало, что снаружи запрос пришёл по HTTPS.
|
||
# --timeout-graceful-shutdown: SSE-потоки /api/events сами не закрываются, и без лимита
|
||
# остановка ждала бы их до SIGKILL по stop_grace_period (30 с) — без lifespan-shutdown.
|
||
exec uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 1 \
|
||
--proxy-headers --forwarded-allow-ips="*" --timeout-graceful-shutdown 10
|