3v324v23 commited on
Commit
cb145d6
·
1 Parent(s): 20ad26e

Исправление проблемы с кэшем Go и предварительная компиляция API сервера

Browse files
Files changed (2) hide show
  1. Dockerfile +17 -1
  2. fallback.py +86 -48
Dockerfile CHANGED
@@ -34,6 +34,10 @@ ENV GOPATH=/go
34
  ENV PATH=$PATH:$GOPATH/bin
35
  RUN mkdir -p /go && chmod 777 /go
36
 
 
 
 
 
37
  # Установка Node.js и pnpm
38
  RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
39
  apt-get install -y nodejs && \
@@ -43,8 +47,20 @@ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
43
  WORKDIR /app
44
  RUN git clone --depth 1 https://github.com/TEN-framework/TEN-Agent.git /app
45
 
46
- # Создание пользовательской директории для временных файлов
47
  RUN mkdir -p /tmp/ten_user && chmod 777 /tmp/ten_user
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  # Создание .env файла из окружения Hugging Face Space
50
  # Используем простой формат без пробелов для предотвращения ошибок
 
34
  ENV PATH=$PATH:$GOPATH/bin
35
  RUN mkdir -p /go && chmod 777 /go
36
 
37
+ # Создание директории для кэша Go
38
+ ENV GOCACHE=/tmp/go-cache
39
+ RUN mkdir -p /tmp/go-cache && chmod 777 /tmp/go-cache
40
+
41
  # Установка Node.js и pnpm
42
  RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
43
  apt-get install -y nodejs && \
 
47
  WORKDIR /app
48
  RUN git clone --depth 1 https://github.com/TEN-framework/TEN-Agent.git /app
49
 
50
+ # Создание пользовательских директорий для временных файлов
51
  RUN mkdir -p /tmp/ten_user && chmod 777 /tmp/ten_user
52
+ RUN mkdir -p /app/fallback && chmod 777 /app/fallback
53
+
54
+ # Компиляция API сервера
55
+ RUN mkdir -p /app/server/bin && \
56
+ cd /app/server && \
57
+ GOCACHE=/tmp/go-cache go build -o bin/api main.go && \
58
+ chmod +x bin/api && \
59
+ cp bin/api /app/fallback/api && \
60
+ chmod 777 /app/fallback/api
61
+
62
+ # Проверяем, что API сервер скомпилирован
63
+ RUN ls -la /app/server/bin/api /app/fallback/api
64
 
65
  # Создание .env файла из окружения Hugging Face Space
66
  # Используем простой формат без пробелов для предотвращения ошибок
fallback.py CHANGED
@@ -21,8 +21,12 @@ def create_user_directory():
21
  server_bin_dir = user_dir / "server" / "bin"
22
  server_bin_dir.mkdir(exist_ok=True, parents=True)
23
 
 
 
 
 
24
  print(f"Created directory structure at {user_dir}")
25
- return user_dir, agents_dir, server_bin_dir
26
 
27
  def create_basic_files(agents_dir):
28
  """Создает базовые файлы конфигурации для TEN-Agent"""
@@ -129,46 +133,54 @@ def create_basic_files(agents_dir):
129
 
130
  print("Basic configuration files created successfully.")
131
 
132
- def check_api_server(server_bin_dir):
133
- """Проверяет наличие API сервера и компилирует его при необходимости"""
134
  api_bin = server_bin_dir / "api"
135
 
136
- if not api_bin.exists():
137
- print("Copying API server binary...")
138
- # Проверяем наличие уже скомпилированного сервера в основном репозитории
139
- original_bin = Path("/app/server/bin/api")
140
- if original_bin.exists():
141
- # Копируем бинарник из основного репозитория
142
- shutil.copy(original_bin, api_bin)
143
- api_bin.chmod(0o755) # Делаем исполняемым
144
- print(f"API server binary copied to {api_bin}")
145
- else:
146
- print("Compiling API server from source...")
147
- try:
148
- # Компилируем сервер
149
- result = subprocess.run(
150
- "cd /app/server && go build -o /tmp/ten_user/server/bin/api main.go",
151
- shell=True,
152
- check=True,
153
- stdout=subprocess.PIPE,
154
- stderr=subprocess.PIPE
155
- )
156
- print(f"API server compiled successfully: {result.stdout.decode()}")
157
- # Делаем исполняемым
158
- api_bin.chmod(0o755)
159
- except subprocess.CalledProcessError as e:
160
- print(f"Failed to compile API server: {e.stderr.decode()}")
161
- # Как последний вариант, используем предварительно скомпилированный бинарник
162
- fallback_bin = Path("/app/fallback/api")
163
- if fallback_bin.exists():
164
- shutil.copy(fallback_bin, api_bin)
165
- api_bin.chmod(0o755)
166
- print(f"Using pre-compiled fallback API server binary")
167
- else:
168
- print("No API server binary available! Cannot continue.")
169
- return False
170
 
