jze9 d6a7ac0a68 Replace box picker with free-text location in audit scan
"Where found" during inventory audit is now a plain text field
(e.g. "каб. 305") stored on the object instead of assigning it to a
box, since audit walks often use room/office labels that don't map
to the box/shelf hierarchy used elsewhere. Box assignment via the
regular object form is unaffected.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-22 15:41:30 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00
2026-07-21 16:11:09 +05:00

Инвентаризация

Сервис учёта инвентаря: объекты (инвентарный номер, описание, фото) складываются в ящики (с вложенностью), у каждого объекта и ящика есть QR-код — сканирование обычной камерой телефона открывает публичную страницу с описанием и фото, без установки приложений. Правки защищены простым admin-логином, просмотр — публичный.

Стек: FastAPI + SQLAlchemy (async) + PostgreSQL, MinIO (S3) для фото, React + Vite + Tailwind на фронте, всё поднимается через Docker Compose.

Быстрый старт (локально)

  1. Скопируйте .env.example в .env и при желании поменяйте пароли/секреты:
    cp .env.example .env
    
  2. Поднимите весь стек:
    docker compose up -d --build
    
    Первый запуск: поднимутся Postgres и MinIO, применятся миграции (сервис migrate), создастся бакет MinIO с публичным доступом на чтение (сервис minio-init), затем стартуют backend и frontend.
  3. Создайте первого администратора:
    docker compose exec backend uv run python -m app.cli --username admin
    
    (спросит пароль интерактивно; логин без прав — без него нельзя добавлять/редактировать объекты и ящики).
  4. Откройте:

Публичные страницы объекта/ящика (/objects/:id, /boxes/:id) открываются без авторизации — именно на них ведут QR-коды.

Разработка

Исходники backend/ и frontend/ смонтированы в контейнеры (см. docker-compose.override.yml), оба сервиса перезапускаются на лету (uvicorn --reload, vite). Изменения в коде подхватываются без пересборки образа; пересборка (--build) нужна только при изменении зависимостей (pyproject.toml/package.json) или Dockerfile.

Новая миграция после изменения моделей:

docker compose exec backend uv run alembic revision --autogenerate -m "..."
docker compose exec backend uv run alembic upgrade head

Тесты бэкенда:

docker compose exec backend uv run pytest

Прод-деплой

Пока не настроен (нет docker-compose.prod.yml, реверс-прокси и TLS) — это следующий шаг, когда сервис будет готов выкатывать на сервер с доменом. Тогда потребуется поменять в .env PUBLIC_BASE_URL и MINIO_PUBLIC_URL на реальный домен (они зашиты в QR-коды и ссылки на фото) и добавить реверс-прокси (например, Caddy) для HTTPS.

Description
No description provided
Readme 161 KiB
Languages
TypeScript 54.6%
Python 43.6%
Dockerfile 0.7%
Mako 0.6%
HTML 0.3%
Other 0.2%