Задача#
Администратор вносит платежи, бот за три дня до срока пишет в чат, а команда отмечает оплату. В любой момент видно три вещи: что и когда оплатить, что уже оплачено и что просрочено.
Основу собрал примерно за 10 часов из 30, которые были на хакатоне. Остальное время ушло на тесты, защиту входа, импорт из CSV и webhook.
Что делает бот#
- за три дня до срока присылает название, сумму, валюту и дату оплаты, по одному разу на период;
- в каждом напоминании есть кнопка «Оплачено»: нажатие отмечает период оплаченным, сообщение обновляется, повторное нажатие безвредно;
- нажимать могут только участники чата, это проверяется на стороне сервера;
- если срок прошёл, а оплату не отметили, на следующий день приходит одно повторное напоминание «Платёж просрочен».
Работает в Telegram и в MAX, каналы независимы: можно включить один или оба.
Как устроено#
FastAPI и SQLAlchemy, база SQLite в Docker volume, планировщик внутри того же процесса. Всё поднимается одной командой через Docker Compose, данные переживают перезапуск.
Пара решений, которыми доволен:
- просрочка не хранится, а вычисляется: платёж не оплачен, и срок уже прошёл;
- даты периодов считаются от первой даты, а не цепочкой: платёж с 31 числа не «уезжает» на 28 после февраля;
- администратор задаётся только в настройках окружения, через API его нельзя создать, изменить или удалить;
- все ручки под
/api/v1, документация Swagger лежит на/api/v1/docs.
Что ещё внутри#
Кроме обязательной части сделал бонусы, потому что на них ушёл остаток времени:
- напоминания по email и webhook с подписью HMAC-SHA256, чтобы получатель мог проверить отправителя;
- двухфакторный вход администратора (TOTP) и API-токены «только чтение» или «чтение и запись»;
- журнал входов, оплат и изменений, пароли туда не попадают;
- интерфейс на русском и английском, светлая и тёмная темы.
Защита и удобства#
После 5 неверных паролей подряд логин закрывается на 15 минут. Пароли хранятся хэшем argon2, в базе лежит только хэш токена сессии, а смена пароля закрывает остальные сессии.
Из удобств: импорт платежей из CSV с проверкой без записи (панель показывает каждую строку с ошибками), пауза платежа, категории, ответственный за платёж, календарь оплат и бюджет по валютам.
Пока честно: приложение рассчитано на один процесс, замок напоминаний живёт внутри него. Несколько воркеров запускать нельзя.





