Amélioration du CMS : le mode maintenance
Un site peut être indisponible pendant une certaine période, par exemple lors d’une mise à jour ou de l’application d’un correctif. Une solution possible serait la mise en place d’une déviation dans le proxy pointant vers une page de maintenance. Cette manière de travailler demande une modification du proxy, ce qui peut avoir une incidence sur les autres sites du serveur.
Il est préférable d’utiliser un mode maintenance, activable depuis les paramètres du CMS et pointant vers une page facilement éditable. Dans ce cas de figure, le mode de maintenance existant du CMS Apostrophe ne fonctionnait pas dans notre configuration.
Une option de maintenance a donc du être implémentée, activable depuis l'interface d'administration et qui pointe sur une page éditable à loisir dans le CMS. Les visiteurs ne consultent ainsi que la page de maintenance, les utilisateurs conservant l’accès à la totalité du site.
Réalisation
Ajouter un module ou utiliser global ?
Le module concernant la totalité du site, il était plus judicieux de l'ajouter au module global. Le module global est commun à l'ensemble du site et est accessible à l'ensemble des modules du CMS. Pour ajouter du contenu à global, nous avons créé un répertoire global dans src/modules/@apostrophecms et placé un index.js de configuration.
module.exports = {
fields: {
add: {
maintenance: {
label: "Maintenance mode",
type: 'object',
fields: {
add: {
activateMaintenance: {
label: 'Activate maintenance mode',
type: 'boolean',
def: false,
},
}
}
},
}
}
}
Le CMS lit cette configuration, l'ajoute au module global existant et crée une entrée dans l'interface d'administration avec les champs indiqués. Dans ce cas, un simple booléen est suffisant pour indiquer l'activation.
Affichage de la page de maintenance
L’’option d'activation de maintenance ayant été mise en place, cette page devait s’afficher uniquement lors de son activation. Dans notre cas, le CMS était en mode headless et ne gérait donc pas l’affichage. Nous avons modifié le routeur utilisé par Astro pour afficher la bonne page. Ce routeur détermine si le site est en mode maintenance et le cas échéant affiche la page correspondante. Ce routage se fait au niveau du fichier src/page/[...slug].astro et nous y avons ajouté quelques règles.
if (
!aposData.user &&
maintenance?.activateMaintenance &&
slug !== "maintenance"
) {
const req = new Request(new URL("/maintenance", Astro.url), {
headers: {
"x-redirect-to": Astro.url.pathname,
},
});
return Astro.rewrite(req);
}
Lorsque le mode maintenance est activé, il va rediriger n'importe quelle partie du site vers la page de maintenance. Dans le cas contraire, il est nécessaire d’interdire l’accès direct à la page de maintenance et d’ajouter une règle complémentaire.
else if (
!aposData.user &&
!maintenance?.activateMaintenance &&
slug == "maintenance"
) {
// maintenance est réservée
return Astro.redirect("/", 307);
}
Ainsi, si la maintenance est désactivée, le visiteur est détourné vers la racine du site.
Une amélioration possible serait de pouvoir pointer vers la page de maintenance de son choix et ainsi de pouvoir l'adapter à la situation. Une autre possibilité serait d’augmenter la granularité de l'accès au site.