From 3a6f034bc853451a7c6d69e4f06678bcd90b2717 Mon Sep 17 00:00:00 2001 From: Umbrix Dev Date: Wed, 4 Feb 2026 05:04:15 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20API:=20=D0=9F=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D1=81=D0=B8=20=D0=B4=D0=BB=D1=8F=20Marzban=20API=20=D1=81=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=BC=20=D1=82=D0=BE=D0=BA=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/proxy/[...path]/route.ts | 90 ++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 app/api/proxy/[...path]/route.ts diff --git a/app/api/proxy/[...path]/route.ts b/app/api/proxy/[...path]/route.ts new file mode 100644 index 0000000..be5da20 --- /dev/null +++ b/app/api/proxy/[...path]/route.ts @@ -0,0 +1,90 @@ +// app/api/proxy/[...path]/route.ts +// API Proxy для обращения к Marzban серверу + +export async function GET( + request: Request, + { params }: { params: { path: string[] } } +) { + const path = params.path.join('/'); + const baseUrl = 'https://umbrix2.3to3.sbs'; + const url = `${baseUrl}/${path}`; + + console.log('[Proxy] Fetching:', url); + + try { + const response = await fetch(url, { + headers: { + 'Accept': 'application/json', + 'User-Agent': 'Umbrix-TelegramBot/1.0', + }, + // Отключаем кэш для актуальных данных + cache: 'no-store', + }); + + if (!response.ok) { + console.error('[Proxy] HTTP error:', response.status, response.statusText); + throw new Error(`HTTP error! status: ${response.status}`); + } + + const contentType = response.headers.get('content-type'); + + // Если это JSON - парсим + if (contentType?.includes('application/json')) { + const data = await response.json(); + console.log('[Proxy] Success (JSON):', Object.keys(data)); + return Response.json(data); + } + + // Если это текст/HTML - возвращаем как есть + const text = await response.text(); + console.log('[Proxy] Success (Text):', text.substring(0, 100)); + return new Response(text, { + headers: { + 'Content-Type': contentType || 'text/plain', + }, + }); + + } catch (error) { + console.error('[Proxy] Error:', error); + return Response.json( + { + error: 'Failed to fetch data from Marzban server', + details: error instanceof Error ? error.message : 'Unknown error', + url: url, + }, + { status: 500 } + ); + } +} + +// Также поддерживаем POST для будущих API calls +export async function POST( + request: Request, + { params }: { params: { path: string[] } } +) { + const path = params.path.join('/'); + const baseUrl = 'https://umbrix2.3to3.sbs'; + const url = `${baseUrl}/${path}`; + + try { + const body = await request.json(); + + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, + body: JSON.stringify(body), + }); + + const data = await response.json(); + return Response.json(data); + + } catch (error) { + return Response.json( + { error: 'Failed to post data' }, + { status: 500 } + ); + } +}