THE CHALLENGE
What had to remain reliable.
FunPay, Steam, Dota GC, proxies, and Telegram can become slow or unavailable independently. An order must never be issued twice, a stale checker must not be treated as proof that a match ended, password rotation must stay on the assigned proxy, and partial failure must not leave a listing hidden.
THE SOLUTION
How the system was designed.
Orders and reviews are idempotent, durable state lives in SQLite, Steam checkers are isolated processes with database heartbeats, stale match data triggers a fresh check, and rental completion has both primary and recovery paths. Proxy credentials are normalized and masked throughout the system.
ARCHITECTURE
The main system boundaries and data flow.
[ FunPay orders + reviews ]
| idempotent event processing
v
[ Rental application services ] <----> [ SQLite state ]
| | |
v v v
[ listing control ] [ credential flow ] [ scheduler / recovery ]
| | |
+--------------+-------------------------+
v
[ isolated Steam checkers + proxy + heartbeat + watchdog ]
|
v
[ Dota 2 live match state ]
[ Telegram operations console ]
OUTCOMES
What the architecture enables.
01An end-to-end rental lifecycle without routine operator work
02Protection against duplicate marketplace events
03No forced credential rotation during a live match
04Operational visibility and recovery controls in Telegram
STACKPythonasyncioFunPay APISteamDota 2 GCTelegram BotSQLitePySockssystemd