171
- return True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
 
173
  def main():
174
  try:
@@ -179,18 +191,34 @@ def main():
179
  user = os.environ.get('USER', 'unknown')
180
  print(f"Current user: {user}")
181
  print(f"HOME: {os.environ.get('HOME', 'unset')}")
 
182
 
183
  # Создаем пользовательские директории
184
- user_dir, agents_dir, server_bin_dir = create_user_directory()
185
 
186
  # Создаем базовые конфигурационные файлы
187
  create_basic_files(agents_dir)
188
 
189
- # Проверяем API сервер
190
- if not check_api_server(server_bin_dir):
191
  print("Critical error: Cannot prepare API server")
192
  sys.exit(1)
193
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  # Установка переменных среды
195
  os.environ["PORT"] = "7860" # HuggingFace использует порт 7860
196
  os.environ["AGENT_SERVER_URL"] = "http://localhost:8080"
@@ -198,19 +226,29 @@ def main():
198
  os.environ["NEXT_PUBLIC_DISABLE_CAMERA"] = "true"
199
 
200
  # Путь к бинарнику API сервера
201
- api_bin = str(server_bin_dir / "api")
202
 
203
  # Запускаем API сервер с указанием пути к agents директории
204
  print(f"Starting API server with agents directory: {agents_dir}")
205
  api_env = os.environ.copy()
206
  api_env["TEN_AGENT_DIR"] = str(agents_dir)
 
207
 
208
- api_process = subprocess.Popen(
209
- [api_bin],
210
- env=api_env,
211
- stdout=subprocess.PIPE,
212
- stderr=subprocess.PIPE
213
- )
 
 
 
 
 
 
 
 
 
214
 
215
  # Даем серверу время для запуска
216
  time.sleep(5)
 
21
  server_bin_dir = user_dir / "server" / "bin"
22
  server_bin_dir.mkdir(exist_ok=True, parents=True)
23
 
24
+ # Создаем директорию для кэша Go
25
+ go_cache_dir = Path("/tmp/go-cache")
26
+ go_cache_dir.mkdir(exist_ok=True, parents=True)
27
+
28
  print(f"Created directory structure at {user_dir}")
29
+ return user_dir, agents_dir, server_bin_dir, go_cache_dir
30
 
31
  def create_basic_files(agents_dir):
32
  """Создает базовые файлы конфигурации для TEN-Agent"""
 
133
 
134
  print("Basic configuration files created successfully.")
135
 
136
+ def copy_api_server(server_bin_dir):
137
+ """Копирует предварительно скомпилированный API сервер"""
138
  api_bin = server_bin_dir / "api"
139
 
140
+ # Приоритезируем API сервер из директории fallback
141
+ fallback_bin = Path("/app/fallback/api")
142
+ if fallback_bin.exists():
143
+ print(f"Found pre-compiled API server at {fallback_bin}")
144
+ shutil.copy(fallback_bin, api_bin)
145
+ api_bin.chmod(0o755) # Делаем исполняемым
146
+ print(f"API server binary copied to {api_bin}")
147
+ return True
148
+
149
+ # Ищем API сервер в основной директории
150
+ original_bin = Path("/app/server/bin/api")
151
+ if original_bin.exists():
152
+ print(f"Found API server at {original_bin}")
153
+ shutil.copy(original_bin, api_bin)
154
+ api_bin.chmod(0o755) # Делаем исполняемым
155
+ print(f"API server binary copied to {api_bin}")
156
+ return True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
 
