10 Commits

Author SHA1 Message Date
e7b5a1ce09 feat: Cron列表移至底部并添加概述分析 2026-04-14 10:40:09 +08:00
9a23e98dc1 feat: 添加主机 Cron 列表展示功能 2026-04-14 10:34:24 +08:00
b44d0cfd00 feat: 添加 tech-forum 项目配置 2026-04-13 12:06:37 +08:00
aa99472509 fix: 修正 llm-proxy 配置为单端口 v2.0.0 2026-04-13 11:07:52 +08:00
d2823e1b32 feat: 更新 llm-proxy 和 product-crawler 为单端口配置
- llm-proxy: 19007 (原 19007+19008) v2.0.0
- product-crawler: 19011 (原 19011+19012) v2.0.0
2026-04-13 10:59:00 +08:00
0c2a21f176 feat: 添加 multi-agent-bidding 项目配置 2026-04-13 10:44:54 +08:00
893f6f9486 feat: 添加浏览器标签图标 📊 2026-04-13 10:34:30 +08:00
1996bbf48c feat: 添加 xian-favor 项目配置 2026-04-13 10:29:45 +08:00
c73196dad3 feat: 添加AI对话系统项目配置 2026-04-11 20:38:32 +08:00
1d9660c73d fix: 修正目录路径拼接问题 2026-04-11 13:14:56 +08:00
9 changed files with 95114 additions and 16 deletions

339
app.py
View File

