vaka.pro commited on
Commit
5f84cf1
·
1 Parent(s): 40899b1

refactor: adds complete integration system with secure proxy architecture:

Browse files

- minimal FastAPI proxy with single endpoint protection
- dynamic endpoint creation based on env variables
- proper error handling and timeout management
- health check endpoint for monitoring
- README

Files changed (3) hide show
  1. README.md +110 -1
  2. app.py +46 -0
  3. requirements.txt +3 -0
README.md CHANGED
@@ -9,4 +9,113 @@ app_file: app.py
9
  pinned: false
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  pinned: false
10
  ---
11
 
12
+ Yandex Forms Proxy Service
13
+ 🔒 Сервисное приложение для разработчиков и администраторов
14
+
15
+ ⚠️ ВНИМАНИЕ
16
+ Это сервисное приложение, предназначенное исключительно для системной интеграции.
17
+ Обычным пользователям оно бесполезно и не предоставляет пользовательского интерфейса.
18
+
19
+ 📋 Назначение
20
+ Этот прокси-сервер выполняет одну задачу:
21
+
22
+ Принимает входящие вебхуки от Яндекс Форм
23
+
24
+ Перенаправляет их в приватное пространство Hugging Face
25
+
26
+ Возвращает ответ от приватного пространства обратно в Яндекс
27
+
28
+ 🔧 Принцип работы
29
+ text
30
+ Яндекс Формы → [Публичный прокси] → [Приватное пространство] → Google Sheets
31
+ ↑ ↓
32
+ ←──────────────────────────────────────────←
33
+ Яндекс Формы отправляют данные на публичный URL прокси
34
+
35
+ Прокси проверяет секретный путь и перенаправляет запрос
36
+
37
+ Приватное пространство обрабатывает данные и сохраняет в Google Sheets
38
+
39
+ Ответ возвращается через цепочку обратно в Яндекс
40
+
41
+ ⚙️ Конфигурация
42
+ Переменные окружения:
43
+ env
44
+ PRIVATE_SPACE_URL=https://ваш-приватный-space.hf.space/yandex-form-webhook
45
+ PUBLIC_ENDPOINT=секретный-уникальный-путь
46
+ Настройка Яндекс Форм:
47
+ text
48
+ URL вебхука: https://ваш-публичный-space.hf.space/секретный-уникальный-путь
49
+ Метод: POST
50
+ Content-Type: application/json
51
+ 📊 Доступные эндпоинты
52
+ Метод Путь Назначение
53
+ POST /{PUBLIC_ENDPOINT} Прием вебхуков от Яндекс Форм
54
+ GET /health Проверка работоспособности сервиса
55
+ GET / Базовая информация о сервисе
56
+ * /* Любые другие пути → 404 Not Found
57
+ 🔐 Безопасность
58
+ Секретный путь - вебхук доступен только по пути из PUBLIC_ENDPOINT
59
+
60
+ Все остальные пути возвращают 404
61
+
62
+ Безопасное логирование - не логируются тела запросов и конфиденциальные данные
63
+
64
+ Проверка конфигурации - приложение не работает без корректной настройки
65
+
66
+ 🚀 Развертывание
67
+ Создайте Space на Hugging Face
68
+
69
+ Добавьте переменные окружения в Settings
70
+
71
+ Загрузите этот код
72
+
73
+ Настройте Яндекс Формы на отправку вебхуков
74
+
75
+ 🐛 Отладка
76
+ Проверка конфигурации:
77
+
78
+ bash
79
+ curl https://ваш-space.hf.space/health
80
+ Тестовый запрос:
81
+
82
+ bash
83
+ curl -X POST https://ваш-space.hf.space/секретный-путь \
84
+ -H "Content-Type: application/json" \
85
+ -d '{"test": "data"}'
86
+ 📝 Логирование
87
+ Сервис ведет минимальное логирование для безопасности:
88
+
89
+ ✅ Статус коды ответов
90
+
91
+ ✅ IP-адреса клиентов
92
+
93
+ ✅ Размеры запросов и ответов
94
+
95
+ ❌ НЕ логируются: тела запросов, секретные пути, URL
96
+
97
+ ⚠️ Ограничения
98
+ Максимальный размер запроса: 10MB
99
+
100
+ Таймаут подключения: 30 секунд
101
+
102
+ Только POST запросы на вебхук
103
+
104
+ Нет пользовательского интерфейса
105
+
106
+ 🛠️ Технические детали
107
+ Фреймворк: FastAPI
108
+
109
+ Python: 3.10+
110
+
111
+ Зависимости: FastAPI, Uvicorn, Requests
112
+
113
+ Архитектура: Микросервис, прокси-слой
114
+
115
+ 📞 Поддержка
116
+ Этот сервис является частью инфраструктурного решения.
117
+ Для вопросов и проблем обращайтесь к администратору системы.
118
+
119
+ Статус: ✅ Активно поддерживается
120
+ Версия: 1.0.0
121
+ Назначение: Инфраструктурный сервис для интеграции Яндекс Форм
app.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import requests
3
+ from fastapi import FastAPI, Request, HTTPException
4
+ from fastapi.responses import JSONResponse
5
+
6
+ app = FastAPI()
7
+
8
+ PRIVATE_SPACE_URL = os.getenv("PRIVATE_SPACE_URL")
9
+ PUBLIC_ENDPOINT = os.getenv("PUBLIC_ENDPOINT")
10
+
11
+ if PUBLIC_ENDPOINT:
12
+ @app.post(f"/{PUBLIC_ENDPOINT}")
13
+ async def proxy(request: Request):
14
+ if not PRIVATE_SPACE_URL:
15
+ raise HTTPException(500, "Service misconfigured")
16
+
17
+ # ПРОСТО используем PRIVATE_SPACE_URL как есть
18
+ target = PRIVATE_SPACE_URL
19
+
20
+ try:
21
+ response = requests.post(
22
+ target, # Уже полный URL
23
+ data=await request.body(),
24
+ headers={"Content-Type": request.headers.get("content-type")},
25
+ timeout=30
26
+ )
27
+ return JSONResponse(
28
+ content=response.json() if response.content else {},
29
+ status_code=response.status_code
30
+ )
31
+ except requests.exceptions.Timeout:
32
+ raise HTTPException(504, "Timeout")
33
+ except requests.exceptions.ConnectionError:
34
+ raise HTTPException(502, "Connection error")
35
+ except Exception:
36
+ raise HTTPException(500, "Internal error")
37
+
38
+ @app.get("/health")
39
+ def health():
40
+ return {
41
+ "status": "ok" if PRIVATE_SPACE_URL and PUBLIC_ENDPOINT else "error"
42
+ }
43
+
44
+ @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
45
+ def catch_all(path: str):
46
+ raise HTTPException(404, "Not found")
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ fastapi==0.104.1
2
+ uvicorn[standard]==0.24.0
3
+ requests==2.31.0