lauadminandClaude Opus 5.5 8b3c2b6d63 Bind Nova Poshta API key to cash register (#3)
Each cash register stores its own encrypted NP API key. Status polling uses
register keys and binds an order to the register whose key sees the TTN as
its own (PhoneSender present); ETTN receipts are created from that register.
Migration 0008 moves the old NOVA_POSHTA_API_KEY into the default register.

Closes #3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 13:02:40 +03:00

lux_fiscal

Веб-приложение для ручного пробития фискальных чеков по заказам: заказы из собственной CRM, статусы и сумма послеоплаты из Новой Пошты, фискализация через Checkbox.

Архитектура целиком описана в плане проекта; здесь — только то, что нужно для запуска.

Текущее состояние

Этап Что входит Статус
1 Каркас: FastAPI, Postgres, Alembic, Docker, логи, health-check ✅ готово
2 Аутентификация, роли, журнал аудита ✅ готово
3 Заказы + заглушка CRM ✅ готово
4 Нова Пошта: статусы и сумма послеоплаты ✅ готово
5 Checkbox: ЕТТН-чеки по ТТН с контролем оплаты (план: .plans/checkbox-ettn-receipts.md) 🚧 код готов, ждёт проверки на боевой кассе
6 Очередь и редактор чека (фронтенд) ⏳
7 Админка ⏳
8 Реальный API CRM ⏳
9 Продакшен-обвязка ⏳

Требования

  • Docker и Docker Compose — основной способ запуска
  • Python 3.12+ — если хочется запускать бэкенд без контейнеров

Запуск

cp .env.example .env

Сгенерируйте оба ключа и впишите их в .env — со значениями-заглушками приложение не поднимется:

docker compose run --rm api python -m app.cli gen-keys

Поднимите стек (миграции накатятся автоматически отдельным контейнером migrate):

docker compose up -d --build

Создайте первого администратора из FIRST_ADMIN_* в .env:

docker compose run --rm api python -m app.cli bootstrap

API доступен на http://localhost:8000, интерактивная документация — на /docs (в продакшене отключена).

Проверка работоспособности

curl -s localhost:8000/api/v1/health/ready

Вход и запрос своего профиля:

curl -s -X POST localhost:8000/api/v1/auth/login -H 'Content-Type: application/json' -d '{"email":"admin@example.com","password":"<пароль>"}'
curl -s localhost:8000/api/v1/auth/me -H 'Authorization: Bearer <access_token>'

Разработка без Docker

Нужен доступный Postgres — схема использует JSONB и частичные уникальные индексы, поэтому SQLite не подойдёт.

cd backend && python -m venv .venv && .venv/Scripts/pip install -e ".[dev]"

Пропишите в .env POSTGRES_HOST=localhost, REDIS_HOST=localhost и запускайте:

cd backend && .venv/Scripts/alembic upgrade head
cd backend && .venv/Scripts/uvicorn app.main:app --reload

Тесты и линтер

cd backend && .venv/Scripts/python -m pytest -q
cd backend && .venv/Scripts/python -m ruff check app tests

Безопасность

  • SECRET_KEY подписывает JWT, ENCRYPTION_KEY шифрует ключи касс Checkbox в БД. Оба обязательны и оба должны быть настоящими.
  • Смена ENCRYPTION_KEY делает ранее сохранённые ключи касс нечитаемыми — их придётся ввести заново через админку. Ключ стоит забэкапить отдельно от дампа БД.
  • Postgres и Redis не публикуют порты наружу; api слушает только 127.0.0.1 — наружу его выставляет nginx с TLS.
  • После первого входа смените пароль администратора и удалите FIRST_ADMIN_PASSWORD из .env.
S
Description
No description provided
Readme
401 KiB
Languages
Python 68.6%
TypeScript 21.6%
CSS 7.9%
Shell 1%
Dockerfile 0.5%
Other 0.4%