Conserver les sessions utilisateur lors de la migration vers un nouveau serveur

Suite à la discussion sur Déplacer votre instance Discourse vers un autre serveur :

L’un des problèmes rencontrés lors de la migration d’une instance Discourse vers un nouveau serveur, ou même lors de la restauration d’une sauvegarde sur une nouvelle instance, est que toutes les sessions des utilisateurs connectés peuvent être perdues, obligeant les utilisateurs à se reconnecter. Selon la communauté, cela peut être indésirable car :

  • Certains utilisateurs peuvent être découragés de participer s’ils rencontrent des difficultés pour se reconnecter.
  • Certains utilisateurs peuvent avoir besoin d’aide pour récupérer leurs mots de passe.
  • Certains utilisateurs peuvent créer de nouveaux comptes, se séparant ainsi de leur historique de publications et de leurs notes d’utilisateur, tout en laissant derrière eux un compte zombie.

La perte de sessions peut survenir car les cookies de session de Discourse sont chiffrés avec une clé secrète générée aléatoirement, qui est stockée par défaut dans Redis. Les données Redis ne sont pas incluses dans une sauvegarde, de sorte qu’une nouvelle clé secrète est régénérée lorsque vous restaurez le site sur un nouvel hôte.

L’avantage de cette approche est qu’un fichier de sauvegarde compromis ne contient pas la clé nécessaire pour compromettre les sessions des utilisateurs, ce qui pourrait avoir de très graves conséquences.

Lors de la migration d’une instance Discourse, cela peut cependant être contourné en suivant ces étapes pour copier la clé secrète, permettant ainsi la migration d’hôte tout en conservant les sessions des utilisateurs.

Étape 1 : Récupérer la clé secrète

Connectez-vous à votre instance Discourse existante, lancez une console Rails, puis récupérez la clé secrète :

admin@host:/var/discourse$ ./launcher enter app
root@host:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

Notez la valeur affichée sur la dernière ligne et gardez-la en lieu sûr.

Étape 2 : Définir la clé secrète dans la nouvelle instance

En supposant que vous ayez déjà une instance Discourse préparée pour recevoir une sauvegarde afin de migrer votre installation, modifiez le fichier app.yml pour définir la clé secrète que vous venez d’obtenir. Ajoutez-la dans la section env :

env:
  DISCOURSE_SECRET_KEY_BASE: "90.......fed"

Après avoir ajouté cela, reconstruisez l’instance :

admin@newhost $ launcher rebuild app

Étape 3 : Vérifier la clé secrète dans la nouvelle instance

C’est la même chose que l’Étape 1, sauf que vous exécutez les commandes sur le nouvel hôte :

admin@newhost:/var/discourse$ ./launcher enter app
root@newhost:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

La clé secrète affichée doit être exactement la même que celle de l’étape 1.

Étape 4 : Procéder à la migration

Mettez l’instance Discourse source en lecture seule, effectuez une sauvegarde, copiez-la vers l’instance Discourse de destination et restaurez-la. Mettez à jour les enregistrements DNS (ou utilisez une astuce de fichier hosts pour les tests) afin que les utilisateurs soient redirigés vers le nouveau site.

Les sessions précédemment connectées devraient désormais persister sur le nouvel hôte.

Avertissement

Vous ne devez absolument pas partager la clé secrète entre plusieurs instances Discourse. La possession de la clé secrète permettrait à quelqu’un de déchiffrer et de modifier son cookie de session sur un site, ce qui pourrait avoir de très graves conséquences sur la sécurité.

Comme toujours, pratiquez et vérifiez les étapes ci-dessus sur une instance bac à sable ou des installations de test avant de travailler sur une véritable instance Discourse. Préparez-vous au succès !

Enfin, mais pas le moins important, un grand merci à @david pour avoir décrit cette méthode - je l’ai simplement testée et rédigée ici (n’hésitez pas à éditer ou à améliorer !).

1 « J'aime »