再構築に失敗しました: データディレクトリ /shared/postgres_data は root によって所有されていてはいけません

詳細が不足していること、あらかじめお詫び申し上げます…本当にここで行き詰まってしまいました…
/var/discourse/shared/standalone 内のファイル権限要件についてよくご存知の方は、この投稿の核心となる質問部分まで読み飛ばして、私がたどり着くまでの詳細はスキップしていただいても構いません :sweat:

最新の Web ベースのアップグレードにより、私のインストール環境が壊れてしまいました。おそらく、Error Updating from 3.4.0.beta3-dev to 3.4.0.beta3 と同様の問題だったと思いますが、私の環境は 3.4.0.beta4-dev でした。

私は Ubuntu 20 を使用しているため、現在 ./launcher rebuild app を実行すると以下のエラーが返されます:

ERROR: Docker version 19.03.13 not supported, please upgrade to at least 20.10.0, or recommended 24.0.7

これは不可能だと考えられるため、新しいサーバーを作成し、Move a Discourse site to another VPS with rsync に記載された手順に従いました。さらに、古いサーバーからのボリュームも移行するための追加コマンドを実行しました:
rsync -rvz root@104.236.77.249:/var/lib/docker/volumes/ /var/lib/docker/volumes

これで、新しい Ubuntu 24 サーバー上で ./launcher rebuild app を実行すると、以下のエラーが返されます:

Stopping PostgreSQL 15 database server: mainError: Data directory /shared/postgres_data must not be owned by root … failed!