@@ -17,7 +17,8 @@ import urllib.error
app = Flask(__name__)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
WORKSPACE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
WORKSPACE_DIR = os.path.dirname(BASE_DIR) # works目录
ROOT_DIR = os.path.dirname(WORKSPACE_DIR) # workspace-coder目录
PROJECTS_FILE = os.path.join(BASE_DIR, 'projects.json')
# 进程状态缓存
@@ -203,6 +204,7 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>项目服务管理面板</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📊</text></svg>">
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/remixicon@3.5.0/fonts/remixicon.css" rel="stylesheet">
<style>
@@ -307,6 +309,33 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
<p class="mt-2">加载中...</p>
</div>
</div>
<!-- 系统 Cron 列表 -->
<div class="card rounded-xl p-6 mt-8">
<div class="flex items-center justify-between mb-4">
<h2 class="text-xl font-bold flex items-center gap-2">
<i class="ri-timer-line text-orange-400"></i>
主机 Cron 列表
<span id="systemCronCount" class="text-sm text-gray-400 ml-2">-</span>
</h2>
<button onclick="loadCrons()" class="btn bg-orange-600 hover:bg-orange-700 px-3 py-1 rounded text-sm flex items-center gap-1">
<i class="ri-refresh-line"></i> 刷新
</button>
</div>
<!-- Cron 概述 -->
<div id="cronSummary" class="mb-4 p-4 bg-gray-800/50 rounded-lg border border-gray-700">
<div class="text-center py-4 text-gray-400 text-sm">加载中...</div>
</div>
<!-- Cron 详细列表 -->
<div id="cronsList" class="space-y-3">
<div class="text-center py-8 text-gray-400">
<i class="ri-loader-4-line text-2xl animate-spin"></i>
<p class="mt-2 text-sm">加载中...</p>
</div>
</div>
</div>
</div>
<!-- 日志模态框 -->
@@ -632,9 +661,170 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
// 初始化
loadProjects();
loadCrons();
// 每30秒自动刷新
setInterval(loadProjects, 30000);
async function loadCrons() {
try {
const res = await fetch('/api/crons');
const data = await res.json();
renderCrons(data.crons);
document.getElementById('systemCronCount').textContent = data.crons.length;
} catch (e) {
console.error('加载Cron失败:', e);
document.getElementById('cronsList').innerHTML = `
<div class="text-center py-8 text-red-400">
<i class="ri-error-warning-line text-2xl"></i>
<p class="mt-2 text-sm">加载失败: ${e.message}</p>
</div>
`;
}
}
function renderCrons(crons) {
const list = document.getElementById('cronsList');
document.getElementById('systemCronCount').textContent = `${crons.length} 个`;
if (crons.length === 0) {
list.innerHTML = `
<div class="text-center py-8 text-gray-400">
<i class="ri-folder-open-line text-2xl"></i>
<p class="mt-2 text-sm">暂无 Cron 任务</p>
</div>
`;
return;
}
// 分类统计并生成概述
const userCrons = crons.filter(c => c.source === 'user');
const systemCrons = crons.filter(c => c.source === 'system');
const cronDCrons = crons.filter(c => c.source === 'cron.d');
// 分析用户任务用途
const userTaskTypes = analyzeUserCrons(userCrons);
// 生成概述
let summaryHtml = `
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="bg-blue-500/10 rounded-lg p-3 border border-blue-500/30">
<div class="flex items-center gap-2 mb-2">
<i class="ri-user-line text-blue-400"></i>
<span class="text-blue-400 font-medium">用户任务</span>
<span class="text-blue-300 text-sm">${userCrons.length} 个</span>
</div>
<div class="text-gray-300 text-sm space-y-1">
${userTaskTypes.map(t => `<div><span class="text-gray-400">${t.count}个</span> ${t.name}</div>`).join('')}
</div>
</div>
<div class="bg-red-500/10 rounded-lg p-3 border border-red-500/30">
<div class="flex items-center gap-2 mb-2">
<i class="ri-settings-line text-red-400"></i>
<span class="text-red-400 font-medium">系统任务</span>
<span class="text-red-300 text-sm">${systemCrons.length} 个</span>
</div>
<div class="text-gray-300 text-sm space-y-1">
<div><span class="text-gray-400">每小时</span> 执行 cron.hourly</div>
<div><span class="text-gray-400">每天</span> 执行 cron.daily</div>
<div><span class="text-gray-400">每周</span> 执行 cron.weekly</div>
<div><span class="text-gray-400">每月</span> 执行 cron.monthly</div>
</div>
</div>
<div class="bg-green-500/10 rounded-lg p-3 border border-green-500/30">
<div class="flex items-center gap-2 mb-2">
<i class="ri-file-list-line text-green-400"></i>
<span class="text-green-400 font-medium">cron.d</span>
<span class="text-green-300 text-sm">${cronDCrons.length} 个</span>
</div>
<div class="text-gray-300 text-sm space-y-1">
${cronDCrons.map(c => `<div><span class="text-gray-400">${c.file}</span> ${c.description || ''}</div>`).join('')}
</div>
</div>
</div>
`;
document.getElementById('cronSummary').innerHTML = summaryHtml;
const sourceColors = {
'user': { bg: 'bg-blue-500/20', text: 'text-blue-400', label: '用户' },
'system': { bg: 'bg-red-500/20', text: 'text-red-400', label: '系统' },
'cron.d': { bg: 'bg-green-500/20', text: 'text-green-400', label: 'cron.d' }
};
let html = '';
crons.forEach((cron, index) => {
const sourceInfo = sourceColors[cron.source] || { bg: 'bg-gray-500/20', text: 'text-gray-400', label: cron.source };
html += `
<div class="bg-gray-800/50 rounded-lg p-3 border border-gray-700">
<div class="flex items-start justify-between gap-4">
<div class="flex-1">
<div class="flex items-center gap-2 mb-2">
<span class="px-2 py-0.5 rounded text-xs ${sourceInfo.bg} ${sourceInfo.text}">${sourceInfo.label}</span>
${cron.file ? `<span class="text-xs text-gray-500">${cron.file}</span>` : ''}
${cron.user ? `<span class="text-xs text-gray-400">用户: ${cron.user}</span>` : ''}
</div>
<div class="flex items-center gap-3">
<code class="text-yellow-400 text-sm font-mono">${cron.expression}</code>
<span class="text-gray-500 text-xs">→</span>
<span class="text-green-400 text-sm">${cron.description || ''}</span>
</div>
<div class="mt-2 text-gray-300 text-sm font-mono break-all">
${escapeHtml(cron.command)}
</div>
</div>
<div class="text-right">
<span class="text-xs text-gray-500">#${index + 1}</span>
</div>
</div>
</div>
`;
});
list.innerHTML = html;
}
function analyzeUserCrons(crons) {
const types = [];
// 服务监控
const monitors = crons.filter(c => c.command.includes('service-monitor') || c.command.includes('monitor.py') || c.command.includes('cpu-monitor') || c.command.includes('disk-monitor'));
if (monitors.length > 0) types.push({ name: '系统监控', count: monitors.length });
// 股票/板块相关
const stocks = crons.filter(c => c.command.includes('stock') || c.command.includes('board_monitor'));
if (stocks.length > 0) types.push({ name: 'A股数据/板块监控', count: stocks.length });
// 每日总结
const summaries = crons.filter(c => c.command.includes('daily-summary') || c.command.includes('summary'));
if (summaries.length > 0) types.push({ name: '每日总结', count: summaries.length });
// 清理脚本
const cleanups = crons.filter(c => c.command.includes('cleanup') || c.command.includes('clean'));
if (cleanups.length > 0) types.push({ name: '清理脚本', count: cleanups.length });
// 其他
const others = crons.filter(c =>
!c.command.includes('service-monitor') &&
!c.command.includes('monitor.py') &&
!c.command.includes('cpu-monitor') &&
!c.command.includes('disk-monitor') &&
!c.command.includes('stock') &&
!c.command.includes('board_monitor') &&
!c.command.includes('daily-summary') &&
!c.command.includes('summary') &&
!c.command.includes('cleanup') &&
!c.command.includes('clean')
);
if (others.length > 0) types.push({ name: '其他任务', count: others.length });
return types;
}
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
</script>
</body>
</html>
@@ -678,7 +868,7 @@ def api_start(project_id):
if directory.startswith('/'):
cwd = directory
else:
cwd = os.path.join(WORKSPACE_DIR, directory)
cwd = os.path.join(ROOT_DIR, directory)
if not os.path.exists(cwd):
return jsonify({'error': f'目录不存在: {cwd}'}), 400
@@ -727,7 +917,7 @@ def api_run(project_id):
if directory.startswith('/'):
cwd = directory
else:
cwd = os.path.join(WORKSPACE_DIR, directory)
cwd = os.path.join(ROOT_DIR, directory)
cmd = project.get('run_cmd', '')
if not cmd:
@@ -819,6 +1009,149 @@ def api_delete_project(project_id):
return jsonify({'message': '删除成功'})
def get_system_crons():
"""获取系统所有 cron 任务"""
crons = []
# 获取当前用户的 crontab
try:
result = subprocess.run(
"crontab -l 2>/dev/null",
shell=True, capture_output=True, text=True, timeout=5
)
user_crontab = result.stdout.strip()
if user_crontab:
for line in user_crontab.split('\n'):
line = line.strip()
if line and not line.startswith('#'):
# 解析 cron 行
parts = line.split()
if len(parts) >= 6:
cron_expr = ' '.join(parts[:5])
command = ' '.join(parts[5:])
crons.append({
'source': 'user',
'expression': cron_expr,
'command': command,
'line': line
})
except:
pass
# 获取系统级 cron (/etc/crontab)
try:
if os.path.exists('/etc/crontab'):
with open('/etc/crontab', 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#'):
parts = line.split()
if len(parts) >= 7:
# 系统 crontab 有额外的 user 字段
cron_expr = ' '.join(parts[:5])
user = parts[5]
command = ' '.join(parts[6:])
crons.append({
'source': 'system',
'expression': cron_expr,
'user': user,
'command': command,
'line': line
})
except:
pass
# 获取 /etc/cron.d/ 目录下的任务
try:
cron_d_dir = '/etc/cron.d'
if os.path.exists(cron_d_dir):
for filename in os.listdir(cron_d_dir):
filepath = os.path.join(cron_d_dir, filename)
if os.path.isfile(filepath):
with open(filepath, 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#'):
parts = line.split()
if len(parts) >= 7:
cron_expr = ' '.join(parts[:5])
user = parts[5]
command = ' '.join(parts[6:])
crons.append({
'source': 'cron.d',
'file': filename,
'expression': cron_expr,
'user': user,
'command': command,
'line': line
})
except:
pass
return crons
def parse_cron_expression(expr):
"""解析 cron 表达式为人类可读格式"""
parts = expr.split()
if len(parts) != 5:
return expr
minute, hour, day, month, weekday = parts
desc = []
# 分钟
if minute == '*':
desc.append('每分钟')
elif minute.startswith('*/'):
desc.append(f'{minute[2:]}分钟')
else:
desc.append(f'{minute}')
# 小时
if hour != '*':
if minute == '*':
desc = [f'{hour}点每分钟']
else:
desc = [f'{hour}{minute}']
elif minute.startswith('*/'):
# 保持 "每X分钟"
pass
# 日期
if day != '*':
desc.append(f'{day}')
# 月份
if month != '*':
months = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
try:
desc.append(f'{months[int(month)-1]}')
except:
desc.append(f'{month}')
# 星期
if weekday != '*':
weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
try:
# 0=周日, 1=周一...
desc.append(weekdays[int(weekday)])
except:
desc.append(f'{weekday}')
return ' '.join(desc) if desc else expr
@app.route('/api/crons')
def api_crons():
"""获取系统 cron 列表"""
crons = get_system_crons()
for cron in crons:
cron['description'] = parse_cron_expression(cron['expression'])
return jsonify({'crons': crons})
if __name__ == '__main__':
os.makedirs(os.path.join(BASE_DIR, 'logs'), exist_ok=True)
print("=" * 50)

242
logs/ai-chat-system.log Normal file
View File

@@ -0,0 +1,242 @@
==================================================
[2026-04-11T20:39:35.611218] start
Command: python3 main.py
Directory: /home/xian/.openclaw/workspace-coder/works/ai-chat
/home/xian/.openclaw/workspace-coder/works/ai-chat/main.py:481: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("startup")
/home/xian/.openclaw/workspace-coder/works/ai-chat/main.py:506: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("shutdown")
INFO: Started server process [1469228]
INFO: Waiting for application startup.
INFO:__main__:数据库初始化完成
INFO:services.ai_service:AI配置已更新: api_base=http://192.168.2.17:19007/v1, model=auto, use_mock=False
INFO:__main__:AI配置已加载: http://192.168.2.17:19007/v1, model=auto
INFO:services.matrix_service:Matrix配置: homeserver=http://matrix.tphai.com, user=@tester:matrix.tphai.com
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/account/whoami "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix HTTP API连接成功: @tester:matrix.tphai.com
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/joined_rooms "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix房间: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO:__main__:Matrix Bot已启动
INFO:services.matrix_service:Matrix HTTP同步任务已启动
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:19020 (Press CTRL+C to quit)
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:48668 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6449_126845_4290_2988_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6449_126845_4290_2988_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61860 - "GET / HTTP/1.1" 200 OK
INFO: 192.168.2.10:61860 - "GET /api/conversations HTTP/1.1" 200 OK
INFO: 192.168.2.10:61862 - "WebSocket /ws/main_user" [accepted]
INFO:__main__:WebSocket连接: main_user, 当前连接数: 1
INFO: 192.168.2.10:61861 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: connection open
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:37244 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6449_126845_4290_2988_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: PUT http://matrix.tphai.com/_matrix/client/v3/rooms/!CUXwXrsopvYKCAEdKe:matrix.tphai.com/send/m.room.message/m1248774373 "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix消息发送成功: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO:services.ai_service:调用AI API: http://192.168.2.17:19007/v1/chat/completions, model=auto
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6449_126845_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://192.168.2.17:19007/v1/chat/completions "HTTP/1.1 502 Bad Gateway"
ERROR:services.ai_service:AI API调用失败: Server error '502 Bad Gateway' for url 'http://192.168.2.17:19007/v1/chat/completions'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502
INFO:httpx:HTTP Request: PUT http://matrix.tphai.com/_matrix/client/v3/rooms/!CUXwXrsopvYKCAEdKe:matrix.tphai.com/send/m.room.message/m1248775047 "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix消息发送成功: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6450_126845_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6451_126845_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:33214 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6451_126845_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: PUT http://matrix.tphai.com/_matrix/client/v3/rooms/!CUXwXrsopvYKCAEdKe:matrix.tphai.com/send/m.room.message/m1248795620 "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix消息发送成功: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO:services.ai_service:调用AI API: http://192.168.2.17:19007/v1/chat/completions, model=auto
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6451_126851_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:36850 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6452_126851_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: POST http://192.168.2.17:19007/v1/chat/completions "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: PUT http://matrix.tphai.com/_matrix/client/v3/rooms/!CUXwXrsopvYKCAEdKe:matrix.tphai.com/send/m.room.message/m1248804105 "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix消息发送成功: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6452_126851_4290_2990_3382_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4290_2990_3382_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4290_2991_3383_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4291_2991_3383_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4293_2991_3383_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4294_2991_3383_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:35322 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:44872 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:60958 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2992_3385_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:52004 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:51416 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61981 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61982 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:41872 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:62002 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:62001 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126875_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126875_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126875_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6455_126875_4295_2993_3388_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:38462 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6455_126875_4295_2993_3389_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:38470 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6459_126875_4295_2993_3389_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6459_126875_4295_2993_3389_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:62044 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:62045 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6463_126875_4295_2993_3389_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6464_126875_4295_2994_3390_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6467_126881_4295_2994_3390_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6468_126881_4295_2994_3390_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6472_126881_4295_2994_3390_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6474_126881_4295_2996_3391_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6474_126881_4295_2997_3391_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:53056 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6476_126881_4295_2999_3391_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6476_126881_4295_2999_3391_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:62071 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:62072 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6478_126881_4295_3000_3392_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6478_126881_4295_3001_3393_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6481_126887_4295_3002_3395_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6482_126887_4295_3002_3396_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6484_126887_4295_3003_3396_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6487_126887_4295_3006_3396_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6488_126887_4295_3006_3396_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:60854 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: Shutting down
INFO:__main__:WebSocket断开: main_user
INFO: connection closed
INFO: Waiting for application shutdown.
INFO:__main__:应用已关闭
INFO: Application shutdown complete.
INFO: Finished server process [1469228]
Terminated

262
logs/app.log Normal file
View File

@@ -0,0 +1,262 @@
==================================================
项目服务管理面板
访问地址: http://localhost:19013
==================================================
* Serving Flask app 'app'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:19013
* Running on http://192.168.2.17:19013
Press CTRL+C to quit
192.168.2.10 - - [12/Apr/2026 18:59:10] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:12] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:16] "POST /api/projects/llm-proxy/start HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:21] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:24] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:25] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 18:59:28] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [12/Apr/2026 18:59:31] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:55] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:00:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:00:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:01:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:01:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:02:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:02:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:03:57] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:04:58] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:05:59] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:07:00] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:08:01] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:09:02] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:10:03] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:11:04] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:12:05] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:13:06] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:14:07] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:15:08] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:16:09] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:17:10] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:18:11] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:19:12] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:20:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:21:14] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:22:15] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:23:16] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:24:17] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:25:18] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:26:19] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:27:20] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:28:21] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:29:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:30:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:31:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:32:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:33:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:34:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:35:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:36:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:37:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:38:23] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:39:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:40:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:41:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:42:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:43:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:44:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:45:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:46:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:47:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:48:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:49:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:50:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:51:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:52:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:53:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:54:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:55:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:56:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:57:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:58:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:59:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:00:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:01:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:02:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:03:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:04:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:05:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:06:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 20:06:30] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:10:49] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:10:55] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:11:25] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:11:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:12:25] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:12:55] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:13:25] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:13:55] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:14:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:14:52] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:14:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:15:25] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:15:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:16:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:17:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:18:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:19:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 20:20:02] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:20:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:21:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:22:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:23:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:24:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:25:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:26:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:27:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:28:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:29:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:30:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:31:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:32:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:33:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:34:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:35:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:36:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:37:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:38:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:39:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 20:40:01] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:40:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:41:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:42:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:43:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:44:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:45:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:46:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:47:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:48:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:49:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:50:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:51:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:52:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:53:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:54:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:55:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:56:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:57:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:58:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:59:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 21:00:01] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:00:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:01:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:02:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:03:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:04:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:05:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:06:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:07:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:08:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:09:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:10:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:11:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:12:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:13:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:14:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:15:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 21:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 21:40:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 22:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 22:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 22:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 23:00:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 23:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 23:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 00:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 00:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 00:40:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 01:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 01:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 01:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 02:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 02:20:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 02:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 03:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 03:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 03:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 04:00:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 04:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 04:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 05:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 05:20:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 05:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 06:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 06:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 06:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 07:00:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 07:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 07:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 08:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 08:20:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 08:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 09:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 09:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 09:40:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:00:01] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:08:02] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:08:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:08:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:09:58] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:10:59] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:11:59] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:13:00] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:14:01] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:15:03] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:16:03] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:17:05] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:18:05] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:19:06] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:20:01] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:20:08] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:21:09] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:22:10] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:23:10] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:23:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:23:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:24:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:24:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:25:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:25:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:26:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:26:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:27:27] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:27:37] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:27:42] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:28:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:28:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:29:11] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:29:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:30:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:30:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:31:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:04] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:05] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:09] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:16] "POST /api/projects/xian-favor/start HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:41] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:33:06] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:33:11] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:33:12] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:33:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:34:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:34:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:35:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:35:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:43] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:49] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:37:19] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:37:30] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:37:47] "GET /api/projects HTTP/1.1" 200 -

