将 Discourse 网站迁移到另一个 VPS 使用 rsync

你好!

我正在尝试按照 @scottfsmith 的步骤操作。我成功完成了 rsync。通过 rsync 获取最新更改对我来说并不重要,因为我只是在测试一个新版本的 Linux 和我现有的网站,看看我所有的插件是否都能正常工作。所以我没有进行第二次 rsync。然后尝试运行 ./launcher rebuild app 会产生错误。

2022-12-13 14:43:01.974 UTC [59] LOG:  database system was interrupted; last known up at 2022-12-13 10:23:29 UTC
2022-12-13 14:43:02.075 UTC [59] LOG:  invalid primary checkpoint record
2022-12-13 14:43:02.075 UTC [59] PANIC:  could not locate a valid checkpoint record
2022-12-13 14:43:03.137 UTC [56] LOG:  startup process (PID 59) was terminated by signal 6: Aborted
2022-12-13 14:43:03.137 UTC [56] LOG:  aborting startup due to startup process failure
2022-12-13 14:43:03.231 UTC [56] LOG:  database system is shut down
I, [2022-12-13T14:43:06.699692 #1]  INFO -- : 
I, [2022-12-13T14:43:06.711862 #1]  INFO -- : > su postgres -c 'createdb discourse' || true
createdb: error: could not connect to database template1: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
I, [2022-12-13T14:43:06.917008 #1]  INFO -- : 
I, [2022-12-13T14:43:06.917421 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
psql: error: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
I, [2022-12-13T14:43:07.007654 #1]  INFO -- : 
I, [2022-12-13T14:43:07.008155 #1]  INFO -- : > su postgres -c 'psql discourse -c "grant all privileges on database discourse to discourse;"' || true
psql: error: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
I, [2022-12-13T14:43:07.087098 #1]  INFO -- : 
I, [2022-12-13T14:43:07.087319 #1]  INFO -- : > su postgres -c 'psql discourse -c "alter schema public owner to discourse;"'
psql: error: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
I, [2022-12-13T14:43:07.167221 #1]  INFO -- : 
I, [2022-12-13T14:43:07.168041 #1]  INFO -- : Terminating async processes

我看不出太多信息来找到解决方案。一些搜索建议需要停止容器,但它没有启动。有什么想法吗?

谢谢
David

我建议设置一个暂存服务器来解决你的特定问题。

从那些错误来看,数据库似乎已损坏。你需要停止数据库才能获得有效的数据集来使其正常工作。第二个 rsync 不是可选项。

1 个赞

哇!

一个四年历史的帖子,而且在 3 分钟内就有了回复!:slight_smile:

总之,我基本上是想用 rsync 方法来设置一个暂存服务器。但是,您建议不要用 rsync 这样做,而是使用备份吗?我记得之前设置暂存服务器时没有获取到所有的自定义设置,但也许我记错了。

谢谢。

1 个赞

That’s what that link describes.

除了插件(在您的 app.yml 中)之外,所有内容都在备份中;数据库和上传的内容都在那里。

1 个赞

根据我对该方法的测试,似乎在第一次 rsync 之前执行 ./launcher stop app 就足够了。当然,使用此方法的原因之一似乎是为了尽可能长时间地在旧服务器上运行论坛,在这种情况下,为了保持一致性,运行第二次 rsync 显然是必要的。但是,对于将论坛迁移到不同服务器和/或托管商的相对常见的过程,并且可以接受短暂的停机时间,我真的很喜欢这种方法的简单性和可移植性。

1 个赞

没错。

没错。

我偏好的方法是同步 Let’s Encrypt 和 SSL 相关内容,将旧服务器设为只读模式,进行备份,在新服务器上恢复,然后切换 DNS(或者更好的是,在新服务器准备好时使用静态 IP)。

但如果你不介意一点停机时间,你的方法也很棒。

2 个赞

我计划在一月份迁移到新的 VPS,此前在我的旧 Ubuntu 上遇到了一些 Discourse 升级问题

关于从旧的 Digital Ocean 实例迁移到新的 Digital Ocean 实例,我的问题是:

  • 我计划在迁移前一天将 DNS A 记录的 TTL 降低到很小的数值,比如 5 分钟。这样听起来合理吗?

  • 此帖子的第一篇帖子最后编辑于 2016 年 6 月。它仍然有效和正确吗?

  • 这种 rsync 方法也会将整个数据库从旧 VPS 复制到新 VPS 吗?
    – 我们使用的是标准安装

  • 现有的 Let’s Encrypt SSL 证书也会被复制过去吗?SSL 证书是否与 IP 地址绑定或关联?它会继续自动续订吗?这里有什么需要注意的吗?

  • 我应该在什么时候将公共 DNS A 记录更改为指向新的 VPS?
    – 并且还将 TTL 改回一个较高的值

一切都正确。

如果您使用的是允许将永久 IP 分配给多个 VM 的服务,那么您可以这样做,这样就不必依赖 DNS 来进行切换。

我唯一要补充的注意事项是,在进行最终 rsync 时关闭旧站点,然后在新站点重建期间将其重新启动为只读模式。

第一个帖子仍然显示不正确的 /var/discourse/ 路径:

请编辑/更新。

@Richie@JammyDodger 已将其设为 wiki :+1:

2 个赞

今天我迁移到了一个新的 VPS,我想分享一下我的经验,因为最近似乎有不少人遇到了旧版本操作系统阻止更新的问题 :blush:

我在 Digital Ocean 上,所以创建了一个新的 droplet。

旧 VPS = Ubuntu Server 18.04.6 LTS

新 VPS = Ubuntu Server 23.10

我在新 VPS 上进行了常规的系统维护 - 请根据自己的情况进行修改:

Apt-get update

Apt-get upgrade

Apt-get install fail2ban

ufw default deny incoming

ufw default allow outgoing

ufw allow ssh

ufw allow http

ufw allow https

ufw enable

然后我为 Discourse 创建了一个新的空目录:

sudo mkdir -p /var/discourse

然后我安装了 Docker:

wget -qO- https://get.docker.com/ | sh

然后我将我的 DNS TTL 从 30 分钟更改为 10 分钟(GoDaddy 允许的最小值)。

在我的旧服务器上,我下载了昨晚 Discourse 数据库备份的本地副本(本地备份永远不嫌多)。我还将 app.yml 的副本下载到了我的本地电脑。

正如上面一些人建议的那样,我进行了“root 到 root”的 rsync。我使用了 IP 地址而不是主机名,这样可以避免任何 DNS 混淆。同样如上建议,我使用了 -avz 选项:

rsync -avz root@old.ip.address.here:/var/discourse /var

供参考,我的 discourse 文件夹是 25GB。

从旧服务器到新服务器的 rsync 大约花费了 25 分钟。这只是在同一个 LON1 区域内的两个 Digital Ocean droplet 之间进行的。您的体验可能会有所不同。

rsync 之后并尝试重建时,我遇到了与 @piratdavid 相同的错误,关于 postgres database system is shut down

所以我停止了旧 VPS 上的应用程序:

./launcher stop app

然后又进行了一次 rsync,这次只同步了更改:

rsync -avz --delete root@old.ip.address.here:/var/discourse /var

然后我再次启动了旧的 Discourse 应用程序,并非常迅速地将其置于维护模式 - 这样人们仍然可以访问它,并会看到常规的维护警告消息。

这还为我在新 VPS 上工作争取了一些时间 :blush:

我更新了我本地电脑上的 HOSTS 文件,这样我就可以在没有浏览器警告/问题的情况下访问新 VPS 上的 discourse。

然后我在新 VPS 上运行了:

./discourse-setup

这样它就可以自动更新 app.yml 文件中的内存和 CPU 设置。

然后我在新 VPS 上进行了应用程序重建:

./launcher rebuild app

进行了一些基本测试,一切正常。

更新了 DNS - 任务完成。

感谢大家提供的详细主题 :smiley:

4 个赞

谢谢大家,已更新第一个帖子关于 /var/discourse 路径。

1 个赞

如果有人在进行根到根的 rsync 时遇到问题,可能是因为他们在旧服务器上禁用了 root 登录,或者您只是想以非 root 用户身份执行此操作,我发现这篇帖子对于了解如何在远程服务器上使用 sudo 很有帮助:https://askubuntu.com/questions/719439/using-rsync-with-sudo-on-the-destination-machine

假设您在两端都有一个名为 discourse 的用户,并且该用户具有 sudo 权限。在远程计算机上,您将使用 sudo visudo 编辑 /etc/sudoers 文件。您将添加以下行:

discourset ALL=NOPASSWD:/usr/bin/rsync

然后,在新计算机上,您将(以非 root 用户身份)运行:

sudo rsync -avz --delete --rsync-path="sudo rsync" discourse@old.ip.address.here:/var/discourse /var

这将允许您以非 root 用户身份运行此处描述的所有内容。如果您要保留旧服务器,我建议您返回 /etc/sudoers 文件并删除您刚刚添加的行。

1 个赞

如果我理解正确的话,这允许在 Discourse 运行时进行大部分传输。从备份恢复策略需要至少对备份进行只读访问,并将备份移动到新服务器(或通过 S3 存储桶传输)。对于大型站点,这可能会导致相当长的只读时间,而 rsync 策略可以很好地避免这种情况。

也许可以通过避免关闭旧系统上的 PostgreSQL 并使用 pg_resetwal “修复”新系统上的问题 来稍微延长正常运行时间。注意:我没有尝试过这个方法,让数据库正常关闭几乎肯定是个更好的主意。

我想知道是否有办法让 Discourse 以只读模式启动?我怀疑最快的方法是在容器运行后通过命令行进行。

无论如何,感谢您汇报您的经验!这似乎是一个有用的流程,可以随时备用。 :slight_smile:

非常有用。

如此有用,以至于我都想再次进行,以创建一个暂存环境(在较低配置的 VPS 上),专门用于在生产环境中实施任何更改之前进行测试和预防任何问题。

1 个赞

您好,

我正在尝试在我现在负责维护的一个旧 Discourse 实例上执行此过程——将 EOL 的 Ubuntu 迁移到更新的版本,因为如果原地升级,任何升级都会失败——尽管 rsync 成功了,但 postgres 在启动时因文件所有权问题而失败。以 root 用户运行 rsync 并使用保留所有权的选项并未纠正此问题(文件所有权和权限现在与源匹配,我已经检查过),并且由于 bootstrap 失败且我没有正在运行的容器,因此我无法尝试按 Update failed (postgresql) - #7 by noezDE 所述进行修复。

有什么最好的方法可以规范 postgres 所期望的任何内容?

你可以在容器外 chown 文件吗?如果你有 root/sudo 权限,应该是可以的。

当然,但是是给谁呢?从容器外部看,权限既正确又完全是胡说八道。

源(正常):

root@ip-[...]:/var/discourse/shared/standalone# ls
total 54492
drwxr-xr-x 15 root       root         4096 Oct 22  2021 .
drwxr-xr-x  3 root       root         4096 Feb 28  2017 ..
drwxr-xr-x  3 ubuntu     www-data     4096 Feb 28  2017 backups
-rw-r--r--  1 root       root     55730645 Mar 15  2017 discussion.json
drwx------  7 root       root         4096 Mar  6  2017 letsencrypt
drwxr-xr-x  4 root       root         4096 Feb 28  2017 log
drwxr-xr-x  2 _apt       netdev       4096 Feb 28  2017 postgres_backup
drwx------ 19 _apt       netdev       4096 Sep 15 04:39 postgres_data
drwx------ 20 _apt       netdev       4096 Oct 22  2021 postgres_data_old
drwx------ 20 messagebus uuidd        4096 Apr  5  2018 postgres_data_older
drwxrwsr-x  5 _apt       netdev       4096 Sep 15 04:39 postgres_run
drwxr-xr-x  2 lxd        lxd          4096 Sep 16 01:03 redis_data
drwxr-xr-x  2 root       root         4096 Mar  6  2017 ssl
drwxr-xr-x  4 root       root         4096 Feb 28  2017 state
drwxr-xr-x  4 ubuntu     www-data     4096 Sep 15 04:39 tmp
drwxr-xr-x  5 ubuntu     www-data     4096 Apr 13  2017 uploads

目标(损坏):

root@ip-[...]:/var/discourse/shared/standalone# ls -al
total 54488
drwxr-xr-x 15 root       root         4096 Sep 15 04:31 .
drwxr-xr-x  3 root       root         4096 Sep 15 04:27 ..
drwxr-xr-x  3 ubuntu     www-data     4096 Sep 15 04:27 backups
-rw-r--r--  1 root       root     55730645 Sep 15 04:27 discussion.json
drwx------  7 root       root         4096 Sep 15 04:27 letsencrypt
drwxr-xr-x  4 root       root         4096 Sep 15 04:27 log
drwxr-xr-x  2 _apt       netdev       4096 Sep 15 04:27 postgres_backup
drwx------ 19 _apt       netdev       4096 Sep 15 04:27 postgres_data
drwx------ 20 _apt       netdev       4096 Sep 15 04:30 postgres_data_old
drwx------ 20 messagebus uuidd        4096 Sep 15 04:31 postgres_data_older
drwxrwsr-x  5 messagebus tss          4096 Sep 15 04:31 postgres_run
drwxr-xr-x  2 uuidd      _ssh         4096 Sep 15 04:38 redis_data
drwxr-xr-x  2 root       root         4096 Sep 15 04:32 ssl
drwxr-xr-x  4 root       root         4096 Sep 15 04:31 state
drwxr-xr-x  4 ubuntu     www-data     4096 Sep 15 04:31 tmp
drwxr-xr-x  5 ubuntu     www-data     4096 Sep 15 04:31 uploads

我猜这些 ID 在容器内部可能更有意义?

是的,我尝试了从 ls -aln 暴力破解数字 ID,但仍然收到相同的失败信息。

2024-09-16 01:21:27.237 UTC [36] FATAL:  data directory "/shared/postgres_data" has wrong ownership

我不知道它想要什么。

我最近似乎遇到了一个类似的错误。

一种猜测是,旧容器和新容器的 /etc/passwd 条目不同。我想你可以比较一下这两个文件。

我认为你最好的办法可能是从备份中恢复。我不记得我是否这样做了,还是我把什么东西设置成了 777。