vaka.pro commited on
Commit
a5cb03d
·
1 Parent(s): e7e9301

refactor: fixes routing conflict and update configuration

Browse files

- Mount Gradio on /ui to fix webhook routing
- Fix syntax errors in app.py
- Add gradio to requirements.txt
- Update README endpoints and remove SDK version

Files changed (3) hide show
  1. README.md +14 -7
  2. app.py +23 -21
  3. requirements.txt +1 -0
README.md CHANGED
@@ -4,14 +4,13 @@ emoji: 🦀
4
  colorFrom: red
5
  colorTo: pink
6
  sdk: gradio
7
- sdk_version: 6.0.2
8
  app_file: app.py
9
  pinned: false
10
  ---
11
 
12
  # Proxy Service
13
 
14
- 🔒 **Сервисное приложение для разработчиков и администраторов**
15
 
16
  ## ⚠️ ВНИМАНИЕ
17
 
@@ -19,16 +18,24 @@ pinned: false
19
 
20
  ## 📋 Назначение
21
 
22
- Этот прокси-сервер выполняет одну задачу: перенаправляет входящие вебхуки
23
 
24
  ## 📊 Доступные эндпоинты
25
 
26
  | Метод | Путь | Назначение |
27
  |-------|------|------------|
28
- | `GET` | `/health` | Проверка работоспособности сервиса |
29
- | `GET` | `/` | Базовая информация о сервисе |
30
- | `*` | `/*` | Любые другие пути 404 Not Found |
 
31
 
 
 
 
 
 
 
 
32
 
33
  ## 📞 Поддержка
34
 
@@ -38,5 +45,5 @@ pinned: false
38
  ---
39
 
40
  **Статус:** ✅ Активно поддерживается
41
- **Версия:** 1.0.0
42
  **Назначение:** Инфраструктурный сервис для интеграции
 
4
  colorFrom: red
5
  colorTo: pink
6
  sdk: gradio
 
7
  app_file: app.py
8
  pinned: false
9
  ---
10
 
11
  # Proxy Service
12
 
13
+ 🔒 **Сервисное приложение для проброса вебхуков Яндексорм**
14
 
15
  ## ⚠️ ВНИМАНИЕ
16
 
 
18
 
19
  ## 📋 Назначение
20
 
21
+ Этот прокси-сервер перенаправляет входящие вебхуки в приватное пространство.
22
 
23
  ## 📊 Доступные эндпоинты
24
 
25
  | Метод | Путь | Назначение |
26
  |-------|------|------------|
27
+ | `GET` | `/ui` | **Интерфейс администратора** (Проверка статуса) |
28
+ | `POST` | `/{SECRET_PATH}` | **Прием вебхуков** олько известный путь) |
29
+ | `GET` | `/health` | Проверка работоспособности (Health Check) |
30
+ | `GET` | `/api` | Техническая информация о сервисе |
31
 
32
+ > **Примечание:** Вебхуки принимаются только на путь, указанный в переменной окружения `PUBLIC_ENDPOINT`. Все остальные запросы возвращают 404.
33
+
34
+ ## 🛠 Конфигурация
35
+
36
+ Для работы требуются Secrets:
37
+ - `PRIVATE_SPACE_URL`: Полный URL целевого сервиса
38
+ - `PUBLIC_ENDPOINT`: Секретный путь для приема вебхуков
39
 
40
  ## 📞 Поддержка
41
 
 
45
  ---
46
 
47
  **Статус:** ✅ Активно поддерживается
48
+ **Версия:** 1.0.1
49
  **Назначение:** Инфраструктурный сервис для интеграции
app.py CHANGED
@@ -18,11 +18,9 @@ async def proxy_webhook(path: str, request: Request):
18
  """Обработчик вебхуков с проверкой пути."""
19
  # Проверяем секретный путь
20
  if not PUBLIC_ENDPOINT or path != PUBLIC_ENDPOINT:
21
- # Возвращаем 404 без деталей
22
  raise HTTPException(status_code=404, detail="Not found")
23
 
24
  if not PRIVATE_SPACE_URL:
25
- # Общая ошибка без деталей
26
  raise HTTPException(status_code=500, detail="Service error")
27
 
28
  try:
@@ -52,7 +50,6 @@ async def proxy_webhook(path: str, request: Request):
52
  except requests.exceptions.Timeout:
53
  raise HTTPException(status_code=504, detail="Service timeout")
54
  except Exception:
55
- # Общая ошибка без деталей
56
  raise HTTPException(status_code=500, detail="Internal error")
57
 
58
 
@@ -61,18 +58,17 @@ async def proxy_webhook(path: str, request: Request):
61
  async def health_check():
62
  """Безопасная проверка работоспособности."""
63
  is_configured = bool(PRIVATE_SPACE_URL and PUBLIC_ENDPOINT)
64
-
65
  return JSONResponse(
66
  content={
67
  "status": "healthy" if is_configured else "degraded",
68
  "service": "proxy",
69
- "timestamp": "...", # Можно добавить timestamp без деталей
70
  }
71
  )
72
 
