Mantener las sesiones de usuario al migrar a un nuevo host

Continuando la discusión de Mover tu instancia de Discourse a un servidor diferente:

Un problema al migrar una instancia de Discourse a un nuevo servidor, o incluso al restaurar una copia de seguridad en una instancia recién creada, es que todas las sesiones de usuario iniciadas podrían perderse, lo que obligaría a los usuarios a volver a iniciar sesión. Dependiendo de la comunidad, esto podría ser indeseable porque:

  • Algunos usuarios podrían desanimarse a participar si tienen dificultades para volver a iniciar sesión.
  • Algunos usuarios podrían necesitar ayuda para recuperar sus contraseñas.
  • Algunos usuarios podrían crear nuevas cuentas, separándose de su historial de publicaciones y Notas de Usuario, mientras dejan atrás una cuenta zombi.

La pérdida de sesiones puede ocurrir porque las cookies de sesión de Discourse están cifradas con una clave secreta generada aleatoriamente, que se almacena en Redis de forma predeterminada. Los datos de Redis no se incluyen en una copia de seguridad, por lo que se genera una nueva clave secreta al restaurar el sitio en un nuevo host.

La ventaja de este enfoque es que un archivo de copia de seguridad comprometido no contiene la clave necesaria para comprometer las sesiones de los usuarios, lo que podría tener consecuencias muy graves.

Sin embargo, al migrar una instancia de Discourse, esto puede evitarse siguiendo estos pasos para copiar la clave secreta, permitiendo la migración de hosts mientras se mantienen las sesiones de los usuarios.

Paso 1: Recuperar el secreto

Inicia sesión en tu instancia existente de Discourse, ejecuta una consola de rails y luego obtén la clave secreta:

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

Anota el valor impreso en la última línea y manténlo seguro.

Paso 2: Establecer el secreto en la nueva instancia

Asumiendo que ya tienes una instancia de Discourse preparada para recibir una copia de seguridad con el fin de migrar tu instalación, edita el archivo app.yml para establecer el secreto que acabas de obtener. Añádelo a la sección env:

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

Después de añadir esto, reconstruye la instancia:

admin@newhost $ launcher rebuild app

Paso 3: Verificar el secreto en la nueva instancia

Esto es lo mismo que el Paso 1, excepto que se ejecutan los comandos en el nuevo host:

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 clave secreta que se imprime debe ser exactamente la misma que la del paso 1.

Paso 4: Proceder con la migración

Establece la instancia de origen de Discourse en modo solo lectura, realiza una copia de seguridad, cópiala en la instancia de destino de Discourse y restáurala. Actualiza los registros DNS (o usa un truco en el archivo hosts para pruebas) para que los usuarios se dirijan al nuevo sitio.

Las sesiones iniciadas anteriormente deberían persistir ahora en el nuevo host.

Advertencia

Absolutamente no debes compartir la clave secreta entre múltiples instancias de Discourse. La posesión de la clave secreta permitiría a alguien descifrar y modificar su cookie de sesión en un sitio, lo que podría tener consecuencias de seguridad muy graves.

Como siempre, practica y verifica los pasos anteriores en una instancia de entorno de pruebas o en instalaciones de prueba antes de trabajar en una instancia real de Discourse. ¡Prepárate para el éxito!

Por último, pero no menos importante, muchas gracias a @david por describir este método; yo simplemente lo probé y lo escribí aquí (¡y siéntete libre de editarlo o mejorarlo!).

1 me gusta