Обзор
Rent — инфраструктура под конкретный бизнес: Steam-аккаунты сдаются игрокам почасово или подневно, в основном через маркетплейс FunPay. Арендатор платит, получает рабочие данные аккаунта на заданный срок, а после аренды аккаунт обязан вернуться в пул — готовым, с сменённым паролем и в безопасности.
Зачем это существует
Ручная аренда не масштабируется надёжно: следить, какой аккаунт свободен, выдавать данные достаточно быстро после оплаты, хранить их безопасно, обрабатывать продления и возвраты, восстанавливаться после сбоев. Каждый ручной шаг — упущенный заказ или риск безопасности.
Моя роль
Спроектировал архитектуру системы и построил ядро продукта целиком — модель предметной области, движок выдачи, интеграции, фоновые задачи, — развернул в продакшен-инфраструктуре и эксплуатирую.
Что делает система
Заказ приходит с маркетплейса или из Telegram. Система находит здоровый аккаунт, создаёт аренду, доставляет покупателю свежие данные, следит за временем, обрабатывает продление или возврат и возвращает аккаунт в пул по завершении — с ротацией пароля до следующей выдачи.
Архитектура
Мультитенантное ядро, единый бизнес-конвейер: подтверждение оплаты, выдача, продление и возврат живут в одном race-protected движке, поэтому бизнес-правила существуют ровно в одном месте. PostgreSQL с Prisma; тенанты изолированы по дизайну, а не по договорённости.
Операции
Архитектура поддерживает автономный жизненный цикл — заказ пришёл, аренда выдана, аккаунт вернулся. В продакшене операционное восстановление всё ещё существует там, где его требует реальный бизнес-цикл: система построена чтобы ею управлять, а не делать вид, что операторы не нужны.
Что было сложно
У FunPay нет чистого API для продавцов, поэтому приём заказов живёт за адаптером, который парсит внешнее состояние, — слой, который ломается при изменении маркетплейса и требует сознательной поддержки. Второй трудный участок — денежный путь: два покупателя, кликнувших в одну секунду, никогда не должны получить один аккаунт, а возврат не должен потратить его дважды.
Текущее состояние
В продакшене как часть экосистемы Okiyumi.
Чему я научился
В операционно-тяжёлых системах краевые случаи и есть продукт: продления, возвраты и восстановление заслуживают той же инженерной строгости, что и счастливый путь.
Что я построил
- Приём заказов с маркетплейса: слой синхронизации превращает заказы FunPay в заказы системы
- Движок аллокации: race-protected назначение аккаунтов арендам
- Выдача учётных данных через Telegram с HMAC-проверкой бота
- Слой шифрования хранимых учётных данных
- Конечный автомат аренды: выдача, продление, завершение, возврат
- Продления и возвраты с защитой от гонок в денежном пути
- Мультитенантная изоляция: данные и конфигурация тенантов разделены
- Фоновые воркеры: свипы, напоминания, восстановление
- Набор автоматических тестов (105 проверок на этапе фундамента)
Факты
- Мультитенантное ядро с изоляцией тенантов
- Движок выдачи аренды с продлением и возвратами, защита от race condition
- Слой шифрования учётных данных аккаунтов
- Доставка через Telegram с HMAC-проверкой бота
- 105 автоматических тестов на этапе фундамента
- Контейнерный продакшен-деплой