3v324v23 commited on
Commit
86f3bf2
·
1 Parent(s): 3c7d3b0

Исправлены проблемы с правами доступа и запуском в HuggingFace Space

Browse files
Files changed (2) hide show
  1. Dockerfile +19 -7
  2. app.py +37 -35
Dockerfile CHANGED
@@ -30,11 +30,14 @@ ENV PATH=$PATH:/usr/local/go/bin
30
  ENV GOPATH=/go
31
  ENV PATH=$PATH:$GOPATH/bin
32
 
33
- # Установка Node.js и pnpm (для Playground)
34
- RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
35
  apt-get install -y nodejs && \
36
  npm install -g pnpm
37
 
 
 
 
38
  WORKDIR /app
39
 
40
  # Клонирование репозитория TEN Agent (основная ветка)
@@ -43,13 +46,20 @@ RUN git clone --depth 1 https://github.com/TEN-framework/TEN-Agent.git /app && \
43
  git branch -a && \
44
  git tag -l
45
 
46
- # Создание необходимых директорий
47
  RUN mkdir -p /app/server/bin && \
48
  mkdir -p /app/agents && \
49
- mkdir -p /tmp/ten_agent
 
 
 
50
 
51
  # Копирование файла .env с настройками
52
  COPY .env /app/.env
 
 
 
 
53
 
54
  # Сборка TEN Agent сервера
55
  RUN cd /app/server && \
@@ -58,13 +68,15 @@ RUN cd /app/server && \
58
  go build -o bin/api main.go && \
59
  chmod +x bin/api
60
 
61
- # Сборка Playground UI
62
  WORKDIR /app/playground
63
- RUN pnpm install && \
 
 
64
  NEXT_PUBLIC_EDIT_GRAPH_MODE=false pnpm build
65
 
66
  # Копирование приложения Python для запуска всех сервисов
67
- COPY app.py /app/
68
 
69
  # Экспозиция портов
70
  EXPOSE 7860 8080 3000
 
30
  ENV GOPATH=/go
31
  ENV PATH=$PATH:$GOPATH/bin
32
 
33
+ # Установка Node.js 20.x (вместо 18.x) и pnpm для Playground
34
+ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
35
  apt-get install -y nodejs && \
36
  npm install -g pnpm
37
 
38
+ # Создаем пользователя для запуска приложения с правильными правами
39
+ RUN useradd -m -s /bin/bash tenuser
40
+
41
  WORKDIR /app
42
 
43
  # Клонирование репозитория TEN Agent (основная ветка)
 
46
  git branch -a && \
47
  git tag -l
48
 
49
+ # Создание необходимых директорий и назначение правильных прав
50
  RUN mkdir -p /app/server/bin && \
51
  mkdir -p /app/agents && \
52
+ mkdir -p /tmp/ten_agent && \
53
+ mkdir -p /app/.pnpm-store && \
54
+ chown -R tenuser:tenuser /app && \
55
+ chown -R tenuser:tenuser /tmp/ten_agent
56
 
57
  # Копирование файла .env с настройками
58
  COPY .env /app/.env
59
+ RUN chown tenuser:tenuser /app/.env
60
+
61
+ # Переключение на пользователя tenuser для сборки и запуска
62
+ USER tenuser
63
 
64
  # Сборка TEN Agent сервера
65
  RUN cd /app/server && \
 
68
  go build -o bin/api main.go && \
69
  chmod +x bin/api
70
 
71
+ # Сборка Playground UI с правами пользователя
72
  WORKDIR /app/playground
73
+ ENV PNPM_HOME="/app/.pnpm-store"
74
+ ENV PATH="$PNPM_HOME:$PATH"
75
+ RUN pnpm install --no-frozen-lockfile && \
76
  NEXT_PUBLIC_EDIT_GRAPH_MODE=false pnpm build
77
 
78
  # Копирование приложения Python для запуска всех сервисов
79
+ COPY --chown=tenuser:tenuser app.py /app/
80
 
81
  # Экспозиция портов
82
  EXPOSE 7860 8080 3000
app.py CHANGED
@@ -5,6 +5,7 @@ import sys
5
  import time
6
  from pathlib import Path
7
  import signal
 
8
 
9
  def main():
10
  processes = []
@@ -22,36 +23,12 @@ def main():
22
  print(f"ERROR: Playground directory not found at {playground_dir}", file=sys.stderr)
23
  return 1
24
 
25
- # Запускаем API сервер
26
- print("Starting TEN-Agent API server on port 8080...")
27
- api_server_process = subprocess.Popen([str(api_binary)])
28
- processes.append(api_server_process)
29
-
30
- # Даем время API серверу запуститься
31
- time.sleep(3)
32
-
33
- # Запускаем Playground UI
34
- print("Starting Playground UI on port 3000...")
35
- playground_env = os.environ.copy()
36
- playground_env["AGENT_SERVER_URL"] = "http://localhost:8080" # Подключаемся к локальному API серверу
37
- playground_process = subprocess.Popen(
38
- ["pnpm", "start", "--", "-p", "3000"],
39
- cwd=str(playground_dir),
40
- env=playground_env
41
- )
42
- processes.append(playground_process)
43
-
44
  # Запускаем простой HTTP сервер для Hugging Face
45
  from http.server import HTTPServer, SimpleHTTPRequestHandler
46
 
47
  class CustomHandler(SimpleHTTPRequestHandler):
48
  def do_GET(self):
49
- # Перенаправляем корневой запрос на Playground
50
  if self.path == '/':
51
- self.send_response(301)
52
- self.send_header('Location', 'http://localhost:3000')
53
- self.end_headers()
54
- else:
55
  self.send_response(200)