73
 
74
  # Корневой эндпоинт
75
- @fastapi_app.get("/")
76
  async def root():
77
  return JSONResponse(content={"service": "API Gateway", "status": "operational"})
78
 
@@ -81,17 +77,15 @@ async def root():
81
  def create_gradio_interface():
82
  with gr.Blocks(title="Proxy Service") as demo:
83
  gr.Markdown("# 🔒 Защищенный прокси-сервис")
84
-
85
  gr.Markdown(
86
  """
87
- ### ⚠️ Сервисное приложение
88
-
89
- Этот сервис предназначен исключительно для системной интеграции.
90
-
91
- ---
92
-
93
- ### 📊 Системный статус
94
- """
95
  )
96
 
97
  # Безопасный статус
@@ -102,24 +96,32 @@ def create_gradio_interface():
102
  if not PUBLIC_ENDPOINT or not PRIVATE_SPACE_URL:
103
  return "🔧 Требуется настройка\n\nУстановите необходимые переменные окружения."
104
 
105
- # ✅ БЕЗОПАСНО: только общая информация
106
  return """✅ Сервис готов к работе
107
 
108
  Статус: Активен
109
  Вебхук: Настроен
110
  Целевой сервис: Доступен
111
 
112
- Для настройки интеграции обратитесь к администратору системы.
113
- """
 
 
 
 
 
 
 
114
  return demo
115
 
116
 
117
  # Создаем интерфейс
118
  demo = create_gradio_interface()
119
 
120
- # Монтируем FastAPI в Gradio
121
- app = gr.mount_gradio_app(fastapi_app, demo, path="/")
122
 
123
  # Локальный запуск
124
  if __name__ == "__main__":
125
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
 
 
18
  """Обработчик вебхуков с проверкой пути."""
19
  # Проверяем секретный путь
20
  if not PUBLIC_ENDPOINT or path != PUBLIC_ENDPOINT:
 
21
  raise HTTPException(status_code=404, detail="Not found")
22
 
23
  if not PRIVATE_SPACE_URL:
 
24
  raise HTTPException(status_code=500, detail="Service error")
25
 
26
  try:
 
50
  except requests.exceptions.Timeout:
51
  raise HTTPException(status_code=504, detail="Service timeout")
52
  except Exception:
 
53
  raise HTTPException(status_code=500, detail="Internal error")
54
 
55
 
 
58
  async def health_check():
59
  """Безопасная проверка работоспособности."""
60
  is_configured = bool(PRIVATE_SPACE_URL and PUBLIC_ENDPOINT)
 
61
  return JSONResponse(
62
  content={
63
  "status": "healthy" if is_configured else "degraded",
64
  "service": "proxy",
65
+ "timestamp": "...",
66
  }
67
  )
68
 
69
 
70
  # Корневой эндпоинт
71
+ @fastapi_app.get("/api")
72
  async def root():
73
  return JSONResponse(content={"service": "API Gateway", "status": "operational"})
74
 
 
77
  def create_gradio_interface():
78
  with gr.Blocks(title="Proxy Service") as demo:
79
  gr.Markdown("# 🔒 Защищенный прокси-сервис")
 
80
  gr.Markdown(
81
  """
82
+ ### ⚠️ Сервисное приложение
83
+ Этот сервис предназначен исключительно для системной интеграции.
84
+
85
+ ---
86
+
87
+ ### 📊 Системный статус
88
+ """
 
89
  )
90
 
91
  # Безопасный статус
 
96
  if not PUBLIC_ENDPOINT or not PRIVATE_SPACE_URL:
97
  return "🔧 Требуется настройка\n\nУстановите необходимые переменные окружения."
98
 
 
99
  return """✅ Сервис готов к работе
100
 
101
  Статус: Активен
102
  Вебхук: Настроен
103
  Целевой сервис: Доступен
104
 
105
+ Для настройки интеграции обратитесь к администратору системы."""
106
+
107
+ # Связываем кнопку со статусом
108
+ refresh_btn = gr.Button("Обновить статус")
109
+ refresh_btn.click(get_safe_status, outputs=status_box)
110
+
111
+ # Загружаем статус при загрузке
112
+ demo.load(get_safe_status, outputs=status_box)
113
+
114
  return demo
115
 
116
 
117
  # Создаем интерфейс
118
  demo = create_gradio_interface()
119
 
120
+ # КЛЮЧЕВОЕ ИЗМЕНЕНИЕ: монтируем Gradio на /ui, а не на /
121
+ app = gr.mount_gradio_app(fastapi_app, demo, path="/ui")
122
 
123
  # Локальный запуск
124
  if __name__ == "__main__":
125
+ import uvicorn
126
+
127
+ uvicorn.run(app, host="0.0.0.0", port=7860)
requirements.txt CHANGED
@@ -1,3 +1,4 @@
 
1
  fastapi==0.104.1
2
  uvicorn[standard]==0.24.0
3
  requests==2.31.0
 
1
+ gradio
2
  fastapi==0.104.1
3
  uvicorn[standard]==0.24.0
4
  requests==2.31.0