Add admin container restart controls
All checks were successful
Build & Push Docker Image to Gitea Registry / build-and-push (push) Successful in 12s
All checks were successful
Build & Push Docker Image to Gitea Registry / build-and-push (push) Successful in 12s
This commit is contained in:
46
admin.js
46
admin.js
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user