docs: 11 §5.7 System page, §5.8 Docker slow lane BUILT, §5.9 crash restart; 00/03/07/08; decisions 90-94 (CC unattended); runbooks docker-undo + crash-guard; register R-852 R-835 R-848 R-849 R-851 R-854 closed, R-853 R-855 R-856 opened, R-812 R-840 narrowed (334 -> 332); live evidence
gates / gates (push) Successful in 33s
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
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Hosts — Felhom Hub</title>
|
||||
<link rel="stylesheet" href="/style.css?v=0.132.0">
|
||||
</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 active">Hosts</a>
|
||||
<a href="/system" class="nav-link">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;">Hosts</h2>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section class="card" style="padding: 0; overflow: hidden;">
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Host</th>
|
||||
<th>Customer</th>
|
||||
<th>Agent</th>
|
||||
<th>Proxmox / kernel</th>
|
||||
<th>Status</th>
|
||||
<th>Guests</th>
|
||||
<th>CPU</th>
|
||||
<th>Mem</th>
|
||||
<th>Disk</th>
|
||||
<th>Cloudflared</th>
|
||||
<th>Worst Storage</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<tr onclick="window.location='/hosts/demo-felhom-8363b5'" style="cursor: pointer;">
|
||||
<td><a href="/hosts/demo-felhom-8363b5">demo-felhom-8363b5</a></td>
|
||||
<td>Demo Ügyfél</td>
|
||||
<td><code>0.142.0</code></td>
|
||||
<td style="font-size: 0.85em;">9.2.2<br><span class="text-muted">7.0.2-6-pve</span></td>
|
||||
<td><span class="status-badge status-badge-ok">ONLINE</span></td>
|
||||
<td>1/2</td>
|
||||
<td>0%</td>
|
||||
<td>17%</td>
|
||||
<td>29%</td>
|
||||
<td>running (connected)</td>
|
||||
<td>29% <span class="text-muted">local</span></td>
|
||||
</tr>
|
||||
|
||||
<tr onclick="window.location='/hosts/demo-hp-bb76ea'" style="cursor: pointer;">
|
||||
<td><a href="/hosts/demo-hp-bb76ea">demo-hp-bb76ea</a></td>
|
||||
<td>Demo HP</td>
|
||||
<td><code>0.142.0</code></td>
|
||||
<td style="font-size: 0.85em;">9.2.2<br><span class="text-muted">7.0.14-20-pve</span></td>
|
||||
<td><span class="status-badge status-badge-ok">ONLINE</span></td>
|
||||
<td>1/2</td>
|
||||
<td>16%</td>
|
||||
<td>19%</td>
|
||||
<td>51%</td>
|
||||
<td>running (connected)</td>
|
||||
<td>63% <span class="text-muted">local-lvm</span></td>
|
||||
</tr>
|
||||
|
||||
<tr onclick="window.location='/hosts/drill-r50-0a4f9a'" style="cursor: pointer;">
|
||||
<td><a href="/hosts/drill-r50-0a4f9a">drill-r50-0a4f9a</a></td>
|
||||
<td>drill-r50</td>
|
||||
<td><code>0.129.0</code> <span class="status-badge status-warn" title="held: agent 0.129.0 < MinAgent 0.131.0">floor held</span></td>
|
||||
<td style="font-size: 0.85em;">unknown<br><span class="text-muted">unknown</span></td>
|
||||
<td><span class="status-badge status-badge-down">DOWN</span></td>
|
||||
<td>1/1</td>
|
||||
<td>20%</td>
|
||||
<td>20%</td>
|
||||
<td>10%</td>
|
||||
<td>inactive</td>
|
||||
<td>10% <span class="text-muted">local</span></td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
|
||||
<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>
|
||||
@@ -0,0 +1,235 @@
|
||||
<!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>
|
||||
<h3>What ring 0 runs now</h3>
|
||||
<div class="rel-grid">
|
||||
|
||||
<div><strong>guest</strong>:
|
||||
0 packages, first seen 2026-10-04 14:14 UTC<br>
|
||||
<span class="text-muted">healthy for 10m0s of 24h0m0s</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>:
|
||||
<span class="text-muted">—</span><br>
|
||||
<span class="text-muted">a ring-0 box has not reported a Docker step</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>ring0-20261004T141237Z</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>ring0-20261004T141237Z</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>—</td>
|
||||
<td class="grp " title="last successful leg: 10 min ago">10 min ago · applied · 34 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-20261004T140947Z</td><td>78</td><td>0</td>
|
||||
<td>none</td><td>no</td><td>10 s</td><td>no</td>
|
||||
<td>0</td><td>armed</td>
|
||||
<td class="grp ">13.7</td>
|
||||
<td>ring0-20261004T140947Z</td><td>0</td><td>1</td>
|
||||
<td class="grp ">29.8.2</td>
|
||||
<td>2.3.6-1~debian.13~trixie</td><td>on</td><td>—</td>
|
||||
<td class="grp " title="last successful leg: 13 min ago">13 min ago · applied · 52 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>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
HTTP/1.1 303 See Other
|
||||
Location: /system?flash=approved+os-docker-20261004-142842
|
||||
+240
@@ -0,0 +1,240 @@
|
||||
<!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>
|
||||
<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>
|
||||
|
||||
|
||||
<form method="POST" action="/os/approve-docker" style="margin-top: 0.3rem;">
|
||||
<input type="hidden" name="_csrf" value=""><input type="hidden" name="return" value="/system">
|
||||
<button type="submit" class="btn btn-sm" data-confirm="Approve this Docker engine set? Ring-1 boxes take it only through a signed operator job.">Approve Docker set</button>
|
||||
</form>
|
||||
</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>ring0-20261004T142539Z</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>ring0-20261004T142539Z</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>ring0-20261004T142539Z</td>
|
||||
<td class="grp " title="last successful leg: 2 min ago">2 min ago · nothing · 13 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-20261004T142618Z</td><td>78</td><td>0</td>
|
||||
<td>none</td><td>no</td><td>10 s</td><td>no</td>
|
||||
<td>0</td><td>armed</td>
|
||||
<td class="grp ">13.7</td>
|
||||
<td>ring0-20261004T142618Z</td><td>0</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-20261004T142618Z</td>
|
||||
<td class="grp " title="last successful leg: 2 min ago">1 min ago · nothing · 17 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>
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
=== felhom-agent 0.142.0 selftest=os-update vmid=9201 ring=0 enabled=true guest-release=false host-release=false appliance=true ===
|
||||
time=2026-10-04T16:26:18.795+02:00 level=INFO msg="osupdate: START" run=20261004T142618Z layer=guest vmid=9201 ring=0 trigger=debug enabled=true release=ring0-20261004T142618Z
|
||||
time=2026-10-04T16:26:34.572+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: START release=ring0-20261004T142618Z layer=guest:9201 lane=fast mode=apply select=pending-fast packages=0"
|
||||
time=2026-10-04T16:26:34.572+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: REPAIR configured=0 fixed=0"
|
||||
time=2026-10-04T16:26:34.572+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=0 not-installed=0 from-snapshot=0"
|
||||
time=2026-10-04T16:26:34.572+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: DONE rc=0 seconds=0 upgraded=0 (nothing to do)"
|
||||
time=2026-10-04T16:26:34.574+02:00 level=INFO msg="osupdate: DONE" run=20261004T142618Z layer=guest vmid=9201 ring=0 trigger=debug outcome=nothing healthy=true reason="" upgraded=0 pending=0 not_covered=0 restart_needed=1 reboot_needed=false wrapper_seconds=15.7
|
||||
time=2026-10-04T16:26:34.583+02:00 level=INFO msg="osupdate: START" run=20261004T142618Z layer=host vmid=9201 ring=0 trigger=debug enabled=true release=ring0-20261004T142618Z
|
||||
time=2026-10-04T16:26:49.369+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: START release=ring0-20261004T142618Z layer=host lane=fast mode=apply select=pending-fast packages=0"
|
||||
time=2026-10-04T16:26:49.369+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: REPAIR configured=0 fixed=0"
|
||||
time=2026-10-04T16:26:49.369+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=0 not-installed=0 from-snapshot=0"
|
||||
time=2026-10-04T16:26:49.369+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: DONE rc=0 seconds=0 upgraded=0 (nothing to do)"
|
||||
time=2026-10-04T16:26:50.399+02:00 level=INFO msg="osupdate: DONE" run=20261004T142618Z layer=host vmid=9201 ring=0 trigger=debug outcome=nothing healthy=true reason="" upgraded=0 pending=78 not_covered=78 restart_needed=0 reboot_needed=false wrapper_seconds=14.7
|
||||
time=2026-10-04T16:26:52.343+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: LIVE-RESTORE already on"
|
||||
time=2026-10-04T16:26:52.343+02:00 level=INFO msg="osupdate: live-restore" vmid=9201 result="{\"result\": \"already on\"}"
|
||||
time=2026-10-04T16:26:52.343+02:00 level=INFO msg="osupdate: START" run=20261004T142618Z layer=docker vmid=9201 ring=0 trigger=debug enabled=true release=ring0-20261004T142618Z
|
||||
time=2026-10-04T16:27:09.714+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: START release=ring0-20261004T142618Z layer=docker:9201 lane=slow mode=apply select=pending-docker packages=0 authority=ring0"
|
||||
time=2026-10-04T16:27:09.715+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: REPAIR configured=0 fixed=0"
|
||||
time=2026-10-04T16:27:09.715+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=0 not-installed=0 from-snapshot=0"
|
||||
time=2026-10-04T16:27:09.715+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: DONE rc=0 seconds=0 upgraded=0 (nothing to do)"
|
||||
time=2026-10-04T16:27:09.716+02:00 level=INFO msg="osupdate: DONE" run=20261004T142618Z layer=docker vmid=9201 ring=0 trigger=debug outcome=nothing healthy=true reason="" upgraded=0 pending=0 not_covered=0 restart_needed=1 reboot_needed=false wrapper_seconds=17.3
|
||||
--- os-update report (guest) ---
|
||||
{
|
||||
"authority": "",
|
||||
"docker_engine": "",
|
||||
"health_reason": "",
|
||||
"healthy": true,
|
||||
"mode": "apply",
|
||||
"not_covered": null,
|
||||
"outcome": "nothing",
|
||||
"pending": 0,
|
||||
"reboot_needed": false,
|
||||
"refused": null,
|
||||
"release_id": "ring0-20261004T142618Z",
|
||||
"restart_needed": [
|
||||
"containerd-shim"
|
||||
],
|
||||
"ring": 0,
|
||||
"run_id": "20261004T142618Z",
|
||||
"upgraded": [],
|
||||
"wrapper_seconds": 15.7
|
||||
}
|
||||
--- os-update report (host) ---
|
||||
{
|
||||
"authority": "",
|
||||
"docker_engine": "",
|
||||
"health_reason": "",
|
||||
"healthy": true,
|
||||
"mode": "apply",
|
||||
"not_covered": [
|
||||
"frr",
|
||||
"shim-signed-common",
|
||||
"proxmox-secure-boot-support",
|
||||
"shim-unsigned",
|
||||
"shim-helpers-amd64-signed",
|
||||
"shim-signed",
|
||||
"amd64-microcode",
|
||||
"libradosstriper1",
|
||||
"librgw2",
|
||||
"ceph-common",
|
||||
"librbd1",
|
||||
"librados2",
|
||||
"python3-cephfs",
|
||||
"libcephfs2",
|
||||
"python3-rgw",
|
||||
"python3-rados",
|
||||
"python3-ceph-argparse",
|
||||
"python3-ceph-common",
|
||||
"python3-rbd",
|
||||
"ceph-fuse",
|
||||
"chrony",
|
||||
"libcorosync-common4",
|
||||
"libcfg7",
|
||||
"libcmap4",
|
||||
"libcpg4",
|
||||
"libknet1t64",
|
||||
"libnozzle1t64",
|
||||
"libquorum5",
|
||||
"libvotequorum8",
|
||||
"corosync",
|
||||
"frr-pythontools",
|
||||
"libjs-extjs",
|
||||
"libnvpair3linux",
|
||||
"libproxmox-acme-plugins",
|
||||
"libproxmox-backup-qemu0",
|
||||
"pve-qemu-kvm",
|
||||
"libpve-notify-perl",
|
||||
"libpve-cluster-api-perl",
|
||||
"libpve-cluster-perl",
|
||||
"pve-cluster",
|
||||
"libpve-access-control",
|
||||
"libpve-apiclient-perl",
|
||||
"librados2-perl",
|
||||
"proxmox-backup-client",
|
||||
"proxmox-backup-file-restore",
|
||||
"pve-manager",
|
||||
"libproxmox-acme-perl",
|
||||
"libpve-common-perl",
|
||||
"libpve-guest-common-perl",
|
||||
"qemu-server",
|
||||
"libpve-storage-perl",
|
||||
"pve-edk2-firmware-legacy",
|
||||
"pve-edk2-firmware-ovmf",
|
||||
"libpve-network-api-perl",
|
||||
"libpve-network-perl",
|
||||
"proxmox-firewall-data",
|
||||
"pve-firewall",
|
||||
"pve-container",
|
||||
"pve-ha-manager",
|
||||
"novnc-pve",
|
||||
"proxmox-enterprise-support-keyring",
|
||||
"proxmox-mini-journalreader",
|
||||
"proxmox-widget-toolkit",
|
||||
"pve-docs",
|
||||
"pve-i18n",
|
||||
"pve-xtermjs",
|
||||
"pve-yew-mobile-i18n",
|
||||
"pve-yew-mobile-gui",
|
||||
"libuutil3linux",
|
||||
"libzfs7linux",
|
||||
"libzpool7linux",
|
||||
"proxmox-kernel-helper",
|
||||
"pve-edk2-firmware-aarch64",
|
||||
"pve-edk2-firmware",
|
||||
"pve-firmware",
|
||||
"zfs-initramfs",
|
||||
"zfsutils-linux",
|
||||
"zfs-zed"
|
||||
],
|
||||
"outcome": "nothing",
|
||||
"pending": 78,
|
||||
"reboot_needed": false,
|
||||
"refused": null,
|
||||
"release_id": "ring0-20261004T142618Z",
|
||||
"restart_needed": [],
|
||||
"ring": 0,
|
||||
"run_id": "20261004T142618Z",
|
||||
"upgraded": [],
|
||||
"wrapper_seconds": 14.7
|
||||
}
|
||||
--- os-update report (docker) ---
|
||||
{
|
||||
"authority": "ring0",
|
||||
"docker_engine": "29.8.2",
|
||||
"health_reason": "",
|
||||
"healthy": true,
|
||||
"mode": "apply",
|
||||
"not_covered": null,
|
||||
"outcome": "nothing",
|
||||
"pending": 0,
|
||||
"reboot_needed": false,
|
||||
"refused": null,
|
||||
"release_id": "ring0-20261004T142618Z",
|
||||
"restart_needed": [
|
||||
"containerd-shim"
|
||||
],
|
||||
"ring": 0,
|
||||
"run_id": "20261004T142618Z",
|
||||
"upgraded": [],
|
||||
"wrapper_seconds": 17.3
|
||||
}
|
||||
pass took 50.9s
|
||||
WALL=51.005070963
|
||||
@@ -0,0 +1,218 @@
|
||||
=== felhom-agent 0.142.0 selftest=os-update vmid=9201 ring=0 enabled=true guest-release=false host-release=false appliance=true ===
|
||||
time=2026-10-04T16:25:39.774+02:00 level=INFO msg="osupdate: START" run=20261004T142539Z layer=guest vmid=9201 ring=0 trigger=debug enabled=true release=ring0-20261004T142539Z
|
||||
time=2026-10-04T16:25:52.120+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: START release=ring0-20261004T142539Z layer=guest:9201 lane=fast mode=apply select=pending-fast packages=0"
|
||||
time=2026-10-04T16:25:52.120+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: REPAIR configured=0 fixed=0"
|
||||
time=2026-10-04T16:25:52.120+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=0 not-installed=0 from-snapshot=0"
|
||||
time=2026-10-04T16:25:52.120+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: DONE rc=0 seconds=0 upgraded=0 (nothing to do)"
|
||||
time=2026-10-04T16:25:52.120+02:00 level=INFO msg="osupdate: DONE" run=20261004T142539Z layer=guest vmid=9201 ring=0 trigger=debug outcome=nothing healthy=true reason="" upgraded=0 pending=0 not_covered=0 restart_needed=10 reboot_needed=true wrapper_seconds=12.3
|
||||
time=2026-10-04T16:25:52.131+02:00 level=INFO msg="osupdate: START" run=20261004T142539Z layer=host vmid=9201 ring=0 trigger=debug enabled=true release=ring0-20261004T142539Z
|
||||
time=2026-10-04T16:26:02.540+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: START release=ring0-20261004T142539Z layer=host lane=fast mode=apply select=pending-fast packages=0"
|
||||
time=2026-10-04T16:26:02.540+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: REPAIR configured=0 fixed=0"
|
||||
time=2026-10-04T16:26:02.540+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=0 not-installed=0 from-snapshot=0"
|
||||
time=2026-10-04T16:26:02.540+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: DONE rc=0 seconds=0 upgraded=0 (nothing to do)"
|
||||
time=2026-10-04T16:26:03.376+02:00 level=INFO msg="osupdate: DONE" run=20261004T142539Z layer=host vmid=9201 ring=0 trigger=debug outcome=nothing healthy=true reason="" upgraded=0 pending=80 not_covered=80 restart_needed=34 reboot_needed=true wrapper_seconds=10.4
|
||||
time=2026-10-04T16:26:04.999+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: LIVE-RESTORE already on"
|
||||
time=2026-10-04T16:26:04.999+02:00 level=INFO msg="osupdate: live-restore" vmid=9201 result="{\"result\": \"already on\"}"
|
||||
time=2026-10-04T16:26:04.999+02:00 level=INFO msg="osupdate: START" run=20261004T142539Z layer=docker vmid=9201 ring=0 trigger=debug enabled=true release=ring0-20261004T142539Z
|
||||
time=2026-10-04T16:26:18.174+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: START release=ring0-20261004T142539Z layer=docker:9201 lane=slow mode=apply select=pending-docker packages=0 authority=ring0"
|
||||
time=2026-10-04T16:26:18.174+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: REPAIR configured=0 fixed=0"
|
||||
time=2026-10-04T16:26:18.174+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=0 not-installed=0 from-snapshot=0"
|
||||
time=2026-10-04T16:26:18.174+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: DONE rc=0 seconds=0 upgraded=0 (nothing to do)"
|
||||
time=2026-10-04T16:26:18.174+02:00 level=INFO msg="osupdate: DONE" run=20261004T142539Z layer=docker vmid=9201 ring=0 trigger=debug outcome=nothing healthy=true reason="" upgraded=0 pending=0 not_covered=0 restart_needed=10 reboot_needed=true wrapper_seconds=13.1
|
||||
--- os-update report (guest) ---
|
||||
{
|
||||
"authority": "",
|
||||
"docker_engine": "",
|
||||
"health_reason": "",
|
||||
"healthy": true,
|
||||
"mode": "apply",
|
||||
"not_covered": null,
|
||||
"outcome": "nothing",
|
||||
"pending": 0,
|
||||
"reboot_needed": true,
|
||||
"refused": null,
|
||||
"release_id": "ring0-20261004T142539Z",
|
||||
"restart_needed": [
|
||||
"agetty",
|
||||
"containerd-shim",
|
||||
"cron",
|
||||
"dbus-daemon",
|
||||
"dhclient",
|
||||
"sshd",
|
||||
"systemd",
|
||||
"systemd-journal",
|
||||
"systemd-logind",
|
||||
"systemd-network"
|
||||
],
|
||||
"ring": 0,
|
||||
"run_id": "20261004T142539Z",
|
||||
"upgraded": [],
|
||||
"wrapper_seconds": 12.3
|
||||
}
|
||||
--- os-update report (host) ---
|
||||
{
|
||||
"authority": "",
|
||||
"docker_engine": "",
|
||||
"health_reason": "",
|
||||
"healthy": true,
|
||||
"mode": "apply",
|
||||
"not_covered": [
|
||||
"frr",
|
||||
"shim-signed-common",
|
||||
"shim-unsigned",
|
||||
"shim-helpers-amd64-signed",
|
||||
"shim-signed",
|
||||
"libradosstriper1",
|
||||
"librgw2",
|
||||
"ceph-common",
|
||||
"librbd1",
|
||||
"librados2",
|
||||
"python3-cephfs",
|
||||
"libcephfs2",
|
||||
"python3-rgw",
|
||||
"python3-rados",
|
||||
"python3-ceph-argparse",
|
||||
"python3-ceph-common",
|
||||
"python3-rbd",
|
||||
"ceph-fuse",
|
||||
"chrony",
|
||||
"libcorosync-common4",
|
||||
"libcfg7",
|
||||
"libcmap4",
|
||||
"libcpg4",
|
||||
"libknet1t64",
|
||||
"libnozzle1t64",
|
||||
"libquorum5",
|
||||
"libvotequorum8",
|
||||
"corosync",
|
||||
"frr-pythontools",
|
||||
"libjs-extjs",
|
||||
"libnvpair3linux",
|
||||
"libproxmox-acme-plugins",
|
||||
"libproxmox-backup-qemu0",
|
||||
"pve-qemu-kvm",
|
||||
"libpve-notify-perl",
|
||||
"libpve-cluster-api-perl",
|
||||
"libpve-cluster-perl",
|
||||
"pve-cluster",
|
||||
"libpve-access-control",
|
||||
"libpve-apiclient-perl",
|
||||
"librados2-perl",
|
||||
"proxmox-backup-client",
|
||||
"proxmox-backup-file-restore",
|
||||
"pve-manager",
|
||||
"libproxmox-acme-perl",
|
||||
"libpve-common-perl",
|
||||
"libpve-guest-common-perl",
|
||||
"qemu-server",
|
||||
"libpve-storage-perl",
|
||||
"pve-edk2-firmware-legacy",
|
||||
"pve-edk2-firmware-ovmf",
|
||||
"libpve-network-api-perl",
|
||||
"libpve-network-perl",
|
||||
"proxmox-firewall-data",
|
||||
"pve-firewall",
|
||||
"pve-container",
|
||||
"pve-ha-manager",
|
||||
"novnc-pve",
|
||||
"proxmox-enterprise-support-keyring",
|
||||
"proxmox-mini-journalreader",
|
||||
"proxmox-widget-toolkit",
|
||||
"pve-docs",
|
||||
"pve-i18n",
|
||||
"pve-xtermjs",
|
||||
"pve-yew-mobile-i18n",
|
||||
"pve-yew-mobile-gui",
|
||||
"libuutil3linux",
|
||||
"libzfs7linux",
|
||||
"libzpool7linux",
|
||||
"proxmox-first-boot",
|
||||
"pve-firmware",
|
||||
"proxmox-kernel-7.0.14-20-pve-signed",
|
||||
"proxmox-kernel-7.0",
|
||||
"proxmox-kernel-helper",
|
||||
"pve-edk2-firmware-aarch64",
|
||||
"pve-edk2-firmware",
|
||||
"zfs-initramfs",
|
||||
"zfsutils-linux",
|
||||
"zfs-zed",
|
||||
"tailscale"
|
||||
],
|
||||
"outcome": "nothing",
|
||||
"pending": 80,
|
||||
"reboot_needed": true,
|
||||
"refused": null,
|
||||
"release_id": "ring0-20261004T142539Z",
|
||||
"restart_needed": [
|
||||
"agetty",
|
||||
"blkmapd",
|
||||
"chronyd",
|
||||
"cron",
|
||||
"dbus-daemon",
|
||||
"dmeventd",
|
||||
"ksmtuned",
|
||||
"lxc-monitord",
|
||||
"lxc-start",
|
||||
"lxcfs",
|
||||
"pmxcfs",
|
||||
"proxmox-firewal",
|
||||
"pve-firewall",
|
||||
"pve-ha-crm",
|
||||
"pve-ha-lrm",
|
||||
"pve-lxc-syscall",
|
||||
"pvedaemon",
|
||||
"pvedaemon worke",
|
||||
"pvefw-logger",
|
||||
"pveproxy",
|
||||
"pveproxy worker",
|
||||
"pvescheduler",
|
||||
"pvestatd",
|
||||
"qmeventd",
|
||||
"rpcbind",
|
||||
"rrdcached",
|
||||
"smartd",
|
||||
"spiceproxy",
|
||||
"spiceproxy work",
|
||||
"sshd",
|
||||
"systemd-logind",
|
||||
"systemd-udevd",
|
||||
"watchdog-mux",
|
||||
"zed"
|
||||
],
|
||||
"ring": 0,
|
||||
"run_id": "20261004T142539Z",
|
||||
"upgraded": [],
|
||||
"wrapper_seconds": 10.4
|
||||
}
|
||||
--- os-update report (docker) ---
|
||||
{
|
||||
"authority": "ring0",
|
||||
"docker_engine": "29.8.2",
|
||||
"health_reason": "",
|
||||
"healthy": true,
|
||||
"mode": "apply",
|
||||
"not_covered": null,
|
||||
"outcome": "nothing",
|
||||
"pending": 0,
|
||||
"reboot_needed": true,
|
||||
"refused": null,
|
||||
"release_id": "ring0-20261004T142539Z",
|
||||
"restart_needed": [
|
||||
"agetty",
|
||||
"containerd-shim",
|
||||
"cron",
|
||||
"dbus-daemon",
|
||||
"dhclient",
|
||||
"sshd",
|
||||
"systemd",
|
||||
"systemd-journal",
|
||||
"systemd-logind",
|
||||
"systemd-network"
|
||||
],
|
||||
"ring": 0,
|
||||
"run_id": "20261004T142539Z",
|
||||
"upgraded": [],
|
||||
"wrapper_seconds": 13.1
|
||||
}
|
||||
pass took 38.4s
|
||||
WALL=38.491768907
|
||||
@@ -0,0 +1 @@
|
||||
nonce=cb4a902da3007b8f4c3a440d3f2d9a60
|
||||
@@ -0,0 +1 @@
|
||||
{"release_id":"os-docker-20261004-142842","undo":false,"packages":[{"name":"containerd.io","version":"2.3.6-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-buildx-plugin","version":"0.37.1-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-ce","version":"5:29.8.2-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-ce-cli","version":"5:29.8.2-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-ce-rootless-extras","version":"5:29.8.2-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-compose-plugin","version":"5.6.0-1~debian.13~trixie","origin":"Docker CE"}]}
|
||||
@@ -0,0 +1,2 @@
|
||||
HTTP/1.1 303 See Other
|
||||
Location: /system?flash=done
|
||||
@@ -0,0 +1,11 @@
|
||||
=== felhom-agent 0.142.0 selftest=os-update vmid=9201 ring=1 enabled=true guest-release=true host-release=true appliance=true ===
|
||||
time=2026-10-04T16:42:05.041+02:00 level=INFO msg="osupdate: DONE" run=20261004T144154Z layer=guest vmid=9201 ring=1 trigger=debug outcome=nothing healthy=true reason="" upgraded=0 pending=0 not_covered=0 restart_needed=10 reboot_needed=true wrapper_seconds=10.6
|
||||
time=2026-10-04T16:42:15.090+02:00 level=INFO msg="osupdate: DONE" run=20261004T144154Z layer=host vmid=9201 ring=1 trigger=debug outcome=nothing healthy=true reason="" upgraded=0 pending=80 not_covered=80 restart_needed=34 reboot_needed=true wrapper_seconds=9.2
|
||||
time=2026-10-04T16:42:15.108+02:00 level=INFO msg="osupdate: docker step skipped — ring 1 takes an engine set only inside a signed operator job (`11` §5.8)" run=20261004T144154Z vmid=9201 trigger=debug ring=1 enabled=true
|
||||
docker step: skipped (see the log line above)
|
||||
containerd.io 2.3.6-1~debian.13~trixie
|
||||
docker-buildx-plugin 0.37.1-1~debian.13~trixie
|
||||
docker-ce 5:29.8.2-1~debian.13~trixie
|
||||
docker-ce-cli 5:29.8.2-1~debian.13~trixie
|
||||
docker-ce-rootless-extras 5:29.8.2-1~debian.13~trixie
|
||||
docker-compose-plugin 5.6.0-1~debian.13~trixie
|
||||
@@ -0,0 +1,2 @@
|
||||
signed: op=os_docker_step host=demo-felhom-8363b5 guest="" key_id=felhom-op-1 nonce=cb4a902da3007b8f4c3a440d3f2d9a60 expires=2026-10-04T15:27:25Z
|
||||
uploaded signed op to the hub jobs queue
|
||||
@@ -0,0 +1,7 @@
|
||||
time=2026-10-04T16:52:54.082+02:00 level=WARN msg="signedjobs: AUTHORIZED signed op — executing" job=b7956e7339bfda31 op=os_docker_step key_id=felhom-op-1 nonce=cb4a902da3007b8f4c3a440d3f2d9a60
|
||||
time=2026-10-04T16:52:55.697+02:00 level=INFO msg="osupdate: START" run=20261004T145254Z layer=docker vmid=9201 ring=1 trigger=signed enabled=true release=os-docker-20261004-142842
|
||||
time=2026-10-04T16:53:07.878+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: START release=os-docker-20261004-142842 layer=docker:9201 lane=slow mode=apply select=listed packages=6 authority=signed"
|
||||
time=2026-10-04T16:53:07.878+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=6 not-installed=0 from-snapshot=0"
|
||||
time=2026-10-04T16:53:07.878+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: DONE rc=0 seconds=0 upgraded=0 (nothing to do)"
|
||||
time=2026-10-04T16:53:07.879+02:00 level=INFO msg="osupdate: DONE" run=20261004T145254Z layer=docker vmid=9201 ring=1 trigger=signed outcome=nothing healthy=true reason="" upgraded=0 pending=0 not_covered=0 restart_needed=10 reboot_needed=true wrapper_seconds=
|
||||
time=2026-10-04T16:53:07.884+02:00 level=WARN msg="signedjobs: signed op COMPLETED" job=b7956e7339bfda31 op=os_docker_step
|
||||
@@ -0,0 +1,2 @@
|
||||
signed: op=os_docker_step host=demo-felhom-8363b5 guest="" key_id=felhom-op-1 nonce=cb4a902da3007b8f4c3a440d3f2d9a60 expires=2026-10-04T15:38:36Z
|
||||
uploaded signed op to the hub jobs queue
|
||||
@@ -0,0 +1,3 @@
|
||||
time=2026-10-04T16:52:54.082+02:00 level=WARN msg="signedjobs: AUTHORIZED signed op — executing" job=b7956e7339bfda31 op=os_docker_step key_id=felhom-op-1 nonce=cb4a902da3007b8f4c3a440d3f2d9a60
|
||||
time=2026-10-04T16:53:07.884+02:00 level=WARN msg="signedjobs: signed op COMPLETED" job=b7956e7339bfda31 op=os_docker_step
|
||||
time=2026-10-04T17:07:54.007+02:00 level=WARN msg="signedjobs: REJECTED signed op — executor not called" job=dec707a162451c5b op=os_docker_step reason=rejected err="authz: replay (nonce already seen): nonce cb4a902da3007b8f4c3a440d3f2d9a60"
|
||||
@@ -0,0 +1,2 @@
|
||||
HTTP/1.1 303 See Other
|
||||
Location: /system?flash=done
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
time=2026-10-04T16:39:43.360+02:00 level=INFO msg="audit: gate decision" class=os_docker_step host=demo-hp-bb76ea guest="" source=one_shot_job disposition=destructive allowed=true reason=signed key_id=felhom-op-1 nonce=f21cbf93… durable_id=""
|
||||
time=2026-10-04T16:39:43.360+02:00 level=INFO msg="gate decision" class=os_docker_step guest="" source=one_shot_job disposition=destructive allowed=true reason=signed
|
||||
time=2026-10-04T16:39:43.360+02:00 level=WARN msg="signedjobs: AUTHORIZED signed op — executing" job=c9f9efc098335bf9 op=os_docker_step key_id=felhom-op-1 nonce=f21cbf9302fb8b655b3ccf3e36f1cbea
|
||||
os-apply: LIVE-RESTORE already on
|
||||
time=2026-10-04T16:39:45.427+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: LIVE-RESTORE already on"
|
||||
time=2026-10-04T16:39:45.427+02:00 level=INFO msg="osupdate: START" run=20261004T143943Z layer=docker vmid=9201 ring=0 trigger=signed enabled=true release=undo-to-29.7.2
|
||||
os-apply: START release=undo-to-29.7.2 layer=docker:9201 lane=slow mode=apply select=listed packages=6 authority=signed UNDO
|
||||
os-apply: PLAN upgrade=6 already=0 not-installed=0 from-snapshot=0
|
||||
os-apply: DONE rc=0 seconds=16.7 upgraded=6 restart-needed=containerd-shim reboot-needed=no
|
||||
time=2026-10-04T16:40:26.840+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: START release=undo-to-29.7.2 layer=docker:9201 lane=slow mode=apply select=listed packages=6 authority=signed UNDO"
|
||||
time=2026-10-04T16:40:26.840+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=6 already=0 not-installed=0 from-snapshot=0"
|
||||
time=2026-10-04T16:40:26.840+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: DONE rc=0 seconds=16.7 upgraded=6 restart-needed=containerd-shim reboot-needed=no"
|
||||
time=2026-10-04T16:41:02.662+02:00 level=INFO msg="osupdate: DONE" run=20261004T143943Z layer=docker vmid=9201 ring=0 trigger=signed outcome=applied healthy=true reason="" upgraded=6 pending=6 not_covered=0 restart_needed=1 reboot_needed=false wrapper_seconds=41.3
|
||||
time=2026-10-04T16:41:02.716+02:00 level=WARN msg="signedjobs: signed op COMPLETED" job=c9f9efc098335bf9 op=os_docker_step
|
||||
IDS IDENTICAL (24 containers)
|
||||
after: engine=29.7.2 live=true
|
||||
@@ -0,0 +1,8 @@
|
||||
time=2026-10-04T16:42:55.380+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=0 not-installed=0 from-snapshot=0"
|
||||
guest nothing healthy=true
|
||||
time=2026-10-04T16:43:10.212+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=0 already=0 not-installed=0 from-snapshot=0"
|
||||
host nothing healthy=true
|
||||
time=2026-10-04T16:43:58.115+02:00 level=INFO msg="osupdate: wrapper" line="os-apply: PLAN upgrade=6 already=0 not-installed=0 from-snapshot=0"
|
||||
docker applied healthy=true
|
||||
IDS IDENTICAL (24 containers)
|
||||
engine=29.8.2
|
||||
@@ -0,0 +1 @@
|
||||
before: 24 containers engine=29.8.2
|
||||
@@ -0,0 +1 @@
|
||||
{"release_id":"undo-to-29.7.2","undo":true,"packages":[{"name":"containerd.io","version":"2.3.3-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-buildx-plugin","version":"0.36.1-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-ce","version":"5:29.7.2-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-ce-cli","version":"5:29.7.2-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-ce-rootless-extras","version":"5:29.7.2-1~debian.13~trixie","origin":"Docker CE"},{"name":"docker-compose-plugin","version":"5.5.0-1~debian.13~trixie","origin":"Docker CE"}]}
|
||||
@@ -0,0 +1,2 @@
|
||||
signed: op=os_docker_step host=demo-hp-bb76ea guest="" key_id=felhom-op-1 nonce=f21cbf9302fb8b655b3ccf3e36f1cbea expires=2026-10-04T15:15:26Z
|
||||
uploaded signed op to the hub jobs queue
|
||||
@@ -0,0 +1,29 @@
|
||||
== crash 1 issued 2026-10-04T14:51:28Z
|
||||
kernel.panic = 10
|
||||
0defc390-c295-4e9f-aa6e-13d69a1f24c3
|
||||
back: ping+ssh after 54s
|
||||
7.0.14-20-pve
|
||||
kernel.panic = 10
|
||||
{
|
||||
"armed": true,
|
||||
"boot_id": "cc0aa40b-ac53-4524-a46f-6c5983ce5ed9",
|
||||
"config": {
|
||||
"LIMIT": 3,
|
||||
"PANIC_SECONDS": 10,
|
||||
"REARM_HOURS": 24,
|
||||
"WINDOW_MINUTES": 60
|
||||
},
|
||||
"kernel_panic": 10,
|
||||
"last_boot_at": "2026-10-04T14:52:08Z",
|
||||
"last_boot_unclean": true,
|
||||
"tripped": false,
|
||||
"unclean_boots": [
|
||||
"2026-10-04T14:52:08Z"
|
||||
],
|
||||
"unclean_boots_24h": 1,
|
||||
"unclean_boots_in_window": 1,
|
||||
"updated_at": "2026-10-04T14:52:18Z",
|
||||
"version": 1
|
||||
}
|
||||
hub log since the boot:
|
||||
2026/10/04 16:52:57 [INFO] host-report from demo-hp-bb76ea (1 guests, 4 storage targets, 0 backups, 2 restore-tests, 2 pbs-snapshots, 13538 bytes)
|
||||
@@ -0,0 +1,33 @@
|
||||
== crash 2 issued 2026-10-04T14:53:36Z
|
||||
kernel.panic = 10
|
||||
cc0aa40b-ac53-4524-a46f-6c5983ce5ed9
|
||||
back: ping+ssh after 53s
|
||||
7.0.14-20-pve
|
||||
kernel.panic = 0
|
||||
{
|
||||
"armed": false,
|
||||
"boot_id": "53f69dfb-93ef-44c3-a9ad-803d86dfb0b3",
|
||||
"config": {
|
||||
"LIMIT": 3,
|
||||
"PANIC_SECONDS": 10,
|
||||
"REARM_HOURS": 24,
|
||||
"WINDOW_MINUTES": 60
|
||||
},
|
||||
"kernel_panic": 0,
|
||||
"last_boot_at": "2026-10-04T14:54:33Z",
|
||||
"last_boot_unclean": true,
|
||||
"tripped": true,
|
||||
"tripped_at": "2026-10-04T14:54:43Z",
|
||||
"tripped_reason": "2 unclean boots within 60 minutes \u2014 the next crash leaves the box off (limit 3)",
|
||||
"unclean_boots": [
|
||||
"2026-10-04T14:52:08Z",
|
||||
"2026-10-04T14:54:33Z"
|
||||
],
|
||||
"unclean_boots_24h": 2,
|
||||
"unclean_boots_in_window": 2,
|
||||
"updated_at": "2026-10-04T14:54:43Z",
|
||||
"version": 1
|
||||
}
|
||||
hub log since the boot:
|
||||
2026/10/04 16:52:57 [INFO] host-report from demo-hp-bb76ea (1 guests, 4 storage targets, 0 backups, 2 restore-tests, 2 pbs-snapshots, 13538 bytes)
|
||||
2026/10/04 16:54:53 [INFO] host-report from demo-hp-bb76ea (1 guests, 4 storage targets, 0 backups, 2 restore-tests, 2 pbs-snapshots, 13395 bytes)
|
||||
@@ -0,0 +1,4 @@
|
||||
== crash 3 issued 2026-10-04T14:55:13Z
|
||||
kernel.panic = 0
|
||||
53f69dfb-93ef-44c3-a9ad-803d86dfb0b3
|
||||
STAYED OFF for 184s (no ping)
|
||||
@@ -0,0 +1,29 @@
|
||||
== after the operator's power-on, ssh back 2026-10-04T15:17:41Z (27s after his word)
|
||||
7.0.14-20-pve
|
||||
kernel.panic = 0
|
||||
{
|
||||
"armed": false,
|
||||
"boot_id": "182af911-22a9-41ec-97ac-7ee247a4d470",
|
||||
"config": {
|
||||
"LIMIT": 3,
|
||||
"PANIC_SECONDS": 10,
|
||||
"REARM_HOURS": 24,
|
||||
"WINDOW_MINUTES": 60
|
||||
},
|
||||
"kernel_panic": 0,
|
||||
"last_boot_at": "2026-10-04T15:17:26Z",
|
||||
"last_boot_unclean": true,
|
||||
"tripped": true,
|
||||
"tripped_at": "2026-10-04T14:54:43Z",
|
||||
"tripped_reason": "2 unclean boots within 60 minutes \u2014 the next crash leaves the box off (limit 3)",
|
||||
"unclean_boots": [
|
||||
"2026-10-04T14:52:08Z",
|
||||
"2026-10-04T14:54:33Z",
|
||||
"2026-10-04T15:17:26Z"
|
||||
],
|
||||
"unclean_boots_24h": 3,
|
||||
"unclean_boots_in_window": 3,
|
||||
"updated_at": "2026-10-04T15:17:36Z",
|
||||
"version": 1
|
||||
}
|
||||
status: stopped
|
||||
@@ -0,0 +1,12 @@
|
||||
2026/10/04 17:21:00 [INFO] Operator email sent for demo-hp/app_start_failed
|
||||
2026/10/04 17:26:30 [INFO] Operator email sent for demo-hp/app_stopped_unhealthy
|
||||
2026/10/04 17:26:30 [INFO] Customer email sent to drill@felhom.eu for demo-hp/app_stopped_unhealthy
|
||||
2026/10/04 17:32:52 [WARN] host demo-hp-bb76ea crash guard: host_crash_restart
|
||||
2026/10/04 17:32:52 [WARN] host demo-hp-bb76ea crash guard: host_restarted_after_crash
|
||||
2026/10/04 17:32:52 [WARN] host demo-hp-bb76ea crash guard: host_crash_restart
|
||||
2026/10/04 17:32:52 [WARN] host demo-hp-bb76ea crash guard: host_restarted_after_crash
|
||||
2026/10/04 17:32:52 [WARN] host demo-hp-bb76ea crash guard: host_crash_restart
|
||||
2026/10/04 17:32:52 [WARN] host demo-hp-bb76ea crash guard: host_restarted_after_crash
|
||||
2026/10/04 17:32:52 [WARN] host demo-hp-bb76ea crash guard: host_crash_guard_tripped
|
||||
2026/10/04 17:32:52 [INFO] Operator email sent for demo-hp/host_crash_restart
|
||||
2026/10/04 17:32:52 [INFO] Operator email sent for demo-hp/host_crash_guard_tripped
|
||||
@@ -0,0 +1,240 @@
|
||||
<!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>
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
crash-guard: RE-ARMED by operator (was tripped: True); kernel.panic=10
|
||||
kernel.panic = 10
|
||||
{'armed': True, 'tripped': False, 'rearmed_at': '2026-10-04T15:33:25Z', 'rearmed_by': 'operator', 'unclean_boots_in_window': 0, 'unclean_boots_24h': 3, 'last_trip': {'at': '2026-10-04T14:54:43Z', 'reason': '2 unclean boots within 60 minutes — the next crash leaves the box off (limit 3)'}}
|
||||
Reference in New Issue
Block a user