3288
logs/llm-proxy.log Normal file

File diff suppressed because it is too large Load Diff

1587
logs/project-panel.log Normal file

File diff suppressed because it is too large Load Diff

87752
logs/snippet-notes.log Normal file

File diff suppressed because it is too large Load Diff

1550
logs/tech-forum.log Normal file

File diff suppressed because it is too large Load Diff

39
logs/xian-favor.log Normal file
View File

@@ -0,0 +1,39 @@
==================================================
[2026-04-13T10:32:16.459402] start
Command: xian_favor serve --port 19014
Directory: /home/xian/.openclaw/workspace-coder/works/xian-favor
🚀 启动API服务: http://0.0.0.0:19014
* Serving Flask app 'xian_favor.api'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:19014
* Running on http://192.168.2.17:19014
Press CTRL+C to quit
192.168.2.10 - - [13/Apr/2026 10:32:21] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:21] "GET /api/items?limit=100 HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:21] "GET /api/stats HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:32:26] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:32:41] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:33:11] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:33:12] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:33:43] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:34:13] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:34:43] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:35:13] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:35:43] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:36:13] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:36:43] "GET /api/health HTTP/1.1" 404 -
192.168.2.10 - - [13/Apr/2026 10:36:45] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:45] "GET /api/items?limit=100 HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:45] "GET /api/stats HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:49] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:49] "GET /api/items?limit=100 HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:49] "GET /api/stats HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:36:49] "GET /api/health HTTP/1.1" 404 -
192.168.2.10 - - [13/Apr/2026 10:37:02] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:37:02] "GET /api/items?limit=100 HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:37:02] "GET /api/stats HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:37:19] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:37:30] "GET / HTTP/1.1" 200 -

