继续讨论 将您的 Discourse 实例迁移到不同服务器:
将 Discourse 实例迁移到新服务器,甚至将备份恢复到新构建的实例时,存在一个问题:所有已登录用户的会话可能会丢失,导致用户需要重新登录。根据社区的情况,这可能是不受欢迎的,因为:
- 如果用户难以重新登录,可能会阻碍他们参与。
- 一些用户可能需要帮助来恢复密码。
- 一些用户可能会创建新账户,导致其发帖历史和用户笔记被分割,同时留下一个“僵尸账户”。
会话丢失的原因是 Discourse 的会话 Cookie 使用随机生成的密钥进行加密,该密钥默认存储在 Redis 中。备份不包含 Redis 数据,因此当您将站点恢复到新主机时,会生成新的密钥。
这种方法的优点是,即使备份文件被泄露,其中也不包含破解用户会话所需的密钥,否则可能会带来非常严重的后果。
然而,在迁移 Discourse 实例时,可以通过以下步骤复制密钥,从而在迁移主机的同时保留用户会话:
步骤 1:获取密钥
进入现有的 Discourse 实例,运行 rails 控制台,然后获取密钥:
admin@host:/var/discourse$ ./launcher enter app
root@host:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"
记下最后一行打印的值,并确保其安全。
步骤 2:在新实例中设置密钥
假设您已经准备好一个 Discourse 实例以接收备份并迁移您的安装,请编辑 app.yml 以设置您刚刚获得的密钥。将其添加到 env 部分:
env:
DISCOURSE_SECRET_KEY_BASE: "90.......fed"
添加后,重新构建实例:
admin@newhost $ launcher rebuild app
步骤 3:在新实例中验证密钥
这与步骤 1 相同,但在新主机上运行命令:
admin@newhost:/var/discourse$ ./launcher enter app
root@newhost:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"
打印出的密钥应与步骤 1 中的密钥完全相同。
步骤 4:继续迁移
将源 Discourse 设置为只读,进行备份,将其复制到目标 Discourse 并恢复。更新 DNS 记录(或在测试时使用 hosts 文件 hack),以便用户指向新站点。
之前已登录的会话现在应保留到新主机。
警告
您绝对不应在多个 Discourse 实例之间共享密钥。拥有密钥将使某人能够解密并修改其站点的会话 Cookie,这可能会带来非常严重的安全后果。
与往常一样,在操作真实的 Discourse 实例之前,请在沙盒实例或测试安装上练习并验证上述步骤。为成功做好准备!
最后但同样重要的是,非常感谢 @david 描述此方法——我只是在此测试并撰写了本文(欢迎随时编辑或改进!)。