Крупное обновление: состояние переехало в SQLite, появились очередь повторов ФНС, частичные возвраты, зашифрованные резервные копии и Telegram-бот управления.
Основано на большой доработке от @zavul0nn (#34), приведённой к правилам проекта.
⚠️ Важно при обновлении с 2.x
- Нужен каталог
data/рядом сdocker-compose.yml— в нём теперь живёт база состояния:cd /opt/yookassa-to-mynalog && sudo mkdir -p data
- Обновите
docker-compose.yml— добавились монтированиеdata/, healthcheck и ротация логов:sudo wget -O docker-compose.yml https://raw.githubusercontent.com/grandvan709/yookassa-to-mynalog/refs/heads/master/docker-compose.yml
- Возвраты теперь выключены по умолчанию. Если вы ими пользуетесь, добавьте в
.env:REFUNDS_ENABLED='true'
- Существующий
logs/sync_state.jsonимпортируется в базу автоматически при первом запуске и остаётся на диске как резервная копия. Откат на 2.7.2 возможен.
Обновление стандартное: sudo docker compose pull && sudo docker compose up -d
🗄 Состояние в SQLite
Вместо logs/sync_state.json используется data/sync_state.db: режим WAL, реестр миграций схемы, автоматическая копия базы перед каждой миграцией и блокировка, не дающая двум процессам писать состояние одновременно.
Добавлена очистка истории обработанных операций: STATE_RETENTION_DAYS (по умолчанию 1095 дней), удаляются только записи, безопасно оставшиеся позади checkpoint'а синхронизации.
🧾 Надёжность регистрации чеков
- Все денежные величины считаются через
Decimalвместоfloat— копейки больше не теряются на округлении - Ошибки ФНС разделены на «запись точно не прошла» и «результат неизвестен». Лишняя сверка через
find_incomeбольше не выполняется там, где чек заведомо не мог быть создан - Платёж проходит по фазам (
ready→creating→ готово), при неизвестном результате уходит вunknownи ждёт сверки, а не переотправки - Отдельная очередь повторов по своему расписанию
FNS_RETRY_SCHEDULE(по умолчанию каждые 5 минут) — она не опрашивает ЮKassa, только дорабатывает сохранённые операции - Перед входом по ИНН и паролю проверяется доступность ЛК физлица: во время техработ ФНС отвечает
404 «Не найдено», что раньше принималось за неверный пароль. Старые записи, отклонённые по этой причине, при обновлении автоматически возвращаются в очередь - Поиск чеков листает страницы, а не ограничивается первыми 50 записями
↩️ Частичные возвраты
Раньше поддерживались только полные. Теперь при частичном возврате исходный чек аннулируется, а на остаток выпускается новый. Обработка пофазная, с запретом автоматической перезаписи при неизвестном результате и блокировкой второго возврата по тому же платежу до разбора предыдущего.
Возвраты по умолчанию отключены: REFUNDS_ENABLED='false'.
⏳ Наблюдение за неоплаченными платежами
Платежи, ещё не перешедшие в succeeded, берутся под наблюдение на PENDING_PAYMENT_WATCH_MINUTES (по умолчанию 60) и перепроверяются по ID. Оплаченные за это время обрабатываются как обычные, остальные отправляются в архив просроченных.
💾 Зашифрованные резервные копии
Копия базы и логов шифруется (scrypt + AES-256-GCM) и отправляется в Telegram или на почту по расписанию BACKUP_SCHEDULE. Требуется BACKUP_PASSWORD от 12 символов — храните его отдельно от самих копий, без него восстановление невозможно.
Восстановление: python backup.py restore <файл> --output <пустой каталог> — активная база при этом не изменяется.
🤖 Telegram-бот управления
Включается TELEGRAM_ADMIN_BOT_ENABLED='true'. Показывает состояние сервиса, очередь ФНС с ручным повтором по подтверждению, последние строки журналов с маскированием токенов, список и создание резервных копий, переключение уведомлений и выбор чата или темы для отчётов об успешных чеках.
Команды и кнопки принимает только пользователь из TELEGRAM_ADMIN_USER_ID.
📬 Доставка чеков покупателям
Опционально: после регистрации дохода печатная форма чека отправляется покупателю в Telegram через бота, в котором он оплачивал. Telegram ID ищется в описании платежа по настраиваемому шаблону TELEGRAM_CUSTOMER_ID_PATTERN.
🐳 Docker
- Приложение работает от непривилегированного пользователя внутри контейнера
- Добавлен healthcheck: cron, свежесть синхронизации, целостность базы, состояние бэкапов и бота
- Ротация логов Docker (3 файла по 10 МБ),
init: true - Раздельные каталоги
data/иlogs/ - Установка и обновление по-прежнему только через готовый образ с Docker Hub, локальная сборка не требуется
🧪 Тесты
Добавлено 110 автотестов и скрипты симуляции сбоев ФНС и проверки ЮKassa в режиме только чтения.
Полный список изменений: 2.7.2...3.4.0