github grandvan709/yookassa-to-mynalog 3.4.0

2 hours ago

Крупное обновление: состояние переехало в SQLite, появились очередь повторов ФНС, частичные возвраты, зашифрованные резервные копии и Telegram-бот управления.

Основано на большой доработке от @zavul0nn (#34), приведённой к правилам проекта.

⚠️ Важно при обновлении с 2.x

  1. Нужен каталог data/ рядом с docker-compose.yml — в нём теперь живёт база состояния:
    cd /opt/yookassa-to-mynalog && sudo mkdir -p data
  2. Обновите 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
  3. Возвраты теперь выключены по умолчанию. Если вы ими пользуетесь, добавьте в .env:
    REFUNDS_ENABLED='true'
  4. Существующий 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 больше не выполняется там, где чек заведомо не мог быть создан
  • Платёж проходит по фазам (readycreating → готово), при неизвестном результате уходит в 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

Don't miss a new yookassa-to-mynalog release

NewReleases is sending notifications on new releases.