完全なコマンド出力
x86_64 arch detected.
WARNING: containers/app.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/app.yml
Ensuring launcher is up to date
Launcher is up-to-date
2.0.20250129-0720: Pulling from discourse/base
Digest: sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
Status: Image is up to date for discourse/base:2.0.20250129-0720
docker.io/discourse/base:2.0.20250129-0720
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-02-05T15:28:12.350842 #1]  INFO -- : Reading from stdin
I, [2025-02-05T15:28:12.364293 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-02-05T15:28:12.369358 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-02-05T15:28:12.373684 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-02-05T15:28:12.378720 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2025-02-05T15:28:12.383793 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-02-05T15:28:12.384811 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.386020 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.391549 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.392476 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.393539 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.394234 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.394860 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.395701 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.396354 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T15:28:12.396997 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-05T15:28:12.397677 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-05T15:28:12.398272 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-05T15:28:12.398841 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
debconf: delaying package configuration, since apt-utils is not installed
I, [2025-02-05T15:28:32.940792 #1]  INFO -- : Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
Upgrading PostgreSQL from version 13 to 15
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /shared/postgres_data_new ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok


Success. You can now start the database server using:

    /usr/lib/postgresql/15/bin/pg_ctl -D /shared/postgres_data_new -l logfile start

Get:1 http://deb.debian.org/debian bookworm-backports InRelease [59.0 kB]
Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:4 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:5 https://deb.nodesource.com/node_22.x nodistro InRelease [12.1 kB]
Get:6 https://dl.yarnpkg.com/debian stable InRelease [17.1 kB]
Get:7 http://deb.debian.org/debian bookworm-backports/main amd64 Packages [282 kB]
Get:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8,792 kB]
Get:9 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
Get:10 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13.5 kB]
Get:11 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [243 kB]
Get:12 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5,274 B]
Get:13 https://dl.yarnpkg.com/debian stable/main all Packages [10.9 kB]
Get:14 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10.9 kB]
Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
Fetched 10.2 MB in 2s (4,214 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  postgresql-client-13
Suggested packages:
  postgresql-doc-13
The following NEW packages will be installed:
  postgresql-13 postgresql-13-pgvector postgresql-client-13
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 17.3 MB of archives.
After this operation, 56.7 MB of additional disk space will be used.
Get:1 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.18-1.pgdg120+1 [1,523 kB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.18-1.pgdg120+1 [15.4 MB]
Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
Fetched 17.3 MB in 2s (8,411 kB/s)
Selecting previously unselected package postgresql-client-13.
(Reading database ... 33363 files and directories currently installed.)
Preparing to unpack .../postgresql-client-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-client-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13.
Preparing to unpack .../postgresql-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13-pgvector.
Preparing to unpack .../postgresql-13-pgvector_0.8.0-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Setting up postgresql-client-13 (13.18-1.pgdg120+1) ...
Setting up postgresql-13 (13.18-1.pgdg120+1) ...
Creating new PostgreSQL cluster 13/main ...
/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/13/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 13 main start

Warning: The selected stats_temp_directory /var/run/postgresql/13-main.pg_stat_tmp
is not writable for the cluster owner. Not adding this setting in
postgresql.conf.
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Processing triggers for postgresql-common (267.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Stopping PostgreSQL 13 database server: main.
Stopping PostgreSQL 15 database server: mainError: Data directory /shared/postgres_data must not be owned by root ... failed!
 failed!

could not open version file "/shared/postgres_data/PG_VERSION": Permission denied
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-15-update/349515 for support.

You can run ./launcher start app to restart your app in the meanwhile
-------------------------------------------------------------------------------------



FAILED
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
 failed with return #<Process::Status: pid 18 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

/var/discourse/shared フォルダは、古いサーバーと新しいサーバーの両方で root が所有しています。しかし、さらに深く掘り下げてみると、/var/discourse/shared/standalone 内のいくつかのフォルダに権限の違いがあることに気づきました…

古いサーバー:

/var/discourse/shared/standalone# ls -alh
total 56K
drwxr-xr-x 14 root      root       4.0K Jan 22  2021 .
drwxr-xr-x  3 root      root       4.0K Mar 12  2016 ..
drwxr-xr-x  3      1000 www-data   4.0K Sep 21  2015 backups
drwxr-xr-x  8 root      root       4.0K Dec 10 19:36 letsencrypt
drwxr-xr-x  4 root      root       4.0K Jun 12  2015 log
drwxr-xr-x  2 syslog    syslog     4.0K Jun 12  2015 postgres_backup
drwx------ 19 syslog    syslog     4.0K Feb  4 20:03 postgres_data
drwx------ 20 colord    landscape  4.0K Jan 22  2021 postgres_data_old
drwxrwsr-x  7 syslog    syslog     4.0K Feb  4 20:03 postgres_run
drwxr-xr-x  2 landscape messagebus 4.0K Feb  4 20:03 redis_data
drwxr-xr-x  2 root      root       4.0K Nov  7  2019 ssl
drwxr-xr-x  4 root      root       4.0K Jun 12  2015 state
drwxr-xr-x  4      1000 www-data   4.0K Feb  4 20:03 tmp
drwxr-xr-x  4      1000 www-data   4.0K Jun 16  2017 uploads

新しいサーバー:

/var/discourse/shared/standalone# ls -alh
total 60K
drwxr-xr-x 15 root       root   4.0K Feb  5 15:32 .
drwxr-xr-x  3 root       root   4.0K Feb  5 01:59 ..
drwxr-xr-x  3 root       root   4.0K Feb  5 01:59 backups
drwxr-xr-x  8 root       root   4.0K Feb  5 02:00 letsencrypt
drwxr-xr-x  4 root       root   4.0K Feb  5 01:59 log
drwxr-xr-x  2 root       root   4.0K Feb  5 01:59 postgres_backup
drwx------ 20 root       root   4.0K Feb  5 02:42 postgres_data
drwx------ 20 messagebus tss    4.0K Feb  5 15:33 postgres_data_new
drwx------ 20 root       root   4.0K Feb  5 02:04 postgres_data_older
drwxrwxr-x  8 messagebus tss    4.0K Feb  5 02:41 postgres_run
drwxr-xr-x  2 root       root   4.0K Feb  5 02:05 redis_data
drwxr-xr-x  2 root       root   4.0K Feb  5 02:05 ssl
drwxr-xr-x  4 root       root   4.0K Feb  5 02:04 state
drwxr-xr-x  4 root       root   4.0K Feb  5 02:04 tmp
drwxr-xr-x  4 root       root   4.0K Feb  5 02:04 uploads

そこで、新しいサーバーの 2 つのフォルダの所有権を変更しました:

chown -R syslog: postgres_data
chown -R syslog: postgres_backup

これにより、エラーメッセージが以下のように変わり、対処方法がわかりません:

Stopping PostgreSQL 15 database server: mainError: Config owner (postgres:101) and data owner (messagebus:102) do not match, and config owner is not root … failed!

念のため、新しいサーバーの現在の権限を以下に示します:

/var/discourse/shared/standalone# ls -alh
total 60K
drwxr-xr-x 15 root       root   4.0K Feb  5 15:32 .
drwxr-xr-x  3 root       root   4.0K Feb  5 01:59 ..
drwxr-xr-x  3 root       root   4.0K Feb  5 01:59 backups
drwxr-xr-x  8 root       root   4.0K Feb  5 02:00 letsencrypt
drwxr-xr-x  4 root       root   4.0K Feb  5 01:59 log
drwxr-xr-x  2 syslog     syslog 4.0K Feb  5 01:59 postgres_backup
drwx------ 20 syslog     syslog 4.0K Feb  5 02:42 postgres_data
drwx------ 20 messagebus tss    4.0K Feb  5 15:33 postgres_data_new
drwx------ 20 root       root   4.0K Feb  5 02:04 postgres_data_older
drwxrwxr-x  8 messagebus tss    4.0K Feb  5 02:41 postgres_run
drwxr-xr-x  2 root       root   4.0K Feb  5 02:05 redis_data
drwxr-xr-x  2 root       root   4.0K Feb  5 02:05 ssl
drwxr-xr-x  4 root       root   4.0K Feb  5 02:04 state
drwxr-xr-x  4 root       root   4.0K Feb  5 02:04 tmp
drwxr-xr-x  4 root       root   4.0K Feb  5 02:04 uploads

:person_shrugging:
いくつかの chown で解決できると思っていますが、何を、なぜ、どのように行うべきかわかりません…

元の(ただし誤っていた)権限のドキュメントが残っていたため、異なる chown 変種でのテストを続けることにしました。最終的に、以下のセットでそのエラーを回避できました:

chown -R messagebus:tss /var/discourse/shared/standalone/postgres_backup
chown -R messagebus:tss /var/discourse/shared/standalone/postgres_data
chown -R messagebus:tss /var/discourse/shared/standalone/postgres_run
chown -R messagebus:tss /var/discourse/shared/standalone/postgres_data_new
chown -R messagebus:tss /var/discourse/shared/standalone/postgres_data_older

現在、./launcher rebuild app を実行すると、PostgreSQL 15 update - #61 by xFocus で言及されていると同じエラーに遭遇します。

ソースクラスターがクリーンにシャットダウンされませんでした。
失敗、終了

完全なコマンド出力
x86_64 arch detected.
Ensuring launcher is up to date
Launcher is up-to-date
2.0.20250129-0720: Pulling from discourse/base
Digest: sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
Status: Image is up to date for discourse/base:2.0.20250129-0720
docker.io/discourse/base:2.0.20250129-0720
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-02-05T16:19:09.574812 #1]  INFO -- : Reading from stdin
I, [2025-02-05T16:19:09.605350 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-02-05T16:19:09.614043 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-02-05T16:19:09.626167 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-02-05T16:19:09.634599 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2025-02-05T16:19:09.643169 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-02-05T16:19:09.644682 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.646186 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.653810 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.655422 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.656864 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.657789 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.659640 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.660906 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.661925 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-05T16:19:09.663114 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-05T16:19:09.663912 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-05T16:19:09.664817 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-05T16:19:09.665701 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
debconf: delaying package configuration, since apt-utils is not installed
I, [2025-02-05T16:19:29.797884 #1]  INFO -- : Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
Upgrading PostgreSQL from version 13 to 15
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /shared/postgres_data_new ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok


Success. You can now start the database server using:

    /usr/lib/postgresql/15/bin/pg_ctl -D /shared/postgres_data_new -l logfile start

Get:1 http://deb.debian.org/debian bookworm-backports InRelease [59.0 kB]
Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:4 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:5 https://dl.yarnpkg.com/debian stable InRelease [17.1 kB]
Get:6 https://deb.nodesource.com/node_22.x nodistro InRelease [12.1 kB]
Get:7 http://deb.debian.org/debian bookworm-backports/main amd64 Packages [282 kB]
Get:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8,792 kB]
Get:9 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13.5 kB]
Get:10 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
Get:11 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [243 kB]
Get:12 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10.9 kB]
Get:13 https://dl.yarnpkg.com/debian stable/main all Packages [10.9 kB]
Get:14 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5,274 B]
Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
Fetched 10.2 MB in 3s (3,942 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  postgresql-client-13
Suggested packages:
  postgresql-doc-13
The following NEW packages will be installed:
  postgresql-13 postgresql-13-pgvector postgresql-client-13
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 17.3 MB of archives.
After this operation, 56.7 MB of additional disk space will be used.
Get:1 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.18-1.pgdg120+1 [1,523 kB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.18-1.pgdg120+1 [15.4 MB]
Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
Fetched 17.3 MB in 2s (9,988 kB/s)
Selecting previously unselected package postgresql-client-13.
(Reading database ... 33363 files and directories currently installed.)
Preparing to unpack .../postgresql-client-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-client-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13.
Preparing to unpack .../postgresql-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13-pgvector.
Preparing to unpack .../postgresql-13-pgvector_0.8.0-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Setting up postgresql-client-13 (13.18-1.pgdg120+1) ...
Setting up postgresql-13 (13.18-1.pgdg120+1) ...
Creating new PostgreSQL cluster 13/main ...
/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/13/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 13 main start

invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Processing triggers for postgresql-common (267.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Stopping PostgreSQL 13 database server: main.
Stopping PostgreSQL 15 database server: main.
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok

The source cluster was not shut down cleanly.
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-15-update/349515 for support.

You can run ./launcher start app to restart your app in the meanwhile
-------------------------------------------------------------------------------------



FAILED
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
 failed with return #<Process::Status: pid 18 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
e2940f8bb9e51f0f290e0b6cb78257d5fa5d7563542591405689531d1af8432b

そのスレッドでは、tail /var/discourse/shared/standalone/log/var-log/postgres/current の出力を確認することが提案されていました。

2025-02-05 01:03:07.494 UTC [567] LOG:  received smart shutdown request
2025-02-05 01:03:08.698 UTC [567] LOG:  background worker "logical replication launcher" (PID 593) exited with exit code 1
2025-02-05 01:03:08.701 UTC [588] LOG:  shutting down
2025-02-05 01:03:08.786 UTC [567] LOG:  database system is shut down
2025-02-05 01:03:34.209 UTC [565] LOG:  starting PostgreSQL 13.14 (Debian 13.14-1.pgdg110+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2025-02-05 01:03:34.211 UTC [565] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2025-02-05 01:03:34.211 UTC [565] LOG:  listening on IPv6 address "::", port 5432
2025-02-05 01:03:34.222 UTC [565] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2025-02-05 01:03:34.261 UTC [587] LOG:  database system was shut down at 2025-02-05 01:03:08 UTC
2025-02-05 01:03:34.339 UTC [565] LOG:  database system is ready to accept connections

プロセスの停止などの言及もありましたが、現在実行中のコンテナはゼロであるため、これは私の状況には当てはまらないようです。

次に何をすべきか、私は全く見当もつきません。

このプロセスをもう一度試すことにしました。

rm -rf /var/discourse
rm -rf /var/lib/docker/volumes
docker stop app # 古いサーバーで - まだ実行中だと気づかなかった
rsync -rvzgop root@IP:/var/discourse /var
rsync -rvz root@IP:/var/lib/docker/volumes/ /var/lib/docker/volumes
chown -R messagebus:tss /var/discourse/shared/standalone/postgres_backup
chown -R messagebus:tss /var/discourse/shared/standalone/postgres_data
chown -R messagebus:tss /var/discourse/shared/standalone/postgres_data_older
./launcher rebuild app

これでうまくいったようです。デコードする必要のある以下の出力が生成されました。

拡張機能の更新を確認しています                              notice

お使いのインストールには、ALTER EXTENSION コマンドで更新する必要がある拡張機能が含まれています。
    update_extensions.sql
というファイルを実行すると、データベースのスーパーユーザーが psql でこのファイルを
実行することで、これらの拡張機能が更新されます。


アップグレード完了
----------------
オプティマイザ統計は pg_upgrade では転送されません。
新しいサーバーを起動したら、以下を実行することを検討してください。
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

このスクリプトを実行すると、古いクラスターのデータファイルが削除されます。
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
POSTGRES のアップグレード完了
古い 13 のデータベースは /shared/postgres_data_old に保存されています。

アップグレードを完了するには、以下を使用して再度再構築してください。

./launcher rebuild app
-------------------------------------------------------------------------------------

2aa0a17599100bb507a82e6b420826c135da1e06c9623408aa4579a53ece6cb2

ああ、もう一度 ./launcher rebuild app を実行する必要があっただけです。update_extensions.sql などに関する他の出力は、Discourse のアップグレードプロセスからではなく、PostgreSQL 自体からのもののようです。

2回目の再構築実行後、./launcher cleanup でクリーンアップを行い、その後以下のコマンドで vacuum/reindex を行いました。

./launcher enter app
su postgres
psql
\connect discourse
REINDEX SCHEMA CONCURRENTLY public;
VACUUM VERBOSE ANALYZE;
\q
exit
exit

解決されたようですが、古いサーバーでバックアップを取り、新しいサーバーでデータベースを復元する方がはるかに簡単だったでしょう。そうすれば、Postgresのアップグレードを行う必要がなくなり、権限の操作も不要になります。また、おそらくPostgreSQL 15のアップデートトピックで読んだであろうインデックスなどの操作も不要になります。

私はそれを意図していましたが、サイト内アップグレードで全てが完全に壊れてしまい、rsyncを使う必要がありました。
サイト内アップグレードUIのエラー出力を保存しなかったので、エラーメッセージが何だったかは思い出せませんが、フォーラムがUbuntu 20よりも新しいものを要求していたことに起因していたと思います。
最初のステップは、インプレースでdo-release-upgradeを試すことでしたが、それも失敗しました。Dockerがaufsを使用していることに関連する何か…そしてそこでの修正は、データが安全であるという感覚を残しませんでした。

インデックス作成について必ず読みます。リンクありがとうございます…この新しいサイトは遅いです:sweat_smile: