Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c320066b63 | |||
| 854b6b6f82 | |||
| 6d8410ac28 |
168
app.py
168
app.py
@@ -1,8 +1,8 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
项目服务管理面板 v2.1.0
|
||||
项目服务管理面板 v2.2.0
|
||||
端口: 19013
|
||||
修复: 后台链接使用 externalIp 替代 localhost
|
||||
新增: Web服务卡片添加自定义链接入口(+按钮)
|
||||
"""
|
||||
|
||||
import os
|
||||
@@ -1218,6 +1218,48 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 自定义链接模态框 -->
|
||||
<div id="linkModal" class="modal-overlay hidden">
|
||||
<div class="card rounded-xl modal-content p-6">
|
||||
<div class="flex items-center justify-between mb-4">
|
||||
<h3 id="linkModalTitle" class="font-bold text-lg">添加自定义链接</h3>
|
||||
<button onclick="closeLinkModal()" class="text-gray-400 hover:text-white"><i class="ri-close-line text-xl"></i></button>
|
||||
</div>
|
||||
|
||||
<form id="linkForm" onsubmit="saveCustomLink(event)">
|
||||
<input type="hidden" id="linkProjectId">
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="block text-gray-400 text-sm mb-1">链接名称 *</label>
|
||||
<input type="text" id="linkName" required class="w-full bg-gray-700 text-gray-200 px-3 py-2 rounded-lg" placeholder="例如:API文档、管理后台">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="block text-gray-400 text-sm mb-1">端口(使用统一IP)</label>
|
||||
<input type="text" id="linkPort" class="w-full bg-gray-700 text-gray-200 px-3 py-2 rounded-lg" placeholder="例如:19001" onchange="updateLinkPreview()">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="block text-gray-400 text-sm mb-1">路径(可选)</label>
|
||||
<input type="text" id="linkPath" class="w-full bg-gray-700 text-gray-200 px-3 py-2 rounded-lg" placeholder="例如:/admin /api/docs" onchange="updateLinkPreview()">
|
||||
<p id="linkPreview" class="text-sm text-cyan-400 mt-1"></p>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<label class="block text-gray-400 text-sm mb-1">完整URL(不填则用端口生成)</label>
|
||||
<input type="text" id="linkFullUrl" class="w-full bg-gray-700 text-gray-200 px-3 py-2 rounded-lg" placeholder="例如:http://192.168.2.17:19000/docs">
|
||||
</div>
|
||||
|
||||
<div id="existingLinks" class="mb-4"></div>
|
||||
|
||||
<div class="flex justify-end gap-2">
|
||||
<button type="button" onclick="closeLinkModal()" class="btn bg-gray-600 hover:bg-gray-700 px-4 py-2 rounded-lg">取消</button>
|
||||
<button type="submit" class="btn bg-green-600 hover:bg-green-700 px-4 py-2 rounded-lg">添加</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 导航按钮 -->
|
||||
<div class="nav-buttons">
|
||||
<button onclick="scrollToTop()" class="nav-btn" title="回到顶部"><i class="ri-arrow-up-line"></i></button>
|
||||
@@ -1365,6 +1407,9 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
|
||||
adminUrl = adminUrl.replace(/localhost/g, externalIp);
|
||||
}
|
||||
|
||||
// 获取自定义链接
|
||||
const customLinks = getCustomLinks(p.id);
|
||||
|
||||
return `
|
||||
<div class="card rounded-lg p-3 hover:border-gray-500 transition-colors">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
@@ -1375,13 +1420,15 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
|
||||
<span class="text-xs ${statusInfo.textColor}">${statusInfo.text}</span>
|
||||
</div>
|
||||
${p.ports && p.ports.length > 0 ? `
|
||||
<div class="flex items-center gap-1 text-xs mb-2">
|
||||
<div class="flex items-center gap-1 text-xs mb-2 flex-wrap">
|
||||
${p.ports.map(port => {
|
||||
const portStatus = p.status?.ports?.[port];
|
||||
const isRunning = portStatus?.running;
|
||||
return `<a href="http://${externalIp}:${port}" target="_blank" class="px-2 py-0.5 rounded ${isRunning ? 'bg-green-500/20 text-green-400 hover:bg-green-500/30' : 'bg-red-500/20 text-red-400'}">${port}</a>`;
|
||||
}).join('')}
|
||||
${adminUrl ? `<a href="${adminUrl}" target="_blank" class="text-yellow-400 hover:text-yellow-300 ml-1">后台</a>` : ''}
|
||||
${customLinks.map(link => `<a href="${link.url}" target="_blank" class="text-cyan-400 hover:text-cyan-300 ml-1">${link.name}</a>`).join('')}
|
||||
<button onclick="showAddLinkModal('${p.id}', '${p.name}')" class="text-green-400 hover:text-green-300 ml-1" title="添加自定义链接"><i class="ri-add-line"></i></button>
|
||||
</div>
|
||||
` : ''}
|
||||
${p.type === 'web' ? `
|
||||
@@ -1401,6 +1448,121 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
// ==================== 自定义链接管理 ====================
|
||||
|
||||
function getCustomLinks(projectId) {
|
||||
const stored = localStorage.getItem('customLinks_' + projectId);
|
||||
return stored ? JSON.parse(stored) : [];
|
||||
}
|
||||
|
||||
function saveCustomLinks(projectId, links) {
|
||||
localStorage.setItem('customLinks_' + projectId, JSON.stringify(links));
|
||||
}
|
||||
|
||||
function showAddLinkModal(projectId, projectName) {
|
||||
document.getElementById('linkModalTitle').textContent = `${projectName} - 添加链接`;
|
||||
document.getElementById('linkProjectId').value = projectId;
|
||||
document.getElementById('linkName').value = '';
|
||||
document.getElementById('linkPort').value = '';
|
||||
document.getElementById('linkPath').value = '';
|
||||
document.getElementById('linkFullUrl').value = '';
|
||||
document.getElementById('linkModal').classList.remove('hidden');
|
||||
|
||||
// 显示已有的自定义链接(供删除)
|
||||
const existingLinks = getCustomLinks(projectId);
|
||||
const existingList = document.getElementById('existingLinks');
|
||||
if (existingLinks.length > 0) {
|
||||
existingList.innerHTML = '<div class="text-gray-400 text-sm mb-2">已有链接:</div>' +
|
||||
existingLinks.map(link => `
|
||||
<div class="flex items-center justify-between bg-gray-700 px-2 py-1 rounded mb-1">
|
||||
<span class="text-cyan-400 text-sm">${link.name}: ${link.url}</span>
|
||||
<button onclick="deleteCustomLink('${projectId}', '${link.id}')" class="text-red-400 hover:text-red-300"><i class="ri-delete-bin-line"></i></button>
|
||||
</div>
|
||||
`).join('');
|
||||
} else {
|
||||
existingList.innerHTML = '';
|
||||
}
|
||||
}
|
||||
|
||||
function closeLinkModal() {
|
||||
document.getElementById('linkModal').classList.add('hidden');
|
||||
}
|
||||
|
||||
function saveCustomLink(event) {
|
||||
event.preventDefault();
|
||||
|
||||
const projectId = document.getElementById('linkProjectId').value;
|
||||
const name = document.getElementById('linkName').value.trim();
|
||||
const port = document.getElementById('linkPort').value.trim();
|
||||
const path = document.getElementById('linkPath').value.trim();
|
||||
const fullUrl = document.getElementById('linkFullUrl').value.trim();
|
||||
|
||||
if (!name) {
|
||||
alert('请输入链接名称');
|
||||
return;
|
||||
}
|
||||
|
||||
let url;
|
||||
if (fullUrl) {
|
||||
url = fullUrl;
|
||||
} else if (port) {
|
||||
url = `http://${externalIp}:${port}${path || ''}`;
|
||||
} else {
|
||||
alert('请输入端口或完整URL');
|
||||
return;
|
||||
}
|
||||
|
||||
const links = getCustomLinks(projectId);
|
||||
const newLink = {
|
||||
id: Date.now().toString(),
|
||||
name: name,
|
||||
url: url
|
||||
};
|
||||
links.push(newLink);
|
||||
saveCustomLinks(projectId, links);
|
||||
|
||||
closeLinkModal();
|
||||
renderProjects();
|
||||
}
|
||||
|
||||
function deleteCustomLink(projectId, linkId) {
|
||||
if (!confirm('确定删除此链接?')) return;
|
||||
|
||||
const links = getCustomLinks(projectId);
|
||||
const filtered = links.filter(l => l.id !== linkId);
|
||||
saveCustomLinks(projectId, filtered);
|
||||
|
||||
// 更新模态框中的显示
|
||||
const existingLinks = getCustomLinks(projectId);
|
||||
const existingList = document.getElementById('existingLinks');
|
||||
if (existingLinks.length > 0) {
|
||||
existingList.innerHTML = '<div class="text-gray-400 text-sm mb-2">已有链接:</div>' +
|
||||
existingLinks.map(link => `
|
||||
<div class="flex items-center justify-between bg-gray-700 px-2 py-1 rounded mb-1">
|
||||
<span class="text-cyan-400 text-sm">${link.name}: ${link.url}</span>
|
||||
<button onclick="deleteCustomLink('${projectId}', '${link.id}')" class="text-red-400 hover:text-red-300"><i class="ri-delete-bin-line"></i></button>
|
||||
</div>
|
||||
`).join('');
|
||||
} else {
|
||||
existingList.innerHTML = '<div class="text-gray-500 text-sm">暂无自定义链接</div>';
|
||||
}
|
||||
|
||||
renderProjects();
|
||||
}
|
||||
|
||||
// 自动生成URL预览
|
||||
function updateLinkPreview() {
|
||||
const port = document.getElementById('linkPort').value.trim();
|
||||
const path = document.getElementById('linkPath').value.trim();
|
||||
const preview = document.getElementById('linkPreview');
|
||||
|
||||
if (port) {
|
||||
preview.textContent = `预览: http://${externalIp}:${port}${path || ''}`;
|
||||
} else {
|
||||
preview.textContent = '';
|
||||
}
|
||||
}
|
||||
|
||||
function getStatusInfo(status) {
|
||||
const map = {
|
||||
|
||||
12
cron_backups/crontab_20260420_163055.txt
Normal file
12
cron_backups/crontab_20260420_163055.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
*/30 * * * * openclaw agent --agent zuitoushang --message '执行下心跳任务' >> /home/xian/.openclaw/workspace-zuitoushang/works/heartbeat_logs/$(date +\%Y-\%m-\%d_\%H:\%M:\%S).log 2>&1
|
||||
0 * * * * /usr/bin/python3 /home/xian/.copaw/workspaces/default/active_skills/system-monitor/scripts/monitor.py --alert >> /home/xian/.copaw/workspaces/default/works/system-monitor.log 2>&1
|
||||
0 * * * * /home/xian/.openclaw/workspace-zuitoushang/scripts/cleanup-chrome-zombies.sh
|
||||
0 3 * * * /home/xian/.nvm/versions/node/v24.14.0/bin/node /home/xian/.openclaw/workspace-zuitoushang/scripts/daily-summary.js >> /home/xian/.openclaw/workspace-zuitoushang/works/daily-summary.log 2>&1
|
||||
0 * * * * /usr/bin/python3 /home/xian/.openclaw/workspace-zuitoushang/scripts/cpu-monitor.py >> /home/xian/.openclaw/workspace-zuitoushang/works/cpu-monitor.log 2>&1
|
||||
0 8-22 * * * /usr/bin/python3 /home/xian/.openclaw/workspace-zuitoushang/scripts/disk-monitor.py >> /home/xian/.openclaw/workspace-zuitoushang/works/disk-monitor.log 2>&1
|
||||
*/20 * * * * /usr/bin/python3 /home/xian/.openclaw/workspace-coder/works/service-monitor/monitor.py >> /home/xian/.openclaw/workspace-coder/works/service-monitor/monitor.log 2>&1
|
||||
0 17 * * 1-5 /usr/bin/python3 /home/xian/.openclaw/workspace-coder/works/board-monitor/board_monitor.py report >> /home/xian/.openclaw/workspace-coder/works/board-monitor/report.log 2>&1
|
||||
0 17 * * 1-5 /usr/bin/python3 /home/xian/.openclaw/common/stock_system/cron_daily_fetch.py >> /home/xian/.openclaw/common/stock_system/logs/daily_fetch.log 2>&1
|
||||
0 4 * * * /home/xian/.openclaw/workspace-coder/works/xian-favor/scripts/auto_backup.py >> /tmp/xian-favor-backup.log 2>&1
|
||||
0 12 * * * cd /home/xian/.openclaw/workspace-laoli && /home/xian/.openclaw/workspace-laoli/works/send_coder_stats.sh
|
||||
10 3 * * * openclaw agent --agent zuitoushang --message '总结并记忆昨天和你的会话内容' >> /home/xian/.openclaw/workspace-zuitoushang/works/daily-memory/$(date +\%Y-\%m-\%d).log 2>&1
|
||||
12
cron_backups/crontab_20260420_163242.txt
Normal file
12
cron_backups/crontab_20260420_163242.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
*/30 * * * * openclaw agent --agent zuitoushang --message '执行下心跳任务' >> /home/xian/.openclaw/workspace-zuitoushang/works/heartbeat_logs/$(date +\%Y-\%m-\%d_\%H:\%M:\%S).log 2>&1
|
||||
0 * * * * /usr/bin/python3 /home/xian/.copaw/workspaces/default/active_skills/system-monitor/scripts/monitor.py --alert >> /home/xian/.copaw/workspaces/default/works/system-monitor.log 2>&1
|
||||
0 * * * * /home/xian/.openclaw/workspace-zuitoushang/scripts/cleanup-chrome-zombies.sh
|
||||
0 3 * * * /home/xian/.nvm/versions/node/v24.14.0/bin/node /home/xian/.openclaw/workspace-zuitoushang/scripts/daily-summary.js >> /home/xian/.openclaw/workspace-zuitoushang/works/daily-summary.log 2>&1
|
||||
0 * * * * /usr/bin/python3 /home/xian/.openclaw/workspace-zuitoushang/scripts/cpu-monitor.py >> /home/xian/.openclaw/workspace-zuitoushang/works/cpu-monitor.log 2>&1
|
||||
0 8-22 * * * /usr/bin/python3 /home/xian/.openclaw/workspace-zuitoushang/scripts/disk-monitor.py >> /home/xian/.openclaw/workspace-zuitoushang/works/disk-monitor.log 2>&1
|
||||
*/20 * * * * /usr/bin/python3 /home/xian/.openclaw/workspace-coder/works/service-monitor/monitor.py >> /home/xian/.openclaw/workspace-coder/works/service-monitor/monitor.log 2>&1
|
||||
0 17 * * 1-5 /usr/bin/python3 /home/xian/.openclaw/workspace-coder/works/board-monitor/board_monitor.py report >> /home/xian/.openclaw/workspace-coder/works/board-monitor/report.log 2>&1
|
||||
0 17 * * 1-5 /usr/bin/python3 /home/xian/.openclaw/common/stock_system/cron_daily_fetch.py >> /home/xian/.openclaw/common/stock_system/logs/daily_fetch.log 2>&1
|
||||
0 4 * * * /home/xian/.openclaw/workspace-coder/works/xian-favor/scripts/auto_backup.py >> /tmp/xian-favor-backup.log 2>&1
|
||||
0 12 * * * cd /home/xian/.openclaw/workspace-laoli && /home/xian/.openclaw/workspace-laoli/works/send_coder_stats.sh
|
||||
10 3 * * * openclaw agent --agent zuitoushang --message '总结并记忆昨天和你的会话内容' >> /home/xian/.openclaw/workspace-zuitoushang/works/daily-memory/$(date +\%Y-\%m-\%d).log 2>&1
|
||||
BIN
cron_manager.db
Normal file
BIN
cron_manager.db
Normal file
Binary file not shown.
165
logs/app.log
165
logs/app.log
@@ -1,8 +1,8 @@
|
||||
[2026-04-20 12:09:27] ==================================================
|
||||
[2026-04-20 12:09:27] 项目服务管理面板启动
|
||||
[2026-04-20 12:09:27] 访问地址: http://localhost:19013
|
||||
[2026-04-20 12:09:27] 进程PID: 3701577
|
||||
[2026-04-20 12:09:27] ==================================================
|
||||
[2026-04-20 12:33:54] ==================================================
|
||||
[2026-04-20 12:33:54] 项目服务管理面板 v2.0.0 启动
|
||||
[2026-04-20 12:33:54] 访问地址: http://localhost:19013
|
||||
[2026-04-20 12:33:54] 进程PID: 3711750
|
||||
[2026-04-20 12:33:54] ==================================================
|
||||
* 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.
|
||||
@@ -10,95 +10,66 @@ WARNING: This is a development server. Do not use it in a production deployment.
|
||||
* Running on http://127.0.0.1:19013
|
||||
* Running on http://192.168.2.17:19013
|
||||
Press CTRL+C to quit
|
||||
127.0.0.1 - - [20/Apr/2026 12:09:30] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:09:32] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:09:35] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:09:36] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:09:37] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:09:38] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:09:46] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:09:48] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:09:53] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:09:55] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:09:56] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:09:58] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:06] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:08] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:16] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:18] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:23] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:25] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:26] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:28] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:30] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:10:32] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:35] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:10:36] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:37] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:38] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:47] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:47] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:48] "GET /api/crons HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:48] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:51] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:52] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:54] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:55] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:10:57] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:10:58] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:01] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:02] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:07] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:08] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:11] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:12] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:16] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:18] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:21] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:22] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:24] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:25] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:25] "GET / HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:27] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:27] "GET /api/projects HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:28] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:30] "GET / HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:31] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:11:32] "GET /api/projects HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:32] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:35] "GET / HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:37] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:11:37] "GET /api/projects HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:38] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:41] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:42] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:47] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:48] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:51] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:52] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:54] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:55] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:55] "GET / HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:11:57] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:57] "GET /api/projects HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:11:58] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:01] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:12:02] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:07] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:12:08] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:11] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:12:12] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:16] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:12:18] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:21] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:12:22] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:23] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:12:25] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:26] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:12:28] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:31] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:12:32] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:35] "GET / HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:12:36] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:12:37] "GET /api/projects HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:12:38] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:33:58] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:33:59] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:08] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:34:09] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:18] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:34:19] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:24] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:34:26] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:28] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:34:29] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:30] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:34:32] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:35] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:34:37] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:38] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:34:39] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:48] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:34:49] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:54] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:34:56] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:34:58] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:34:59] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:35:08] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:35:09] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:35:18] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:35:19] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:35:24] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:35:26] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:35:28] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.8 - - [20/Apr/2026 12:35:29] "GET /api/projects HTTP/1.1" 200 -
|
||||
127.0.0.1 - - [20/Apr/2026 12:35:30] "GET / HTTP/1.1" 200 -
|
||||
192.168.2.10 - - [20/Apr/2026 12:35:32] "GET /api/projects HTTP/1.1" 200 -
|
||||
[2026-04-20 12:35:32] ⚠️ 进程收到 SIGTERM 信号,即将退出!
|
||||
[2026-04-20 16:25:05] ==================================================
|
||||
[2026-04-20 16:25:05] 项目服务管理面板 v2.0.0 启动
|
||||
[2026-04-20 16:25:05] 访问地址: http://localhost:19013
|
||||
[2026-04-20 16:25:05] 进程PID: 3729863
|
||||
[2026-04-20 16:25:05] ==================================================
|
||||
[2026-04-20 16:29:02] 从系统 crontab 同步了 12 个任务
|
||||
[2026-04-20 16:30:55] 更新 Cron 任务 ID=1: 版本 1
|
||||
[2026-04-20 16:32:42] 更新 Cron 任务 ID=11: 版本 1
|
||||
[2026-04-20 21:28:14] ⚠️ 进程收到 SIGTERM 信号,即将退出!
|
||||
[2026-04-20 22:08:29] ==================================================
|
||||
[2026-04-20 22:08:29] 项目服务管理面板 v2.0.0 启动
|
||||
[2026-04-20 22:08:29] 访问地址: http://localhost:19013
|
||||
[2026-04-20 22:08:29] 进程PID: 3871388
|
||||
[2026-04-20 22:08:29] ==================================================
|
||||
[2026-04-20 23:20:05] ⚠️ 进程收到 SIGTERM 信号,即将退出!
|
||||
[2026-04-20 23:20:06] ==================================================
|
||||
[2026-04-20 23:20:06] 项目服务管理面板 v2.0.0 启动
|
||||
[2026-04-20 23:20:06] 访问地址: http://localhost:19013
|
||||
[2026-04-20 23:20:06] 进程PID: 3894049
|
||||
[2026-04-20 23:20:06] ==================================================
|
||||
[2026-04-21 15:44:37] ==================================================
|
||||
[2026-04-21 15:44:37] 项目服务管理面板 v2.0.0 启动
|
||||
[2026-04-21 15:44:37] 访问地址: http://localhost:19013
|
||||
[2026-04-21 15:44:37] 进程PID: 66363
|
||||
[2026-04-21 15:44:37] ==================================================
|
||||
[2026-04-21 19:00:30] ==================================================
|
||||
[2026-04-21 19:00:30] 项目服务管理面板 v2.0.0 启动
|
||||
[2026-04-21 19:00:30] 访问地址: http://localhost:19013
|
||||
[2026-04-21 19:00:30] 进程PID: 120669
|
||||
[2026-04-21 19:00:30] ==================================================
|
||||
|
||||
@@ -4268,3 +4268,15 @@ Directory: /home/xian/.openclaw/common/projects/llm-proxy
|
||||
Command: mkdir -p logs && nohup python3 app.py > logs/app.log 2>&1 & disown
|
||||
Directory: /home/xian/.openclaw/common/projects/llm-proxy
|
||||
/bin/sh: 1: disown: not found
|
||||
|
||||
==================================================
|
||||
[2026-04-20T23:12:09.500932] start
|
||||
Command: mkdir -p logs && nohup python3 app.py > logs/app.log 2>&1 & disown
|
||||
Directory: /home/xian/.openclaw/common/projects/llm-proxy
|
||||
/bin/sh: 1: disown: not found
|
||||
|
||||
==================================================
|
||||
[2026-04-21T15:45:11.327216] start
|
||||
Command: mkdir -p logs && nohup python3 app.py > logs/app.log 2>&1 & disown
|
||||
Directory: /home/xian/.openclaw/common/projects/llm-proxy
|
||||
/bin/sh: 1: disown: not found
|
||||
|
||||
18
logs/param-hub.log
Normal file
18
logs/param-hub.log
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
==================================================
|
||||
[2026-04-20T18:18:18.605305] start
|
||||
Command: mkdir -p logs && nohup python3 app.py > logs/app.log 2>&1 & disown
|
||||
Directory: /home/xian/.openclaw/workspace-coder/works/param-hub-python
|
||||
/bin/sh: 1: disown: not found
|
||||
|
||||
==================================================
|
||||
[2026-04-20T23:12:13.392896] start
|
||||
Command: mkdir -p logs && nohup python3 app.py > logs/app.log 2>&1 & disown
|
||||
Directory: /home/xian/.openclaw/workspace-coder/works/param-hub-python
|
||||
/bin/sh: 1: disown: not found
|
||||
|
||||
==================================================
|
||||
[2026-04-21T15:45:15.735387] start
|
||||
Command: mkdir -p logs && nohup python3 app.py > logs/app.log 2>&1 & disown
|
||||
Directory: /home/xian/.openclaw/workspace-coder/works/param-hub-python
|
||||
/bin/sh: 1: disown: not found
|
||||
@@ -73,3 +73,9 @@ Directory: /home/xian/.openclaw/workspace-coder/works/xian-favor
|
||||
Command: mkdir -p logs && nohup xian_favor serve --port 19014 > logs/app.log 2>&1 & disown
|
||||
Directory: /home/xian/.openclaw/workspace-coder/works/xian-favor
|
||||
/bin/sh: 1: disown: not found
|
||||
|
||||
==================================================
|
||||
[2026-04-20T23:12:18.766216] start
|
||||
Command: mkdir -p logs && nohup python3 -c "from xian_favor.api import start_server; start_server(port=19014)" > logs/app.log 2>&1 & disown
|
||||
Directory: /home/xian/.openclaw/workspace-coder/works/xian-favor
|
||||
/bin/sh: 1: disown: not found
|
||||
|
||||
@@ -192,6 +192,30 @@
|
||||
"admin_url": "http://localhost:19004/admin",
|
||||
"git_repo": "http://192.168.2.8:12007/coder/tech-forum",
|
||||
"version": "v1.2.0"
|
||||
},
|
||||
{
|
||||
"id": "image-editor",
|
||||
"name": "图片编辑器",
|
||||
"type": "web",
|
||||
"ports": [19018],
|
||||
"directory": "works/image-editor",
|
||||
"start_cmd": "mkdir -p logs && nohup python3 app.py > logs/app.log 2>&1 & disown",
|
||||
"health_url": "http://localhost:19018/api/health",
|
||||
"description": "前端图片处理:合并、分割、挖孔、圆形切图、文字图片",
|
||||
"git_repo": "http://192.168.2.8:12007/coder/image-editor",
|
||||
"version": "v1.2.1"
|
||||
},
|
||||
{
|
||||
"id": "voice-chat-web",
|
||||
"name": "语音对话网页",
|
||||
"type": "web",
|
||||
"ports": [19019],
|
||||
"directory": "works/voice-chat-web",
|
||||
"start_cmd": "mkdir -p logs && MODEL_SERVICE_URL=http://192.168.2.5:12001 nohup python3 main.py > logs/server.log 2>&1 & disown",
|
||||
"health_url": "http://localhost:19019/api/status",
|
||||
"description": "基于Qwen2-Audio的语音交互网页,支持录音和文字对话",
|
||||
"git_repo": "http://192.168.2.8:12007/coder/voice-chat-web",
|
||||
"version": "v1.2.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user