Прокси-сервер для FunTimeEventsSDK. Прозрачный reverse proxy: форвардит запросы и ключ клиента как есть, скрывая реальный IP клиентов от бэкенда. Каждый клиент использует свой apiKey, бэкенд валидирует его напрямую.
Client Mod (SDK, со своим apiKey)
│
├── HTTP (X-API-Key клиента) ──→ Прокси ──→ api.funtimeevents.su
│
└── WSS (auth с api_key клиента) ──→ Прокси ──→ wss://api.funtimeevents.su/v1/relay
Прокси ничего не хранит, не кеширует, не модифицирует тело запросов и не подменяет аутентификацию — ключ клиента форвардится как есть, поэтому бэкенд сам решает, пускать клиента или нет (невалидный ключ → 401 / 4001).
Прокси заменяет только origin (схема + хост + порт) в URL запроса. Путь SDK сохраняется как есть:
SDK: POST https://proxy.example.com/v1/players
Прокси: POST https://api.funtimeevents.su/v1/players (origin заменён, путь /v1/players сохранён)
Это работает для любых путей — с префиксом /v1/ или без него. Поддерживаются query-параметры, фрагменты и любые HTTP-методы.
git clone https://github.com/Rizzener/FunTimeEventsAPIProxy.git
cd FunTimeEventsAPIProxy
pip install -e .Создать .env из шаблона:
cp .env.example .envfte-proxy runИли одной строкой (без .env):
FTE_PROXY_PORT=9090 fte-proxy runВсе настройки задаются через переменные окружения с префиксом FTE_PROXY_ или через .env файл.
| Переменная | По умолчанию | Описание |
|---|---|---|
FTE_PROXY_HOST |
0.0.0.0 |
Адрес для прослушивания |
FTE_PROXY_PORT |
8080 |
Порт |
FTE_PROXY_USER_AGENT |
fte-api-proxy/1.0 |
User-Agent при запросах к бэкенду |
FTE_PROXY_LOG_LEVEL |
INFO |
Уровень логов |
FTE_PROXY_HTTP_TIMEOUT |
15 |
Таймаут HTTP-запросов (сек) |
FTE_PROXY_WS_CONNECT_TIMEOUT |
30 |
Таймаут подключения WebSocket (сек) |
FTE_PROXY_WS_HEARTBEAT_INTERVAL |
30 |
Интервал heartbeat WebSocket (сек) |
FTE_PROXY_WS_READ_TIMEOUT |
60 |
Таймаут чтения WebSocket (сек) |
FTE_PROXY_TLS_CERT |
— | Путь к сертификату TLS |
FTE_PROXY_TLS_KEY |
— | Путь к ключу TLS |
Пример:
FTE_PROXY_PORT=9090 \
FTE_PROXY_LOG_LEVEL=DEBUG \
fte-proxy runЕсли прокси запускается с HTTPS/WSS:
FTE_PROXY_TLS_CERT=/etc/letsencrypt/live/proxy.example.com/fullchain.pem \
FTE_PROXY_TLS_KEY=/etc/letsencrypt/live/proxy.example.com/privkey.pem \
fte-proxy runБез сертификатов — прокси работает по HTTP/WS.
В чит-клиенте достаточно указать baseUrl на прокси. apiKey обязателен — каждый клиент использует свой ключ (бэкенд валидирует его напрямую, при компрометации ключ отзывается и выдаётся новый):
FunTimeEventsAPI.builder()
.userAgent("ClientMod/1.0")
.apiKey("sk-fte-...")
.baseUrl("http://proxy-ip:8080/v1/")
.build();Пример с кастомным портом и HTTPS:
FunTimeEventsAPI.builder()
.userAgent("ClientMod/1.0")
.apiKey("sk-fte-...")
.baseUrl("https://proxy.example.com/v1/")
.build();Путь SDK (/v1/...) прокси сохраняет — бэкенд видит https://api.funtimeevents.su/v1/.... Невалидный ключ не проходит: бэкенд отвечает 401 (HTTP) или закрывает relay 4001 (WebSocket) — прокси просто пробрасывает ответ.
Логи выглядят так:
2026-07-29 15:51 | INFO | HTTP | POST /v1/bans -> 200
2026-07-29 15:51 | INFO | WS | connected -> wss://api.funtimeevents.su/v1/relay
2026-07-29 15:51 | INFO | WS | auth ok
2026-07-29 15:51 | INFO | WS | -> relay coordinates
2026-07-29 15:52 | WARN | HTTP | GET /v1/events -> 502
MIT