Update server.js
Browse files
server.js
CHANGED
@@ -22,6 +22,10 @@ if (hfUserConfig) {
|
|
22 |
});
|
23 |
}
|
24 |
|
|
|
|
|
|
|
|
|
25 |
// 缓存管理
|
26 |
class SpaceCache {
|
27 |
constructor() {
|
@@ -160,7 +164,7 @@ app.post('/api/proxy/rebuild/:repoId(*)', async (req, res) => {
|
|
160 |
const payload = { factoryReboot: true };
|
161 |
console.log(`发送重建请求,payload: ${JSON.stringify(payload)}`);
|
162 |
const response = await axios.post(`https://huggingface.co/api/spaces/${repoId}/restart`, payload, { headers });
|
163 |
-
console.log(`重建 Space ${repoId} 成功,状态码: ${response.status}
|
164 |
res.json({ success: true, message: `Space ${repoId} 重建成功` });
|
165 |
} catch (error) {
|
166 |
console.error(`重建 space 失败 (${req.params.repoId}):`, error.message);
|
@@ -260,9 +264,9 @@ app.post('/api/v1/action/:token/:spaceId(*)/rebuild', async (req, res) => {
|
|
260 |
|
261 |
const headers = { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' };
|
262 |
const payload = { factoryReboot: true };
|
263 |
-
console.log(`外部 API 发送重建请求,spaceId: ${spaceId}
|
264 |
const response = await axios.post(`https://huggingface.co/api/spaces/${spaceId}/restart`, payload, { headers });
|
265 |
-
console.log(`外部 API 重建 Space ${spaceId} 成功,状态码: ${response.status}
|
266 |
res.json({ success: true, message: `Space ${spaceId} 重建成功` });
|
267 |
} catch (error) {
|
268 |
console.error(`重建 space 失败 (外部 API):`, error.message);
|
@@ -295,29 +299,22 @@ app.get('/api/proxy/live-metrics/:username/:instanceId', async (req, res) => {
|
|
295 |
|
296 |
const token = userTokenMapping[username];
|
297 |
let headers = {
|
298 |
-
'Accept': 'text/event-stream',
|
299 |
'Cache-Control': 'no-cache',
|
300 |
'Connection': 'keep-alive'
|
301 |
};
|
302 |
if (token) {
|
303 |
headers['Authorization'] = `Bearer ${token}`;
|
304 |
-
console.log(`使用 Token 访问监控数据 (${username}/${instanceId})`);
|
305 |
-
} else {
|
306 |
-
console.warn(`用户 ${username} 没有配置 API Token,将尝试无认证访问公开数据`);
|
307 |
}
|
308 |
|
309 |
-
console.log(`尝试获取监控数据: ${url}`);
|
310 |
-
|
311 |
const response = await axios({
|
312 |
method: 'get',
|
313 |
url,
|
314 |
headers,
|
315 |
responseType: 'stream',
|
316 |
-
timeout: 10000
|
317 |
});
|
318 |
|
319 |
-
console.log(`成功连接监控数据流 (${username}/${instanceId}),状态码: ${response.status}`);
|
320 |
-
|
321 |
res.set({
|
322 |
'Content-Type': 'text/event-stream',
|
323 |
'Cache-Control': 'no-cache',
|
@@ -325,28 +322,11 @@ app.get('/api/proxy/live-metrics/:username/:instanceId', async (req, res) => {
|
|
325 |
});
|
326 |
response.data.pipe(res);
|
327 |
|
328 |
-
response.data.on('data', (chunk) => {
|
329 |
-
console.log(`接收到监控数据片段 (${username}/${instanceId}): ${chunk.length} 字节`);
|
330 |
-
});
|
331 |
-
|
332 |
-
response.data.on('error', (err) => {
|
333 |
-
console.error(`直播监控数据流错误 (${username}/${instanceId}):`, err.message);
|
334 |
-
res.status(500).end();
|
335 |
-
});
|
336 |
-
|
337 |
req.on('close', () => {
|
338 |
-
console.log(`客户端关闭监控数据连接 (${username}/${instanceId})`);
|
339 |
response.data.destroy();
|
340 |
});
|
341 |
} catch (error) {
|
342 |
console.error(`代理获取直播监控数据失败 (${req.params.username}/${req.params.instanceId}):`, error.message);
|
343 |
-
if (error.response) {
|
344 |
-
console.error(`状态码: ${error.response.status}, 响应头:`, error.response.headers);
|
345 |
-
} else if (error.request) {
|
346 |
-
console.error(`请求未收到响应:`, error.message);
|
347 |
-
} else {
|
348 |
-
console.error(`请求配置错误:`, error.message);
|
349 |
-
}
|
350 |
res.status(error.response?.status || 500).json({ error: '获取监控数据失败', details: error.message });
|
351 |
}
|
352 |
});
|
@@ -359,4 +339,5 @@ app.get('*', (req, res) => {
|
|
359 |
app.listen(port, () => {
|
360 |
console.log(`Server running on port ${port}`);
|
361 |
console.log(`User configurations:`, usernames.map(user => `${user}: ${userTokenMapping[user] ? 'Token Configured' : 'No Token'}`).join(', ') || 'None');
|
|
|
362 |
});
|
|
|
22 |
});
|
23 |
}
|
24 |
|
25 |
+
// 从环境变量获取登录凭据
|
26 |
+
const ADMIN_USERNAME = process.env.USER_NAME || 'admin';
|
27 |
+
const ADMIN_PASSWORD = process.env.USER_PASSWORD || 'password';
|
28 |
+
|
29 |
// 缓存管理
|
30 |
class SpaceCache {
|
31 |
constructor() {
|
|
|
164 |
const payload = { factoryReboot: true };
|
165 |
console.log(`发送重建请求,payload: ${JSON.stringify(payload)}`);
|
166 |
const response = await axios.post(`https://huggingface.co/api/spaces/${repoId}/restart`, payload, { headers });
|
167 |
+
console.log(`重建 Space ${repoId} 成功,状态码: ${response.status}`);
|
168 |
res.json({ success: true, message: `Space ${repoId} 重建成功` });
|
169 |
} catch (error) {
|
170 |
console.error(`重建 space 失败 (${req.params.repoId}):`, error.message);
|
|
|
264 |
|
265 |
const headers = { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' };
|
266 |
const payload = { factoryReboot: true };
|
267 |
+
console.log(`外部 API 发送重建请求,spaceId: ${spaceId}`);
|
268 |
const response = await axios.post(`https://huggingface.co/api/spaces/${spaceId}/restart`, payload, { headers });
|
269 |
+
console.log(`外部 API 重建 Space ${spaceId} 成功,状态码: ${response.status}`);
|
270 |
res.json({ success: true, message: `Space ${spaceId} 重建成功` });
|
271 |
} catch (error) {
|
272 |
console.error(`重建 space 失败 (外部 API):`, error.message);
|
|
|
299 |
|
300 |
const token = userTokenMapping[username];
|
301 |
let headers = {
|
302 |
+
'Accept': 'text/event-stream',
|
303 |
'Cache-Control': 'no-cache',
|
304 |
'Connection': 'keep-alive'
|
305 |
};
|
306 |
if (token) {
|
307 |
headers['Authorization'] = `Bearer ${token}`;
|
|
|
|
|
|
|
308 |
}
|
309 |
|
|
|
|
|
310 |
const response = await axios({
|
311 |
method: 'get',
|
312 |
url,
|
313 |
headers,
|
314 |
responseType: 'stream',
|
315 |
+
timeout: 10000
|
316 |
});
|
317 |
|
|
|
|
|
318 |
res.set({
|
319 |
'Content-Type': 'text/event-stream',
|
320 |
'Cache-Control': 'no-cache',
|
|
|
322 |
});
|
323 |
response.data.pipe(res);
|
324 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
325 |
req.on('close', () => {
|
|
|
326 |
response.data.destroy();
|
327 |
});
|
328 |
} catch (error) {
|
329 |
console.error(`代理获取直播监控数据失败 (${req.params.username}/${req.params.instanceId}):`, error.message);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
330 |
res.status(error.response?.status || 500).json({ error: '获取监控数据失败', details: error.message });
|
331 |
}
|
332 |
});
|
|
|
339 |
app.listen(port, () => {
|
340 |
console.log(`Server running on port ${port}`);
|
341 |
console.log(`User configurations:`, usernames.map(user => `${user}: ${userTokenMapping[user] ? 'Token Configured' : 'No Token'}`).join(', ') || 'None');
|
342 |
+
console.log(`Admin login enabled: Username=${ADMIN_USERNAME}, Password=${ADMIN_PASSWORD ? 'Configured' : 'Not Configured'}`);
|
343 |
});
|