К содержанию
P.
03в продакшене2025 — now

Okiyumi Rent

Мультитенантная платформа автоматической аренды Steam-аккаунтов

Продуктовая инженерия · автоматизация

ORDERISSUEDACTIVEEXPIREDROTATEDREVOKETICK 5S · STATE MACHINE

Жизненный цикл аренды — от заказа на FunPay до ротации пароля — без единого ручного шага.

Контекст

Продакшен-платформа, автоматизирующая аренду Steam-аккаунтов через FunPay. Каждый заказ — это цепочка операций, которую раньше выполнял человек.

Задача

Обработка заказа вручную: заметить заказ, выбрать свободный аккаунт, выдать доступы, контролировать время, работать со Steam Guard, завершить аренду, отозвать сессии, сменить пароль, вернуть деньги при отказе.

Решение

  • 01

    Машина состояний аренды: worker с тиком каждые 5 секунд проходит все аренды и выполняет выдачу, предупреждения, истечение, продление и возвраты.

  • 02

    Надёжность в деталях: transactional outbox, идемпотентность, выделение аккаунтов через SELECT … SKIP LOCKED, шифрование секретов.

  • 03

    Собственная Steam-автоматизация: fresh-login verification, отзыв сессий, ротация паролей и работа со Steam Guard.

Архитектура

Web SPA

React 19 · Vite · TS

API

Fastify 5

PostgreSQL 16

Prisma · outbox

Worker

тик 5 секунд · state machine

FunPay adapter · Telegram-бот

заказы · операции

Steam automation

Guard · сессии · пароли

FLOW

  1. 01Заказ на FunPay
    worker tick
    → Выдача аккаунта
  2. 02Активная аренда
    → Истечение / продление
  3. 03Завершение
    → Revoke сессий · новый пароль

Цифры

449

заказов FunPay за 30 дней

5 c

тик worker'а

11

Steam-аккаунтов

≈123k ₽

выручка за snapshot

снимок аудита, не lifetime

Стек

  • React 19
  • Vite
  • TypeScript
  • Fastify 5
  • Prisma
  • PostgreSQL 16
  • Python 3.12
  • FastAPI
  • FunPayAPI
  • grammY
  • Docker
  • nginx

Итог

  • Полный цикл без оператора: заказ, выдача, контроль времени, завершение, безопасность аккаунта — платформа живёт в продакшене.
  • Мультитенантность с изоляцией данных и IDOR-тестами: платформа рассчитана не на один магазин.