56
  self.send_header('Content-type', 'text/html; charset=utf-8')
57
  self.end_headers()
@@ -67,31 +44,56 @@ def main():
67
  h1 { color: #333; }
68
  .info { background: #f8f9fa; border-left: 4px solid #28a745; padding: 15px; margin-bottom: 20px; }
69
  .endpoint { background: #e9ecef; padding: 10px; border-radius: 5px; font-family: monospace; }
70
- .link { font-size: 18px; margin-top: 30px; text-align: center; }
71
- .link a { display: inline-block; background: #0d6efd; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; }
72
  </style>
73
  </head>
74
  <body>
75
  <h1>TEN Agent запущен успешно!</h1>
76
  <div class="info">
77
  <p>TEN Agent API сервер работает на порту 8080.</p>
78
- <p>Playground UI доступен на порту 3000.</p>
79
  </div>
80
- <div class="link">
81
- <a href="http://localhost:3000">Открыть Playground UI</a>
 
 
 
 
 
 
82
  </div>
83
- <h2>API эндпоинты:</h2>
84
- <ul>
85
- <li><span class="endpoint">GET /health</span> - проверка состояния сервера</li>
86
- <li><span class="endpoint">GET /list</span> - список запущенных агентов</li>
87
- <li><span class="endpoint">GET /graphs</span> - доступные графы</li>
88
- </ul>
 
 
 
 
 
89
  <p>См. <a href="https://github.com/TEN-framework/TEN-Agent" target="_blank">документацию TEN Agent</a> для получения дополнительной информации.</p>
90
  </body>
91
  </html>
92
  """
93
 
94
  self.wfile.write(html_content.encode('utf-8'))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
  # Запускаем HTTP сервер для Hugging Face
97
  port = 7860 # Hugging Face Space обычно ожидает сервер на порту 7860
 
5
  import time
6
  from pathlib import Path
7
  import signal
8
+ import shutil
9
 
10
  def main():
11
  processes = []
 
23
  print(f"ERROR: Playground directory not found at {playground_dir}", file=sys.stderr)
24
  return 1
25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  # Запускаем простой HTTP сервер для Hugging Face
27
  from http.server import HTTPServer, SimpleHTTPRequestHandler
28
 
29
  class CustomHandler(SimpleHTTPRequestHandler):
30
  def do_GET(self):
 
31
  if self.path == '/':
 
 
 
 
32
  self.send_response(200)
33
  self.send_header('Content-type', 'text/html; charset=utf-8')
34
  self.end_headers()
 
44
  h1 { color: #333; }
45
  .info { background: #f8f9fa; border-left: 4px solid #28a745; padding: 15px; margin-bottom: 20px; }
46
  .endpoint { background: #e9ecef; padding: 10px; border-radius: 5px; font-family: monospace; }
47
+ .api { margin-top: 30px; }
 
48
  </style>
49
  </head>
50
  <body>
51
  <h1>TEN Agent запущен успешно!</h1>
52
  <div class="info">
53
  <p>TEN Agent API сервер работает на порту 8080.</p>
54
+ <p>В связи с ограничениями Hugging Face Space, полноценный интерфейс Playground UI не может быть запущен напрямую.</p>
55
  </div>
56
+
57
+ <div class="api">
58
+ <h2>API эндпоинты:</h2>
59
+ <ul>
60
+ <li><span class="endpoint">GET /health</span> - проверка состояния сервера</li>
61
+ <li><span class="endpoint">GET /list</span> - список запущенных агентов</li>
62
+ <li><span class="endpoint">GET /graphs</span> - доступные графы</li>
63
+ </ul>
64
  </div>
65
+
66
+ <h2>Инструкция по локальному использованию</h2>
67
+ <p>Для использования полного интерфейса, подключите локальный Playground к этому API:</p>
68
+ <ol>
69
+ <li>Клонируйте репозиторий: <code>git clone https://github.com/TEN-framework/TEN-Agent.git</code></li>
70
+ <li>Перейдите в директорию playground: <code>cd TEN-Agent/playground</code></li>
71
+ <li>Установите зависимос��и: <code>pnpm install</code></li>
72
+ <li>Запустите Playground с подключением к API: <code>AGENT_SERVER_URL=https://nitrox-ten.hf.space pnpm dev</code></li>
73
+ <li>Откройте в браузере: <code>http://localhost:3000</code></li>
74
+ </ol>
75
+
76
  <p>См. <a href="https://github.com/TEN-framework/TEN-Agent" target="_blank">документацию TEN Agent</a> для получения дополнительной информации.</p>
77
  </body>
78
  </html>
79
  """
80
 
81
  self.wfile.write(html_content.encode('utf-8'))
82
+ elif self.path.startswith('/health') or self.path.startswith('/list') or self.path.startswith('/graphs'):
83
+ # Проксирование API запросов к API серверу
84
+ self.send_response(301)
85
+ self.send_header('Location', f'http://localhost:8080{self.path}')
86
+ self.end_headers()
87
+ else:
88
+ self.send_response(404)
89
+ self.send_header('Content-type', 'text/plain; charset=utf-8')
90
+ self.end_headers()
91
+ self.wfile.write(b'Not Found')
92
+
93
+ # Запускаем API сервер
94
+ print("Starting TEN-Agent API server on port 8080...")
95
+ api_server_process = subprocess.Popen([str(api_binary)])
96
+ processes.append(api_server_process)
97
 
98
  # Запускаем HTTP сервер для Hugging Face
99
  port = 7860 # Hugging Face Space обычно ожидает сервер на порту 7860