无法重建,因 PostgreSQL 12 升级失败

哪个指南?
2045 端口让我想起了一些东西,但我一时想不起来具体是什么:思考

几个月前在几次安装失败后,我将端口改为了 2045,但这并不相关,因为它已被 # 注释掉了。问题并不在于该端口。

我遵循了以下指南:discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

好吧……它被改动了,手滑也是常有的事 :sweat_smile:

我理解,但要想得出 2045 这个结果,你或许曾遵循过某些指引,才来到了这里和现在。我想我也转发了同一篇帖子,因为我的 nginx 配置中不知为何也设置了一个 2045 代理……

:crazy_face:

@Benjamin_D 我的 nginx 配置文件中并没有 2045 端口,你可以向上滚动查看。app.yml 中的那一行已被 # 注释掉了,所以我不明白你们为何还在指责它。问题肯定不在那里,否则错误信息会明确指出。

如果你愿意,我可以从 app.yml 文件中删除那一行,但结果会和之前一样。

我想在我第一次安装时,容器提示端口 80 或 443 已被占用,所以我可能在某处看到建议随便添加一个端口。但再次强调,那一行是用 # 注释掉的,按理说不应该被考虑在内。

完全不是,我们只是在尝试重现你的操作步骤,并将我们的配置与你的进行对比。

此错误肯定与 PostgreSQL 升级失败有关。

请查看元主题以解决此问题。

2 个赞

我会查看 PostgreSQL 升级相关主题。如果遇到其他错误,我会再回来反馈。

因此,在将 PostgreSQL 从 10 升级到 12 后,我执行命令 ./launcher rebuild app 后仍然遇到问题:

