- Détection de version via l'API Gitea, application via Watchtower - Router système, UI admin (intégrations), bandeau de mise à jour - Dockerfile multi-étapes, docker-compose, scripts/release.sh - Version centralisée dans app/version.py (pyproject ou OHM_VERSION au build)
68 lines
2.1 KiB
JavaScript
68 lines
2.1 KiB
JavaScript
/* Surveille la disponibilité du serveur et détecte les changements de version.
|
|
* Pendant une mise à jour Docker (quelques secondes d'indisponibilité), affiche
|
|
* un bandeau « Mise à jour en cours » puis recharge la page automatiquement
|
|
* quand le service revient avec une nouvelle version.
|
|
* Un serveur qui RÉPOND est considéré comme disponible (même 404 : instance
|
|
* antérieure à l'endpoint /api/version) — seul un échec réseau (connexion
|
|
* refusée, timeout) signifie « en cours de redémarrage ». */
|
|
(() => {
|
|
const POLL_MS = 8000;
|
|
const KEY_UPDATING = 'ohm-updating';
|
|
|
|
let initialVersion = null;
|
|
let failures = 0;
|
|
let banner = null;
|
|
let done = false;
|
|
|
|
const isUpdating = () => sessionStorage.getItem(KEY_UPDATING) === '1';
|
|
|
|
function showBanner() {
|
|
if (banner) return;
|
|
banner = document.createElement('div');
|
|
banner.className = 'update-banner';
|
|
banner.innerHTML = '<span class="spin">⟳</span> Mise à jour en cours — reconnexion automatique…';
|
|
document.body.appendChild(banner);
|
|
}
|
|
|
|
function hideBanner() {
|
|
if (banner) banner.remove();
|
|
banner = null;
|
|
}
|
|
|
|
async function poll() {
|
|
if (document.hidden || done) return;
|
|
let version = null;
|
|
let up = false;
|
|
try {
|
|
const r = await fetch('/api/version', { cache: 'no-store' });
|
|
up = true; // le serveur a répondu : il est vivant
|
|
if (r.ok) version = (await r.json()).version ?? null;
|
|
} catch {
|
|
up = false; // connexion refusée / réseau coupé : serveur injoignable
|
|
}
|
|
|
|
if (!up) {
|
|
failures += 1;
|
|
if (isUpdating() || failures >= 2) showBanner();
|
|
return;
|
|
}
|
|
|
|
failures = 0;
|
|
hideBanner();
|
|
if (version !== null && initialVersion === null) initialVersion = version;
|
|
if (isUpdating() || (version !== null && version !== initialVersion)) {
|
|
done = true;
|
|
sessionStorage.removeItem(KEY_UPDATING);
|
|
setTimeout(() => location.reload(), 1000); // laisser le serveur finir de démarrer
|
|
}
|
|
}
|
|
|
|
document.addEventListener('visibilitychange', () => {
|
|
if (!document.hidden) poll();
|
|
});
|
|
|
|
if (isUpdating()) showBanner();
|
|
poll();
|
|
setInterval(poll, POLL_MS);
|
|
})();
|