DATABASE_URL_asyncpg нигде не использовался — реально работает только
DATABASE_URL_syncpg/pg8000 через синхронный engine. validate_db_port был
не подключён как pydantic-валидатор (нет декоратора) и никогда не
вызывался — DB_PORT конвертируется строкой выше через голый int().
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
route/init_data_base.py объявлял create_tables/migrate_cascade_user/
migrate_users/migrate_tables/clear_tables как async def, но внутри
дёргал синхронный SQLAlchemy engine напрямую в event loop — блокировал
весь однопроцессный uvicorn на время миграции. Остальные ~92 роута в
проекте корректно используют обычный def (FastAPI сам уносит их в
threadpool). Привёл эти пять к тому же паттерну.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Dockerfile.api ставил зависимости из requirements.txt, версии разошлись
с pyproject.toml/uv.lock (redis, sqlalchemy и др.). Теперь сборка идёт
через `uv sync --frozen` напрямую из pyproject.toml/uv.lock, requirements.txt
удалён. Заодно нашёлся отсутствующий python-multipart (нужен FastAPI для
UploadFile/Form в organizations_crud.py) — без него API падал при старте.
Добавлен .dockerignore в корень: раньше Dockerfile.api через COPY . .
затягивал в образ .git, data/, web-react, web — теперь только нужное.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
web-react/: SPA Vite+React+TS, nginx раздаёт статику и проксирует /api на api:8000 по локалке. docker-compose: web(Flet)->web-react на :80. transfer_crud.backup_restore: чистим содержимое data/radar вместо rmtree точки монтирования (EBUSY).