sudo ./launcher rebuild app
fatal: not a git repository (or any of the parent directories): .git
停止旧容器
+ /usr/bin/docker stop -t 60 app
app
cd /pups && git pull && /pups/bin/pups --stdin
已是最新。
I, [2020-07-13T13:34:21.635079 #1]  INFO -- : 正在加载 --stdin
I, [2020-07-13T13:34:21.643465 #1]  INFO -- : > locale-gen $LANG && update-locale
I, [2020-07-13T13:34:21.713536 #1]  INFO -- : 正在生成区域设置(这可能需要一段时间)...
生成完成。

I, [2020-07-13T13:34:21.713917 #1]  INFO -- : > mkdir -p /shared/postgres_run
I, [2020-07-13T13:34:21.720693 #1]  INFO -- :
I, [2020-07-13T13:34:21.721042 #1]  INFO -- : > chown postgres:postgres /shared/postgres_run
I, [2020-07-13T13:34:21.724919 #1]  INFO -- :
I, [2020-07-13T13:34:21.725387 #1]  INFO -- : > chmod 775 /shared/postgres_run
I, [2020-07-13T13:34:21.728768 #1]  INFO -- :
I, [2020-07-13T13:34:21.729117 #1]  INFO -- : > rm -fr /var/run/postgresql
I, [2020-07-13T13:34:21.732712 #1]  INFO -- :
I, [2020-07-13T13:34:21.733008 #1]  INFO -- : > ln -s /shared/postgres_run /var/run/postgresql
I, [2020-07-13T13:34:21.735981 #1]  INFO -- :
I, [2020-07-13T13:34:21.736200 #1]  INFO -- : > socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
2020/07/13 13:34:21 socat[27] E connect(6, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): 没有那个文件或目录
I, [2020-07-13T13:34:21.751266 #1]  INFO -- :
I, [2020-07-13T13:34:21.752242 #1]  INFO -- : > rm -fr /shared/postgres_run/.s*
I, [2020-07-13T13:34:21.757300 #1]  INFO -- :
I, [2020-07-13T13:34:21.757817 #1]  INFO -- : > rm -fr /shared/postgres_run/*.pid
I, [2020-07-13T13:34:21.761287 #1]  INFO -- :
I, [2020-07-13T13:34:21.761706 #1]  INFO -- : > mkdir -p /shared/postgres_run/10-main.pg_stat_tmp
I, [2020-07-13T13:34:21.765114 #1]  INFO -- :
I, [2020-07-13T13:34:21.765725 #1]  INFO -- : > chown postgres:postgres /shared/postgres_run/10-main.pg_stat_tmp
I, [2020-07-13T13:34:21.770573 #1]  INFO -- :
I, [2020-07-13T13:34:21.781057 #1]  INFO -- : 文件 > /etc/service/postgres/run  chmod: +x  chown:
I, [2020-07-13T13:34:21.791681 #1]  INFO -- : 文件 > /etc/service/postgres/log/run  chmod: +x  chown:
I, [2020-07-13T13:34:21.800244 #1]  INFO -- : 文件 > /etc/runit/3.d/99-postgres  chmod: +x  chown:
I, [2020-07-13T13:34:21.808363 #1]  INFO -- : 文件 > /root/upgrade_postgres  chmod: +x  chown:
I, [2020-07-13T13:34:21.809170 #1]  INFO -- : > chown -R root /var/lib/postgresql/10/main
chown: 无法访问 '/var/lib/postgresql/10/main': 没有那个文件或目录
I, [2020-07-13T13:34:21.817357 #1]  INFO -- :


失败
--------------------
Pups::ExecError: chown -R root /var/lib/postgresql/10/main 执行失败,返回状态码 #<Process::Status: pid 42 exit 1>
失败位置:/pups/lib/pups/exec_command.rb:112:in `spawn'
执行失败,参数为 {"cmd"=>["chown -R root /var/lib/postgresql/10/main", "[ ! -e /shared/postgres_data ] && install -d -m 0755 -o postgres -g postgres /shared/postgres_data && sudo -E -u postgres /usr/lib/postgresql/10/bin/initdb -D /shared/postgres_data || exit 0", "chown -R postgres:postgres /shared/postgres_data", "chown -R postgres:postgres /var/run/postgresql"]}
3e7af3d49be0616ae52ee03d6ee0867d25e5db96de40d92c7ec7abeded5d3262
** 引导失败 ** 请向上滚动查看之前的错误消息,可能不止一条。
./discourse-doctor 可能有助于诊断问题。

我不明白,我放弃了… ;/

“fatal: not a git repository (or any of the parent directories): .git”是什么意思?

此外,我还遇到了以下情况:

sudo ./discourse-setup
配置文件 containers/app.yml 已存在!

. . . 重新配置 . . .


将旧文件保存为 app.yml.2020-07-13-153931.bak
5 秒内停止现有容器,或按 Control-C 取消。
+ /usr/bin/docker stop -t 10 app
app

检测到 4GB 内存和 2 个物理 CPU 核心
设置 db_shared_buffers = 1024MB
设置 UNICORN_WORKERS = 4
containers/app.yml 内存参数已更新。

您的 Discourse 主机名?[cp2077.eu]:

正在检查您的域名 . . .
警告:使用主机名 cp2077.eu 似乎无法访问计算机的 443 端口。
警告:连接到 http://cp2077.eu(端口 80)也失败。

这表明 cp2077.eu 解析到了某个 IP 地址,但该地址无法到达您正在安装 Discourse 的这台机器。

首先要做的是确认 cp2077.eu 是否解析到了此服务器的 IP 地址。
您通常可以在购买域名的同一位置进行此操作。

如果您确定 IP 地址解析正确,则可能是防火墙问题。
搜索“开放端口 YOUR CLOUD SERVICE”可能会有所帮助。

此工具仅适用于最标准的安装。如果您无法解决上述问题,则需要自行编辑 containers/app.yml,然后输入

./launcher rebuild app

该网站已通过端口 443(SSL)安全运行,我不明白为什么它说无法访问该网站。我不知道还能做什么。请帮忙。

您使用了反向代理,因此无法使用 discourse-setup。此外,您可能需要从配置文件中移除 let’s encrypt 模板。

我不清楚您的 postgres 问题可能是什么。

2 个赞

你是指我 nginx 文件中关于代理的那些行吗?

您是不是试图在之前的安装(2 月份的那次)之上重新安装 Discourse?因此,您使用了首帖截图中显示的现有 app.yml,并且需要将 PostgreSQL 从 10 升级到 12(考虑到错误信息,我认为您并未完成此操作;也许您在主机上完成了升级,但数据容器中并未升级,甚至该容器可能已不存在。我不清楚您之前安装的具体状态)。您是否有备份?还是希望进行全新安装?

1 个赞

我认为 @pfaffman 的意思是,因为你使用了反向代理(nginx),脚本 discourse-setup 可能无法正常工作(我从未在反向代理环境下运行过 Discourse,所以不确定是否确实如此)。如果你正确定义了 app.yml,即使不运行 discourse-setup 也应该没问题。

这看起来像是在一个没有 PostgreSQL 10 的容器中执行了该代码(你可能正在使用版本 12)。如果这正是你想要的,并且你的模板是你在第一个帖子中定义的 templates/postgres.template.yml,那么可能是你机器上的 discourse_docker 仓库(位于 /var/discourse)已过时。

你安装的 Discourse 是最新的还是旧的?如果更新仓库,可能会解决该问题:

cd /var/discourse
git pull

然后运行重建步骤。

另外,请确保 Discourse 容器已被销毁并重新创建(而不仅仅是停止和启动),以避免使用旧容器(我认为 Discourse 的重建操作应该已经做到了这一点,但以防万一……)。

如果仍然无法解决,并且你有备份,建议像 @Benjamin_D 所说的那样,在新的实例上重新安装。

1 个赞

@Benjamin_D

我尝试在同一个服务器上为另一个域名安装 Discourse,也就是在现有安装之上再部署一个。请原谅我的无知,在 app.yml 的哪个部分可以找到 PostgreSQL 的配置?因为我刚查看了我的 app.yml,并没有看到任何与它相关的内容。

我确实备份了旧文件,并且从之前的安装中复制了一些信息到新服务器的 app.yml 中。

@lucasbasquerotto

同样请原谅我的无知,当你们提到“代理”Nginx 时,是指下面这一行吗?

location / {
        proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;

我之前使用的是 PostgreSQL 10,但昨天已将其升级到 12。

在这种情况下,我非常希望能启动一个全新的实例。请问如何删除旧实例,以确保所有组件都能全新安装?非常感谢!

同一服务器上运行两个 Discourse 实例,也就是多站点配置,那可是另一回事了:
目前,我认为最好的做法是确保你已对第一个站点进行备份,将其升级至 PostgreSQL 12 并正常运行,然后再尝试多站点配置——不过在这方面我完全不够格:

2 个赞

谢谢本杰明,

我想重新开始。我确实有第一个网站的备份,但那只是尝试性的,现在已经不需要了。我希望从头开始。

我该如何删除旧的容器及所有内容,以便重新开始?

您是否已尝试先在本地(位于 /var/discourse)更新 discourse_docker 仓库?是否仍然无法工作?

关于反向代理,这是因为 nginx 位于请求的中间,负责将请求路由到正确的服务(而不是直接将服务,在本例中为 discourse,暴露给互联网)。因此,nginx 充当反向代理,而暴露给互联网的端口(80 和 443)属于 nginx 服务。

奇怪的是,正如你注意到的那样,Benjamin,discourse 的设置曾在今年二月在我的一个域名上成功运行过,因为我之前也发布过相关内容的帖子。因此,我很惊讶竟然有人从未使用过 nginx 来运行 Discourse。老实说,一切运行完美,直到昨天我尝试在同一台服务器上为另一个域名安装 Discourse 时出了问题。

我究竟应该在 discourse_docker 中查找什么?以下是该文件夹的内容:

discourse_docker$ ls
bin   containers        discourse-setup  launcher  README.md  scripts  templates
cids  discourse-doctor  image            LICENSE   samples    shared

只需运行 git pull 来更新仓库(/var/discourse 目录本身就是本地仓库),正如我在上面的帖子中所说:

然后运行重建命令。

还有其他人在前面使用 nginx,但这种情况肯定比在专用机器上仅安装 Discourse 的标准安装要少得多。我也不确定这是否会破坏 discourse-setup,我只是根据你的结果进行猜测,并且考虑到错误发生在检查 DNS 和开放端口时(同时请记住,在主机上使用 80 和 443 端口的并不是你的 Discourse 容器)。

好的,我按照卢卡斯提到的,进入了 discourse_docker 文件夹,将我的 app.yml 文件复制到了该文件夹的 containers 目录中,并运行了命令 ./launcher rebuild app。

过程中没有报错,一切顺利,我觉得应该已经生效了。

我还不想把话说太满,现在我先尝试设置新账号吧 :smiley: