Add admin container restart controls
All checks were successful
Build & Push Docker Image to Gitea Registry / build-and-push (push) Successful in 12s

This commit is contained in:
Kroonk
2026-05-21 16:40:52 +02:00
parent ea52f223cd
commit 10ad368214
4 changed files with 232 additions and 5 deletions

View File

@@ -25,6 +25,7 @@ const containerStatus = document.querySelector('#containerStatus');
let config = null;
let tokenSet = null;
let opsRefreshTimer = null;
function base64UrlEncode(buffer) {
return btoa(String.fromCharCode(...new Uint8Array(buffer)))
@@ -353,11 +354,54 @@ function renderContainers(containers) {
.sort((a, b) => important.indexOf(a.name) - important.indexOf(b.name));
containerStatus.innerHTML = rows.map((container) => `
<div class="ops-line">
<div class="ops-line container-line" data-container="${container.name}">
<strong>${container.name}</strong>
<span>${container.status}</span>
<button class="ghost-button mini restart-container" type="button" ${container.restartable ? '' : 'disabled'}>
Neustarten
</button>
</div>
`).join('');
containerStatus.querySelectorAll('.restart-container').forEach((button) => {
button.addEventListener('click', () => restartContainer(button.closest('.container-line')));
});
}
async function restartContainer(row) {
const name = row?.dataset.container;
if (!name) return;
const confirmed = window.confirm(`${name} jetzt neu starten? Der Dienst ist kurz nicht erreichbar.`);
if (!confirmed) return;
const button = row.querySelector('.restart-container');
const status = row.querySelector('span');
const previousText = status.textContent;
button.disabled = true;
status.textContent = 'Neustart laeuft...';
try {
const response = await fetch(`/api/containers/${encodeURIComponent(name)}/restart`, {
method: 'POST',
headers: {
Authorization: `Bearer ${tokenSet.id_token}`
}
});
const payload = await response.json().catch(() => ({}));
if (!response.ok) throw new Error(payload.error || `HTTP ${response.status}`);
status.textContent = `Neugestartet um ${new Date(payload.restartedAt).toLocaleTimeString('de-DE')}`;
window.clearTimeout(opsRefreshTimer);
opsRefreshTimer = window.setTimeout(refreshOps, 3500);
} catch (error) {
status.textContent = `Neustart fehlgeschlagen: ${error.message}`;
button.disabled = false;
window.setTimeout(() => {
status.textContent = previousText;
}, 6000);
}
}
async function refreshOps() {