refactor(coordinator-api): make rate limits configurable via environment variables

- Add configurable rate limit settings for all endpoints (jobs, miner, admin, marketplace, exchange)
- Replace hardcoded rate limit decorators with lambda functions reading from settings
- Add rate limit configuration logging during startup
- Implement custom RateLimitExceeded exception handler with structured error responses
- Add enhanced shutdown logging for database cleanup and resource management
- Set default rate
This commit is contained in:
oib
2026-02-28 21:25:46 +01:00
parent f05195749c
commit 2ec1ceb600
6 changed files with 663 additions and 4 deletions

View File

@@ -7,6 +7,7 @@ from ..schemas import JobCreate, JobView, JobResult, JobPaymentCreate
from ..types import JobState
from ..services import JobService
from ..services.payments import PaymentService
from ..config import settings
from ..storage import SessionDep
limiter = Limiter(key_func=get_remote_address)
@@ -14,7 +15,7 @@ router = APIRouter(tags=["client"])
@router.post("/jobs", response_model=JobView, status_code=status.HTTP_201_CREATED, summary="Submit a job")
@limiter.limit("100/minute")
@limiter.limit(lambda: settings.rate_limit_jobs_submit)
async def submit_job(
req: JobCreate,
request: Request,

View File

@@ -9,6 +9,7 @@ from ..deps import require_miner_key
from ..schemas import AssignedJob, JobFailSubmit, JobResultSubmit, JobState, MinerHeartbeat, MinerRegister, PollRequest
from ..services import JobService, MinerService
from ..services.receipts import ReceiptService
from ..config import settings
from ..storage import SessionDep
from aitbc.logging import get_logger
@@ -18,7 +19,7 @@ router = APIRouter(tags=["miner"])
@router.post("/miners/register", summary="Register or update miner")
@limiter.limit("30/minute")
@limiter.limit(lambda: settings.rate_limit_miner_register)
async def register(
req: MinerRegister,
request: Request,
@@ -30,7 +31,7 @@ async def register(
return {"status": "ok", "session_token": record.session_token}
@router.post("/miners/heartbeat", summary="Send miner heartbeat")
@limiter.limit("60/minute")
@limiter.limit(lambda: settings.rate_limit_miner_heartbeat)
async def heartbeat(
req: MinerHeartbeat,
request: Request,