如何将 Discourse 从一台服务器迁移到另一台服务器,使用相同的 DNS 名称

我正准备将 Discourse 从个人托管迁移到 Amazon LightSail 服务器。我已搜索过论坛,并阅读了所有关于迁移服务器和设置 Discourse 的帖子:

Move your Discourse Instance to a Different Server
Restore a backup from the command line
How To Install Discourse on Ubuntu 18.04 | DigitalOcean
discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

据我理解,流程如下:

  1. 安装新的 Discourse 服务器
  2. 从现有 Discourse 导出备份(目前备份配置为保存到 S3,但我理解这需要手动文件备份)
  3. 将备份导入新 Discourse(由于无法从 S3 自动获取,需手动操作)

现在我在第 1 步卡住了,因为我有几个限制条件:我只有一个域名,希望新服务器使用相同的域名,并且不想有任何停机时间(我的目标是完成新服务器设置、恢复备份,最后更改 DNS 记录指向新服务器,从而避免停机,因为两台服务器将同时运行)。

据我理解,设置新 Discourse 服务器时,我可以从现有服务器复制 app.yml 到新服务器,然后运行 discourse-setup。但我看到的问题是:这样做会使用与现有服务器相同的 DNS 名称(这正是我想要的),但我预见到两个问题,正在试图解决:

  1. Let’s Encrypt 无法为新服务器生成 SSL 证书,因为域名仍指向旧服务器。
  2. 由于没有 SSL 证书(旧服务器配置设置为仅使用 SSL,这将随 app.yml 一起迁移),服务器将无法启动。
  3. 我曾尝试通过 DNS 名称重定向连接到 Discourse 服务器,但如果输入的 URL 与 app.yml 配置不匹配,NGINX 或 Discourse 将无法工作,您在尝试连接时会在浏览器中收到错误。因此,没有 Web 界面,我无法启动恢复过程。

那么,我该如何使用现有服务器的 app.yml 完成新 Discourse 服务器的设置,然后恢复备份并进行 DNS 切换?或者是否有更简单的方法?

如果您不使用相同的 S3 存储桶,则有一个隐藏设置可强制备份下载 S3 文件。您可以在设置文件中查找该设置名称,并通过 Rails 控制台进行配置。有一个相关主题讨论了此问题,但最直接的方法是查看 settings.yml 文件。

您无需运行 discourse-setup,只需复制 app.yml 并重新构建即可。

您可以使用 rsync 同步 Let’s Encrypt 证书。实际上,您可以直接复制整个 /var/discourse 目录(可能需排除部分日志等文件)。

3 个赞

理想情况下目标是“原地迁移”(lift n shift),但由于 Amazon Lightsail 不支持导入现有镜像,因此无法实现。所以,是的,将使用完全相同的 S3 存储桶。

看来您的方案最接近“原地迁移”。如果我的理解正确,我只需要将原始服务器上的整个 /var/discourse 文件夹打包压缩(tar/gz),解压到新服务器,然后执行 discourse start,最后将 DNS 指向新的服务器即可。是这样吗?我是否需要在新的服务器上重新构建 Discourse?那 Nginx、Docker 以及该文件夹之外的其他依赖项呢?

是的,请按照您认为合理的方式移动文件。是的,您需要重新构建以构建并启动新容器。

1 个赞

谢谢。看来“直接迁移”并没有我想象的那么顺利,迁移前后需要做一些检查,以确保迁移过程顺畅(Postgres 从 12.0 升级到 13.0 让我在迁移过程中学到了不少经验教训)。以下是为将来尝试迁移到 Amazon LightSail 服务器(1GB RAM)的用户准备的逐步指南:

原服务器

  • 创建备份到 S3
  • cd /var/discourse
  • ./launcher rebuild # 获取最新构建版本,以便顺利过渡
  • ./launcher cleanup # 清理旧数据,减小包体积
  • ./launcher stop app # 如果不执行此操作,后续尝试重建时(涉及 Postgres)会失败
  • tar -zcvf /var/discourse discourse.tar.gz