View File

@@ -51,38 +51,44 @@
"git_repo": "http://192.168.2.8:12007/coder/param-hub-python",
"version": "v1.2.0"
},
{
"id": "ai-chat-system",
"name": "AI对话系统",
"type": "web",
"ports": [19020],
"directory": "works/ai-chat",
"start_cmd": "python3 main.py",
"health_url": "http://localhost:19020/api/admin/stats",
"description": "网页端和Matrix端实时同步的AI聊天系统",
"admin_url": "http://localhost:19020/admin",
"git_repo": "http://192.168.2.8:12007/coder/ai-chat-system",
"version": "v1.0.0"
},
{
"id": "product-crawler",
"name": "产品参数爬取系统",
"type": "web",
"ports": [19011, 19012],
"ports": [19011],
"directory": "/home/xian/.openclaw/common/projects/product-crawler",
"start_cmd": "python3 app.py",
"start_cmds": {
"api": {"port": 19011, "cmd": "python3 app.py"},
"admin": {"port": 19012, "cmd": "cd admin && python3 app.py"}
},
"health_url": "http://localhost:19011/api/products",
"description": "自动从官网爬取产品参数信息",
"admin_url": "http://localhost:19011/admin",
"git_repo": "http://192.168.2.8:12007/coder/product-crawler",
"version": "v1.0.0"
"version": "v2.0.0"
},
{
"id": "llm-proxy",
"name": "LLM Proxy",
"type": "web",
"ports": [19007, 19008],
"ports": [19007],
"directory": "/home/xian/.openclaw/common/projects/llm-proxy",
"start_cmd": "python3 app.py",
"start_cmds": {
"api": {"port": 19007, "cmd": "python3 app.py"},
"admin": {"port": 19008, "cmd": "cd admin && python3 app.py"}
},
"health_url": "http://localhost:19007/health",
"description": "大模型API中转系统多提供商调度",
"admin_url": "http://localhost:19008",
"admin_url": "http://localhost:19007/admin",
"git_repo": "http://192.168.2.8:12007/coder/llm-proxy",
"version": "v0.5.1"
"version": "v2.0.0"
},
{
"id": "web-context-extension",
@@ -134,6 +140,45 @@
"description": "命令行PDF翻译工具",
"git_repo": null,
"version": "v1.0.0"
},
{
"id": "xian-favor",
"name": "Xian Favor 收藏系统",
"type": "web",
"ports": [19014],
"directory": "works/xian-favor",
"start_cmd": "xian_favor serve --port 19014",
"health_url": "http://localhost:19014/api/health",
"description": "文本笔记、链接收藏、待办事项管理系统",
"admin_url": "http://localhost:19014",
"git_repo": "http://192.168.2.8:12007/coder/xian-favor",
"version": "v1.0.0"
},
{
"id": "multi-agent-bidding",
"name": "多智能体竞标调度系统",
"type": "web",
"ports": [19015],
"directory": "works/multi-agent-bidding",
"start_cmd": "python3 -m app.app --port 19015",
"health_url": "http://localhost:19015/api/agents",
"description": "基于竞标机制的多智能体任务调度系统",
"admin_url": "http://localhost:19015",
"git_repo": "http://192.168.2.8:12007/coder/multi-agent-bidding",
"version": "v1.0.0"
},
{
"id": "tech-forum",
"name": "技术论坛",
"type": "web",
"ports": [19004],
"directory": "/home/xian/.openclaw/common/projects/tech-forum",
"start_cmd": "python3 backend/app.py",
"health_url": "http://localhost:19004/api/health",
"description": "技术交流、工具分享、问答讨论社区",
"admin_url": "http://localhost:19004/admin",
"git_repo": "http://192.168.2.8:12007/coder/tech-forum",
"version": "v1.2.0"
}
]
}