158
+ # Если не нашли готовый бинарник, пытаемся компилировать
159
+ try:
160
+ print("No pre-compiled API server found, trying to compile from source...")
161
+ env = os.environ.copy()
162
+ env["GOCACHE"] = "/tmp/go-cache" # Указываем директорию для кэша Go
163
+ env["GOPATH"] = "/tmp/go-path" # Указываем пользовательский GOPATH
164
+
165
+ # Создаем директорию для GOPATH
166
+ Path("/tmp/go-path").mkdir(exist_ok=True, parents=True)
167
+
168
+ # Компилируем с пользовательскими настройками
169
+ result = subprocess.run(
170
+ "cd /app/server && go build -o /tmp/ten_user/server/bin/api main.go",
171
+ shell=True,
172
+ check=True,
173
+ stdout=subprocess.PIPE,
174
+ stderr=subprocess.PIPE,
175
+ env=env
176
+ )
177
+ print(f"Successfully compiled API server: {result.stdout.decode()}")
178
+ api_bin.chmod(0o755)
179
+ return True
180
+ except subprocess.CalledProcessError as e:
181
+ print(f"Failed to compile API server: {e.stderr.decode()}")
182
+ print("Critical error: No API server available!")
183
+ return False
184
 
185
  def main():
186
  try:
 
191
  user = os.environ.get('USER', 'unknown')
192
  print(f"Current user: {user}")
193
  print(f"HOME: {os.environ.get('HOME', 'unset')}")
194
+ print(f"PATH: {os.environ.get('PATH', 'unset')}")
195
 
196
  # Создаем пользовательские директории
197
+ user_dir, agents_dir, server_bin_dir, go_cache_dir = create_user_directory()
198
 
199
  # Создаем базовые конфигурационные файлы
200
  create_basic_files(agents_dir)
201
 
202
+ # Копируем API сервер
203
+ if not copy_api_server(server_bin_dir):
204
  print("Critical error: Cannot prepare API server")
205
  sys.exit(1)
206
 
207
+ # Проверяем, что API сервер действительно скопирован и исполняемый
208
+ api_bin = server_bin_dir / "api"
209
+ if not api_bin.exists():
210
+ print(f"Critical error: API server binary not found at {api_bin}")
211
+ sys.exit(1)
212
+
213
+ try:
214
+ api_bin.chmod(0o755) # Дополнительно проверяем права
215
+ except Exception as e:
216
+ print(f"Warning: Could not set execute permissions on API server binary: {e}")
217
+ # Продолжаем, возможно, права уже установлены
218
+
219
+ print(f"API server binary prepared successfully: {api_bin}")
220
+ print(f"File exists: {api_bin.exists()}, size: {api_bin.stat().st_size} bytes")
221
+
222
  # Установка переменных среды
223
  os.environ["PORT"] = "7860" # HuggingFace использует порт 7860
224
  os.environ["AGENT_SERVER_URL"] = "http://localhost:8080"
 
226
  os.environ["NEXT_PUBLIC_DISABLE_CAMERA"] = "true"
227
 
228
  # Путь к бинарнику API сервера
229
+ api_bin_str = str(api_bin)
230
 
231
  # Запускаем API сервер с указанием пути к agents директории
232
  print(f"Starting API server with agents directory: {agents_dir}")
233
  api_env = os.environ.copy()
234
  api_env["TEN_AGENT_DIR"] = str(agents_dir)
235
+ api_env["GOCACHE"] = str(go_cache_dir) # Устанавливаем переменную GOCACHE
236
 
237
+ # Дополнительно проверяем права на исполнение через ls -la
238
+ subprocess.run(["ls", "-la", api_bin_str], check=True)
239
+
240
+ # Запускаем API сервер
241
+ print(f"Executing API server: {api_bin_str}")
242
+ try:
243
+ api_process = subprocess.Popen(
244
+ [api_bin_str],
245
+ env=api_env,
246
+ stdout=subprocess.PIPE,
247
+ stderr=subprocess.PIPE
248
+ )
249
+ except Exception as e:
250
+ print(f"Failed to start API server: {e}")
251
+ sys.exit(1)
252
 
253
  # Даем серверу время для запуска
254
  time.sleep(5)