0c55336fba
gates / gates (push) Successful in 33s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
241 lines
18 KiB
HTML
241 lines
18 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>System — Felhom Hub</title>
|
|
<link rel="stylesheet" href="/style.css?v=0.132.0">
|
|
<style>
|
|
.sys td, .sys th { white-space: nowrap; font-size: 0.82em; vertical-align: top; }
|
|
.sys .grp { border-left: 2px solid var(--border, #444); }
|
|
.c-warn { color: var(--warn); font-weight: 600; }
|
|
.c-bad { color: var(--danger, #e5534b); font-weight: 700; }
|
|
.sys form { display: inline; }
|
|
.rel-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: 0.75rem; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<svg xmlns="http://www.w3.org/2000/svg" style="display:none" aria-hidden="true">
|
|
<symbol id="i-triangle-alert" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" /> <path d="M12 9v4" /> <path d="M12 17h.01" /></symbol>
|
|
<symbol id="i-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5" /></symbol>
|
|
<symbol id="i-server" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="8" x="2" y="2" rx="2" ry="2" /> <rect width="20" height="8" x="2" y="14" rx="2" ry="2" /> <line x1="6" x2="6.01" y1="6" y2="6" /> <line x1="6" x2="6.01" y1="18" y2="18" /></symbol>
|
|
<symbol id="i-settings" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915" /> <circle cx="12" cy="12" r="3" /></symbol>
|
|
<symbol id="i-x" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18" /> <path d="m6 6 12 12" /></symbol>
|
|
<symbol id="i-info" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /> <path d="M12 16v-4" /> <path d="M12 8h.01" /></symbol>
|
|
<symbol id="i-hard-drive" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 16h.01" /> <path d="M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z" /> <path d="M21.946 12.013H2.054" /> <path d="M6 16h.01" /></symbol>
|
|
<symbol id="i-cpu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20v2" /> <path d="M12 2v2" /> <path d="M17 20v2" /> <path d="M17 2v2" /> <path d="M2 12h2" /> <path d="M2 17h2" /> <path d="M2 7h2" /> <path d="M20 12h2" /> <path d="M20 17h2" /> <path d="M20 7h2" /> <path d="M7 20v2" /> <path d="M7 2v2" /> <rect x="4" y="4" width="16" height="16" rx="2" /> <rect x="8" y="8" width="8" height="8" rx="1" /></symbol>
|
|
<symbol id="i-clock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /> <path d="M12 6v6l4 2" /></symbol>
|
|
<symbol id="i-boxes" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z" /> <path d="m7 16.5-4.74-2.85" /> <path d="m7 16.5 5-3" /> <path d="M7 16.5v5.17" /> <path d="M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z" /> <path d="m17 16.5-5-3" /> <path d="m17 16.5 4.74-2.85" /> <path d="M17 16.5v5.17" /> <path d="M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z" /> <path d="M12 8 7.26 5.15" /> <path d="m12 8 4.74-2.85" /> <path d="M12 13.5V8" /></symbol>
|
|
<symbol id="i-users" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" /> <path d="M16 3.128a4 4 0 0 1 0 7.744" /> <path d="M22 21v-2a4 4 0 0 0-3-3.87" /> <circle cx="9" cy="7" r="4" /></symbol>
|
|
</svg>
|
|
|
|
<script>
|
|
|
|
|
|
function felhomConfirm(el,question,onYes){
|
|
if(!el||el.dataset.fcOpen)return;
|
|
el.dataset.fcOpen='1';
|
|
var wrap=document.createElement('span');wrap.className='inline-confirm';
|
|
var q=document.createElement('span');q.className='inline-confirm-q';q.textContent=question;
|
|
var yes=document.createElement('button');yes.type='button';yes.className='btn btn-sm btn-danger';yes.textContent='Igen';
|
|
var no=document.createElement('button');no.type='button';no.className='btn btn-sm btn-outline';no.textContent='Mégse';
|
|
wrap.appendChild(q);wrap.appendChild(yes);wrap.appendChild(no);
|
|
el.style.display='none';el.parentNode.insertBefore(wrap,el.nextSibling);
|
|
function close(){wrap.remove();el.style.display='';delete el.dataset.fcOpen;}
|
|
no.addEventListener('click',close);
|
|
yes.addEventListener('click',function(){close();onYes();});
|
|
}
|
|
document.addEventListener('click',function(e){
|
|
var btn=e.target.closest?e.target.closest('[data-confirm]'):null;
|
|
if(!btn)return;
|
|
e.preventDefault();
|
|
felhomConfirm(btn,btn.getAttribute('data-confirm'),function(){
|
|
var form=btn.closest('form');
|
|
if(form){if(form.requestSubmit)form.requestSubmit(btn);else form.submit();}
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<div class="container">
|
|
<header>
|
|
<h1>Felhom <span>Hub</span></h1>
|
|
<nav class="nav-links">
|
|
<a href="/" class="nav-link">Dashboard</a>
|
|
<a href="/configs" class="nav-link">Customers</a>
|
|
<a href="/apps" class="nav-link">Apps</a>
|
|
<a href="/hosts" class="nav-link">Hosts</a>
|
|
<a href="/system" class="nav-link active">System</a>
|
|
<a href="/offsite" class="nav-link">Offsite</a>
|
|
<a href="/configuration" class="nav-link">Configuration</a>
|
|
</nav>
|
|
</header>
|
|
|
|
<h2 style="margin-bottom: 1rem;">System — versions and OS updates</h2>
|
|
|
|
|
|
|
|
|
|
<section class="card" style="margin-bottom: 1.5rem;">
|
|
<h3 style="margin-top: 0;">Approved releases</h3>
|
|
<div class="rel-grid">
|
|
|
|
<div><strong>guest</strong>: <code>os-guest-20261004-123933</code><br>
|
|
<span class="text-muted">272 packages · 2026-10-04 12:39 UTC · by auto</span></div>
|
|
|
|
<div><strong>host</strong>: <code>os-host-20261004-124133</code><br>
|
|
<span class="text-muted">607 packages · 2026-10-04 12:41 UTC · by auto</span></div>
|
|
|
|
<div><strong>docker</strong>: <code>os-docker-20261004-142842</code><br>
|
|
<span class="text-muted">6 packages · 2026-10-04 14:28 UTC · by operator</span></div>
|
|
|
|
</div>
|
|
<h3>What ring 0 runs now</h3>
|
|
<div class="rel-grid">
|
|
|
|
<div><strong>guest</strong>:
|
|
272 packages, first seen 2026-10-04 11:07 UTC<br>
|
|
<span class="text-muted">approved as os-guest-20261004-123933</span>
|
|
|
|
|
|
</div>
|
|
|
|
<div><strong>host</strong>:
|
|
607 packages, first seen 2026-10-04 12:24 UTC<br>
|
|
<span class="text-muted">approved as os-host-20261004-124133</span>
|
|
|
|
|
|
</div>
|
|
|
|
<div><strong>docker</strong>:
|
|
6 packages, first seen 2026-10-04 14:28 UTC<br>
|
|
<span class="text-muted">approved as os-docker-20261004-142842</span>
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
<form method="POST" action="/os/approve-now" style="margin-top: 0.8rem;">
|
|
<input type="hidden" name="_csrf" value=""><input type="hidden" name="return" value="/system">
|
|
<button type="submit" class="btn btn-sm btn-danger" data-confirm="Approve the guest and host sets ring 0 runs NOW, without the 24 h + 1 night wait? Every ring-1 box installs them at its next night run.">Approve now (guest + host)</button>
|
|
<span class="text-muted" style="font-size: 0.85em;">An urgent fix only — normally the hub approves after 24 h and one night.</span>
|
|
</form>
|
|
</section>
|
|
|
|
|
|
<section class="card" style="padding: 0; overflow-x: auto;">
|
|
<table class="data-table sys">
|
|
<thead>
|
|
<tr>
|
|
<th>Box</th><th>Ring / updates</th><th>Tunnel</th>
|
|
<th class="grp">Proxmox</th><th>Kernel (running)</th><th>Kernel (next boot)</th><th>Debian</th><th>Felhom release</th><th>Pending</th><th>Not covered</th><th>Held</th><th>Reboot needed</th><th>kernel.panic</th><th>Oops</th><th>Crash restarts 24 h</th><th>Crash guard</th>
|
|
<th class="grp">Guest Debian</th><th>Felhom release</th><th>Pending</th><th>Restart needed</th>
|
|
<th class="grp">Docker</th><th>containerd</th><th>live-restore</th><th>Docker release</th>
|
|
<th class="grp">Last OS leg</th>
|
|
</tr>
|
|
<tr class="text-muted"><th></th><th></th><th></th><th class="grp" colspan="13">host</th><th class="grp" colspan="4">guest</th><th class="grp" colspan="4">Docker engine</th><th class="grp"></th></tr>
|
|
</thead>
|
|
<tbody>
|
|
|
|
<tr>
|
|
<td><a href="/hosts/demo-felhom-8363b5">demo-felhom-8363b5</a><br><span class="text-muted">Demo Ügyfél</span>
|
|
</td>
|
|
<td>
|
|
ring 0
|
|
<form method="POST" action="/os/ring/demo-felhom-8363b5">
|
|
<input type="hidden" name="_csrf" value=""><input type="hidden" name="return" value="/system">
|
|
<input type="hidden" name="ring" value="1"><button type="submit" class="btn btn-sm btn-outline" data-confirm="Make demo-felhom-8363b5 a normal (ring 1) box? It then installs only approved releases.">→ normal</button>
|
|
|
|
</form><br>
|
|
updates <strong>ON</strong>
|
|
<form method="POST" action="/os/enabled/demo-felhom-8363b5">
|
|
<input type="hidden" name="_csrf" value=""><input type="hidden" name="return" value="/system">
|
|
<input type="hidden" name="on" value="0"><button type="submit" class="btn btn-sm btn-outline" data-confirm="Switch OS updates OFF for demo-felhom-8363b5? It keeps reporting and installs nothing.">switch off</button>
|
|
|
|
</form>
|
|
</td>
|
|
<td>running</td>
|
|
<td class="grp ">9.2.2</td>
|
|
<td>7.0.2-6-pve</td><td>7.0.2-6-pve</td><td>13.7</td>
|
|
<td>os-host-20261004-124133</td><td>80</td><td>0</td>
|
|
<td>none</td><td class="c-warn">since 2026-10-04</td><td>10 s</td><td>no</td>
|
|
<td>0</td><td>armed</td>
|
|
<td class="grp ">13.7</td>
|
|
<td>os-guest-20261004-123933</td><td>0</td><td>10</td>
|
|
<td class="grp ">29.8.2</td>
|
|
<td>2.3.6-1~debian.13~trixie</td><td>on</td><td>os-docker-20261004-142842</td>
|
|
<td class="grp " title="last successful leg: 51 min ago">40 min ago · nothing · 12 s</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="/hosts/demo-hp-bb76ea">demo-hp-bb76ea</a><br><span class="text-muted">Demo HP</span>
|
|
</td>
|
|
<td>
|
|
ring 0
|
|
<form method="POST" action="/os/ring/demo-hp-bb76ea">
|
|
<input type="hidden" name="_csrf" value=""><input type="hidden" name="return" value="/system">
|
|
<input type="hidden" name="ring" value="1"><button type="submit" class="btn btn-sm btn-outline" data-confirm="Make demo-hp-bb76ea a normal (ring 1) box? It then installs only approved releases.">→ normal</button>
|
|
|
|
</form><br>
|
|
updates <strong>ON</strong>
|
|
<form method="POST" action="/os/enabled/demo-hp-bb76ea">
|
|
<input type="hidden" name="_csrf" value=""><input type="hidden" name="return" value="/system">
|
|
<input type="hidden" name="on" value="0"><button type="submit" class="btn btn-sm btn-outline" data-confirm="Switch OS updates OFF for demo-hp-bb76ea? It keeps reporting and installs nothing.">switch off</button>
|
|
|
|
</form>
|
|
</td>
|
|
<td>running</td>
|
|
<td class="grp ">9.2.2</td>
|
|
<td>7.0.14-20-pve</td><td>7.0.14-20-pve</td><td>13.7</td>
|
|
<td>ring0-20261004T144238Z</td><td>78</td><td>0</td>
|
|
<td>none</td><td>no</td><td class="c-warn">0 (stays off)</td><td>no</td>
|
|
<td class="c-warn">3</td><td class="c-bad" title="2 unclean boots within 60 minutes — the next crash leaves the box off (limit 3)">TRIPPED 2026-10-04T14:54:43Z</td>
|
|
<td class="grp ">13.7</td>
|
|
<td>ring0-20261004T144238Z</td><td>6</td><td>1</td>
|
|
<td class="grp ">29.8.2</td>
|
|
<td>2.3.6-1~debian.13~trixie</td><td>on</td><td>ring0-20261004T144238Z</td>
|
|
<td class="grp " title="last successful leg: 50 min ago">48 min ago · applied · 45 s</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="/hosts/drill-r50-0a4f9a">drill-r50-0a4f9a</a><br><span class="text-muted">drill-r50</span>
|
|
<br><span class="c-warn" style="font-weight: normal;">no versions reported (agent older than v0.142.0)</span></td>
|
|
<td>
|
|
ring 1
|
|
<form method="POST" action="/os/ring/drill-r50-0a4f9a">
|
|
<input type="hidden" name="_csrf" value=""><input type="hidden" name="return" value="/system">
|
|
<input type="hidden" name="ring" value="0"><button type="submit" class="btn btn-sm btn-outline" data-confirm="Make drill-r50-0a4f9a a DEMO (ring 0) box? It then installs every new fix first and takes unsigned Docker steps if its root-owned ring-0 mark allows.">→ demo</button>
|
|
</form><br>
|
|
updates <strong>ON</strong>
|
|
<form method="POST" action="/os/enabled/drill-r50-0a4f9a">
|
|
<input type="hidden" name="_csrf" value=""><input type="hidden" name="return" value="/system">
|
|
<input type="hidden" name="on" value="0"><button type="submit" class="btn btn-sm btn-outline" data-confirm="Switch OS updates OFF for drill-r50-0a4f9a? It keeps reporting and installs nothing.">switch off</button>
|
|
|
|
</form>
|
|
</td>
|
|
<td class="c-bad">inactive</td>
|
|
<td class="grp c-warn">unknown</td>
|
|
<td class="c-warn" title="the box could not read it (agent older than v0.142.0, or the guest is down)">unknown</td><td class="c-warn" title="the box could not read it (agent older than v0.142.0, or the guest is down)">unknown</td><td class="c-warn" title="the box could not read it (agent older than v0.142.0, or the guest is down)">unknown</td>
|
|
<td>—</td><td>0</td><td>0</td>
|
|
<td class="c-warn" title="the box could not read it (agent older than v0.142.0, or the guest is down)">unknown</td><td>no</td><td class="c-warn" title="the box could not read it (agent older than v0.142.0, or the guest is down)">unknown</td><td>no</td>
|
|
<td class="c-warn" title="the box could not read it (agent older than v0.142.0, or the guest is down)">unknown</td><td class="c-warn">not installed</td>
|
|
<td class="grp c-warn">unknown</td>
|
|
<td>—</td><td>0</td><td>0</td>
|
|
<td class="grp c-warn">unknown</td>
|
|
<td class="c-warn" title="the box could not read it (agent older than v0.142.0, or the guest is down)">unknown</td><td class="c-warn" title="the box could not read it (agent older than v0.142.0, or the guest is down)">unknown</td><td>—</td>
|
|
<td class="grp " title="last successful leg: never">never · — · 0 s</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
</section>
|
|
<p class="text-muted" style="font-size: 0.85em;">Amber: worth a look. Red: an operator alarm fires (`08` §6.3). "unknown": the box could not read the value — never a guess.</p>
|
|
|
|
|
|
<footer style="margin-top: 2rem; color: var(--text-muted); font-size: 0.8rem; text-align: center;">
|
|
Felhom Hub <span style="font-family: var(--font-mono)">0.132.0</span>
|
|
</footer>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
|