Je gère actuellement deux forums Discourse distincts, chacun hébergé sur sa propre instance Scaleway, et je les mets à jour comme suit :
# Mettre à jour l'installation Docker de Discourse
cd /var/discourse
git pull origin master
# Reconstruire Discourse
/var/discourse/launcher rebuild app
Cela entraîne l’arrêt du forum pendant environ 5 à 15 minutes à chaque fois.
L’un des sites est derrière le proxy Cloudflare, ce qui permet de servir son cache hors ligne sans problème. Mais l’autre ne utilise pas Cloudflare.
Je me demande si Discourse pourrait exporter un site statique contenant uniquement, par exemple, les fils de discussion publics pour un utilisateur anonyme, avec les boutons d’interaction désactivés et une bannière en haut indiquant : « Ce site web est actuellement en mode lecture seule car il est en cours de mise à niveau. », puis servir ce site pendant la mise à jour du forum, et une fois le forum de nouveau en ligne, supprimer le cache statique.
Si le DNS est géré par Cloudflare (même sans utiliser le proxy), il se met généralement à jour en quelques secondes. Pendant cette mise à jour, vous pouvez pointer le domaine vers un autre serveur (comme une page de maintenance sur Netlify/Vercel/Firebase/Surge/etc., où tous les chemins redirigent vers un fichier index.html).
Je ne l’ai pas encore testé, mais il pourrait être possible de servir temporairement un autre backend en utilisant resolveOverride dans un Cloudflare Worker (fonction « serverless »).
Oui, qu’il s’agisse d’un changement DNS ou du démarrage d’un conteneur Docker temporaire nginx écoutant sur le même port pour servir quelque chose, c’est la partie facile.
Pour l’instant, la partie la plus difficile consiste à produire une exportation statique avec l’interactivité désactivée et une bannière ajoutée, en respectant les pages des sujets, des messages, des catégories et de l’index (la recherche peut être désactivée). Ensuite, il faudra intégrer ce remplacement dans le processus de mise à niveau, ce qui devrait être assez simple.
Une recherche sur les forums concernant l’exportation statique ne semble pas vraiment montrer que cela existe. J’ai déjà créé un client API Discourse pour un projet précédent, donc je pourrais coder quelque chose qui n’émule pas le design actuel, je suppose.
Un autre facteur à prendre en compte pour servir une exportation statique dans ce but serait de s’assurer que les pages statiques ne sont pas mises en cache par les navigateurs ni par les moteurs de recherche.
Si vous exécutez une installation à deux conteneurs, les temps d’arrêt sont inférieurs à une minute. Ou, si vous êtes prêt à utiliser un équilibreur de charge, vous pouvez les réduire à zéro. C’est plus simple que ce que vous décrivez.
Renseignez-vous également sur SKIP_POST_DEPLOYMENT_MIGRATIONS=1. En bref, vous définissez cette variable lors de la reconstruction du conteneur bed pour éviter qu’il n’endommage la base de données de l’instance existante, puis vous effectuez à nouveau la migration sans cette variable une fois que la nouvelle instance est opérationnelle.