Лёгкий магазин для Telegram: FastAPI + aiogram, платежи через YooKassa, админка на Jinja2.
- Продажа услуг и цифровых товаров
- Оплата через YooKassa (карта, СБП)
- Донаты (фиксированные и произвольные)
- Админка: товары, заказы, пользователи, чеки, бэкап/восстановление
- Digital-товары: три способа доставки
- file: загрузка файла и отправка покупателю
- github: доступ к репозиторию
- codes: выдача позиций из TXT (каждая строка — отдельный код)
- Telegram-бот: каталог, карточки, покупка в один клик
- Чеки ФНС (Мой Налог) через nalogo: для покупок и донатов, раздел “Чеки” в админке (статусы, переотправка)
- Подготовьте
.env:
cp .env.example .env
# отредактируйте обязательные переменные- Запуск:
docker compose up --build -d- Примените миграции (один раз):
docker compose exec api alembic upgrade head- Приложение:
- API: http://localhost:8000
- Health: http://localhost:8000/health/
- Вебхук Telegram: POST http://localhost:8000/telegram/webhook
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
alembic upgrade head
uvicorn app.main:app --host 0.0.0.0 --port 8000Минимум нужно указать:
BOT_TOKEN— токен Telegram-ботаDATABASE_URL— подключение к БД (для Docker уже задано через compose)YK_SHOP_ID,YK_SECRET_KEY,YK_RETURN_URL— доступы YooKassa
Дополнительно:
YK_WEBHOOK_USER,YK_WEBHOOK_PASSWORD— Basic защита вебхука YooKassaBASE_URL,PORT— базовый URL API и портADMIN_USERNAME,ADMIN_PASSWORD— логин/пароль админкиADMIN_CHAT_ID— куда слать уведомленияADMIN_TG_USERNAME— username для кнопки «Связаться»SHOW_CONTACT_BUTTON,SHOW_DONATE_BUTTON— флаги видимости кнопокEMAIL_DOMAIN— домен для генерации email по tg_idUPLOAD_DIR— каталог загрузок (мапится в Docker в volume)WEBHOOK_URL,WEBHOOK_SECRET— вебхук TelegramDONATE_AMOUNTS— суммы донатов, список через запятую (например: 100,200,500)
NaloGO (Мой Налог) — для отправки чеков:
NALOGO_ENABLED—true/false, включает отправку чеков (по умолчанию false)NALOGO_INN,NALOGO_PASSWORD— ИНН и пароль самозанятого (или используйте сохранённый токен)NALOGO_STORAGE_PATH— путь к файлу хранения токенов (по умолчаниюnalogo_tokens.json)NALOGO_DEVICE_ID— произвольный ID устройства (по умолчаниюtg-shop-bot)
- Создание заказа:
POST /orders/— создаёт платёж, возвращаетpayment_url. - Вебхук:
POST /payments/yookassa/webhook— наpayment.succeededпомечает заказ какpaid, создаёт покупку, выполняет доставку.- Для delivery_type =
codesсистема резервирует свободную позицию и отправляет её пользователю отдельным сообщением (жирным), затем отправляет стандартное сообщение о доставке.
- Для delivery_type =
- Библиотека: nalogo на PyPI
- При успешной оплате:
- Для покупок создаётся запись чека, отправляется чек в ФНС. В ответ сохраняется
FNS IDи статус. - Для донатов — аналогично, с позицией “Донат”.
- Для покупок создаётся запись чека, отправляется чек в ФНС. В ответ сохраняется
- Ошибки отправки не блокируют выдачу товара/сообщения пользователю — статус чека будет
ошибка, его можно переотправить из админки. - Включение: укажите переменные
NALOGO_*и поставьтеNALOGO_ENABLED=true.
app/— API (роуты, модели, схемы, сервисы, админка)bot/— обработчики aiogram + вебхук-роутalembic/— миграции БД (одна initial)uploads/— загруженные файлы/бэкапы (volume в Docker)app/models/item_code.py— хранилище позиций (кодов) для digital:codesapp/models/receipt.py— модель чеков ФНСapp/admin/templates/receipts_list.html— раздел “Чеки” в админке
- При создании/редактировании digital‑товара выберите способ доставки
codesи загрузите TXT с позициями (обязательно), по одной на строку. - В списке товаров для цифровых позиций отображается «Остаток».
- Для догрузки кодов используйте кнопку «➕TXT» рядом с товаром.
- Раздел “Чеки”: список всех чеков с фильтром по статусу (
accepted/failed/pending). - Для чека в статусе
ошибкадоступна кнопка “↻ Переотправить”. - Колонки: ID, создан, тип (покупка/донат), order, покупатель, сумма, статус, FNS ID, ошибка.
- Локально удобно запускать бота в polling-режиме:
python -m bot.run_bot - Для продакшна используйте вебхук (
WEBHOOK_URL) иdocker compose



