Mise à jour automatique (Gitea + Watchtower) et conteneurisation Docker
- 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)
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
/* 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);
|
||||
})();
|
||||
Reference in New Issue
Block a user