新的 Amazon LightSail 服务器

  • 从 Amazon 安装 Ubuntu 20.20 镜像(1GB RAM)
  • 安装 Docker
  • 创建 2GB 交换空间 # 如果不执行此操作,重建可能会失败
  • 配置 vm.overcommit_memory=1 # 如果不执行此操作,Postgres 在重建过程中可能会失败
  • 通过 FTPS/传输将 discourse.tar.gz 从原服务器传输过来
  • tar -zxvf discourse.tar.gz -C /
  • cd /var/discourse
  • app.yml 中将 UNICORN_WORKERS 设置为 2 # 在 1GB RAM 的情况下,将其设置为超过 2 可能会导致交换和因磁盘活动过多而受到限制
  • ./launcher rebuild
  • 更改 DNS 指向新的 Amazon 服务器

有没有更简单的方法迁移服务器(直接迁移),而无需经历完整的 Discourse 设置流程?

1 个赞

你的意思是无需运行 discourse-setup,还是指无需构建运行 Discourse 所需的容器?如果是后者,可以通过将旧镜像推送到新服务器可用的仓库来实现,但这对于新手来说并不容易处理。

你的过程因 PG13 升级而变得复杂。或许在新服务器上从头构建新镜像,然后从旧服务器备份/恢复备份会稍微简单一些,但你仍然需要在让新服务器获取 Let’s Encrypt 证书方面处理一些繁琐的细节。

1 个赞

没错,这正是阻止我在新的服务器上执行 ./discourse-setup 并从 S3 镜像恢复的唯一障碍(以及如何在无法访问 Web 管理控制台的情况下完成此操作,因为 DNS 仍指向旧服务器,而且据我所知 Discourse 在浏览器中不会响应 IP 地址)。由于我拥有一个在线系统,并且需要即时将 DNS 从旧系统切换到新系统,因此缺乏 Let’s Encrypt 证书是我面临的最大阻碍。

如果有一种方法可以将证书从旧系统迁移到新系统,在没有 Let’s Encrypt 错误的情况下完成 ./discourse-setup,并在无需 Web 控制台的情况下从 S3 备份恢复,那将是一种更简单的解决方案。

如果你将 containers 目录下的 yml 文件复制过去,就不需要运行 discourse-setup 了(它可以在新服务器上调整内存参数,但你也可以在之后手动调整)。你只需执行 ./launcher rebuild app 即可。

好的,我想我明白您的意思了,但为了确保准确,让我复述一下我的理解。

在原始服务器上,已配置将 Discourse 备份到 S3(包括设置和站点内容)。

通过从 containers 目录复制 yml 文件,可以将原始服务器的所有配置迁移到新服务器。因此,在新服务器上,我不再需要执行 discourse-setup,而是直接运行 ./launcher rebuild app,该命令将使用原始服务器的配置下载最新镜像并配置 Discourse。

目前还有两项待办事项:

  1. 如何迁移 Let’s Encrypt 证书?(由于 DNS 仍指向原始服务器,无法重新生成证书,我猜测这需要在执行 ./launcher rebuild app 之前完成。)
  2. 如何在重建后从 S3 备份恢复 Discourse(设置 + 内容)?由于 DNS 仍指向原始服务器,是否有办法通过 IP 地址或 localhost 访问 Discourse 管理界面?或者能否通过控制台直接恢复 S3 备份?

如果您复制旧的 /var/discourse,您将获得证书,重建将按预期工作。

您可以在容器内部通过命令行进行恢复。

感谢您提供的详细步骤,我最近也遇到了类似的情况,需要迁移到新的主机。
由于网站还能正常运行,我不想通过备份来操作,所以按照这里的步骤进行。

操作几乎成功了,但在新主机上重建时失败了。
结果发现两个主机上的 UID/GID 映射不完全相同,导致启动 Postgres 时由于数据文件夹所有权不正确而中断。

这种情况也可能发生在其他实例中,但幸运的是有一个修复方法可用

此帖子中的场景还有一个额外的细节,那就是容器尚未构建,因此在此阶段 ./launcher enter app 不起作用。由于重建过程会持续相当长的时间,我能够使用 docker ps 获取正在进行构建的容器名称,然后进入容器:

docker exec -it <container_name> bash
chown -R postgres:postgres /shared/postgres_*

重建然后失败(或者你无法通过 CTRL+C 停止它)。停止后,只需再次运行它,权限就会修复:

./launcher rebuild app

它又开始运行了 :sweat_smile:

1 个赞

对于所有使用 1GB RAM 的用户,请确保至少创建 4GB 交换空间,否则重建将失败。请参阅 3.1.x to 3.2.0 upgrade hangs/fails on 1GB instance

1 个赞