lauadminandClaude Opus 5.5 a7cba7616a Poll ETTN statuses in batches and commit per receipt
The cron poll committed only at the end; with ~100 created receipts and a 1s
pause between Checkbox requests it hit arq's 300s timeout every run, so all
status updates were rolled back and fiscalized receipts stayed "created".
Now each run polls at most 30 least-recently-checked receipts and commits
after each one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:25:12 +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%