- FastAPI async gateway with httpx proxying to multiple upstreams - SQLite database with SQLAlchemy ORM - Admin console: manage services, users, API keys, endpoint access - Per-key, per-endpoint granular access control - OpenAPI document sync and caching (5-minute TTL) - Request/response logging with full transaction inspection - In-memory rate limiting (per-key, fixed-window) - Tiered log retention (7d payloads, 90d rows, incremental vacuum) - TLS verification toggle per service (for self-signed certificates) - Service connectivity validation with automatic endpoint refresh - Request browser with filters and deep-link inspection - Docker setup with persistent volume - Modal forms for create/edit flows Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
27 lines
950 B
HTML
27 lines
950 B
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Sign in · API Gateway</title>
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
</head>
|
|
<body>
|
|
<div class="login-wrap">
|
|
<div class="card login-card">
|
|
<div class="brand" style="font-size:18px;font-weight:700;margin-bottom:14px;">
|
|
API <span style="color:var(--series-1)">Gateway</span>
|
|
</div>
|
|
{% if error %}<div class="alert error">{{ error }}</div>{% endif %}
|
|
<form method="post" action="/admin/login">
|
|
<label for="username">Username</label>
|
|
<input id="username" type="text" name="username" required autofocus>
|
|
<label for="password">Password</label>
|
|
<input id="password" type="password" name="password" required>
|
|
<div style="margin-top:16px"><button type="submit" style="width:100%">Sign in</button></div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|