PostgreSQL 15 업데이트

성공. 이제 다음 명령을 사용하여 데이터베이스 서버를 시작할 수 있습니다:

    pg_ctlcluster 13 main start

invoke-rc.d: 현재 runlevel을 결정할 수 없습니다
invoke-rc.d: policy-rc.d가 start 실행을 거부했습니다.
postgresql-13-pgvector (0.8.0-1.pgdg120+1) 설정 중 ...
libc-bin (2.36-9+deb12u9) 트리거 처리 중 ...
postgresql-common (267.pgdg120+1) 트리거 처리 중 ...
설치된 myspell/hunspell 패키지로 PostgreSQL 사전 빌드 중...
오래된 사전 파일 제거 중:
PostgreSQL 13 데이터베이스 서버 중지: main.
PostgreSQL 15 데이터베이스 서버 중지: main.
일관성 검사 수행 중
-----------------------------
클러스터 버전 확인                                   ok

소스 클러스터가 깔끔하게 종료되지 않았습니다.
실패, 종료 중
-------------------------------------------------------------------------------------
POSTGRES 업그레이드 실패

지원이 필요하면 https://meta.discourse.org/t/postgresql-15-update/349515 을(를) 방문하세요.

그동안 ./launcher start app을 실행하여 앱을 다시 시작할 수 있습니다
-------------------------------------------------------------------------------------



실패(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
 실패, 반환 코드 #<Process::Status: pid 17 exit 1>
실패 위치: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
파라미터 {"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가 종료 코드 1로 실패
** BOOTSTRAP 실패 ** 위로 스크롤하여 이전 오류 메시지를 확인하세요. 오류가 여러 개일 수 있습니다.
./discourse-doctor가 문제를 진단하는 데 도움이 될 수 있습니다.
cbebd339ee3bd1e246300784f7825042702c1b5032877bfe580cb7f635fb852b

디스크 정보:

========================================
Discourse 3.4.0.beta3
mydomian의 Discourse 버전: Discourse 3.4.0.beta3
localhost의 Discourse 버전: Discourse 3.4.0.beta3


==================== 메모리 정보 ====================
RAM (MB): 2055

              total        used        free      shared  buff/cache   available
Mem:           1960        1463         100          43         396         255
Swap:          2047          66        1981

==================== 디스크 공간 확인 ====================
---------- OS 디스크 공간 ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G   45G   14G  77% /

---------- 컨테이너 디스크 공간 ----------
Filesystem      Size  Used Avail Use% Mounted on
overlay          59G   45G   14G  77% /
/dev/root        59G   45G   14G  77% /shared
/dev/root        59G   45G   14G  77% /var/log

==================== 디스크 정보 ====================
Disk /dev/loop0: 110.24 MiB, 115593216 bytes, 225768 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop2: 73.91 MiB, 77479936 bytes, 151328 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop3: 103.102 MiB, 109043712 bytes, 212976 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop4: 73.89 MiB, 77459456 bytes, 151288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop5: 55.68 MiB, 58363904 bytes, 113992 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop6: 63.71 MiB, 66789376 bytes, 130448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop7: 63.10 MiB, 67080192 bytes, 131016 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/xvda: 60 GiB, 64424509440 bytes, 125829120 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x15e6b846

Device     Boot Start       End   Sectors Size Id Type
/dev/xvda1 *     2048 125829086 125827039  60G 83 Linux


Disk /dev/loop8: 26.33 MiB, 27602944 bytes, 53912 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop9: 110.4 MiB, 115384320 bytes, 225360 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop10: 55.37 MiB, 58052608 bytes, 113384 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop11: 104.2 MiB, 109252608 bytes, 213384 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop13: 25.76 MiB, 26992640 bytes, 52720 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

==================== 디스크 정보 종료 ====================

재빌드 중 이 문제를 만나면 Docker를 먼저 업그레이드해야 한다는 뜻인가요?

현재 3.4.0.beta3-dev(93983286b5)를 사용 중입니다

업데이트: 다시 재빌드했는데, 이번에는 성공적으로 완료되었습니다.

2개의 좋아요

OP(원본 게시물)에 해당 사항에 대한 구체적인 설명이 있습니다.

문제가 있든 없든 Docker를 업그레이드하는 것이 좋습니다.

2개의 좋아요

제 경우에는 결국 docker를 업데이트하는 것이 해결책이었습니다.
https://stackoverflow.com/a/30794189의 안내를 따라 한 뒤, 다음 명령을 실행했습니다:
sudo service docker start

그제서야:

./launcher start app
./launcher stop app
./launcher rebuild app
3개의 좋아요

저도 이 업그레이드 작업에서 심각한 문제를 겪고 있습니다. @Vaping_Community 님과 유사하게, 저는 Postgres를 다른 마운트 볼륨(/mnt/volume_tor1_01/shared/standalone)에 설치해 두고 있습니다.

다음과 같은 오류가 발생합니다.

mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old': Device or resource busy
mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty

 [...]

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 13 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

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

제 이해로는, 해결책은 기본적으로 수동으로 디렉터리 이름을 변경하는 것입니다.
postgres_data → postgres_data_old
postgres_new → postgres_data

그 후 ./launcher rebuild app을 실행하면 된다고 생각합니다. 단순해 보이지만, 재빌드(rebuild)를 수행해도 여전히 루프에 갇혀 다음과 같은 디렉터리 구조가 생성됩니다:

  • postgres_data_older
  • postgres_data_old (이것이 postgres_data_older가 되는 것 같습니다)
  • postgres_data
  • postgres_data_new

어떤 이유로 postgres_data가 업데이트되었음을 인식하지 못하고, 다시 시도하다가 디렉터리 이동 시 실패하는 것 같습니다.

$ cat postgres_data/PG_VERSION 
15

OP(최초 게시자)에 제시된 수동 방법을 시도해 보았지만, 이 역시 실패했습니다. 도와주세요!

전체 로그
x86_64 arch detected.
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
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-23T11:41:32.477354 #1]  INFO -- : Reading from stdin
I, [2025-02-23T11:41:32.504068 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-02-23T11:41:32.508552 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-02-23T11:41:32.513290 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.517671 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.522244 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.523354 #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-23T11:41:32.523912 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.524756 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.525365 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.526239 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.526873 #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-23T11:41:32.527613 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.531734 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.532882 #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-23T11:41:32.534021 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-23T11:41:32.534342 #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-23T11:41:32.534935 #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-23T11:41:32.535476 #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
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old': Device or resource busy
mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty
I, [2025-02-23T11:42:52.303584 #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 [283 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 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [246 kB]
Get:11 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10.9 kB]
Get:12 https://dl.yarnpkg.com/debian stable/main all Packages [10.9 kB]
Get:13 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
Get:14 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5,636 B]
Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
Fetched 10.2 MB in 2s (6,490 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libllvm19 postgresql-client-13
Suggested packages:
  postgresql-doc-13
The following NEW packages will be installed:
  libllvm19 postgresql-13 postgresql-13-pgvector postgresql-client-13
0 upgraded, 4 newly installed, 0 to remove and 12 not upgraded.
Need to get 41.6 MB of archives.
After this operation, 184 MB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bookworm/main amd64 libllvm19 amd64 1:19.1.4-1~deb12u1 [25.9 MB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.20-1.pgdg120+1 [1,538 kB]
Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.20-1.pgdg120+1 [13.9 MB]
Get:4 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
Fetched 41.6 MB in 2s (18.8 MB/s)
Selecting previously unselected package libllvm19:amd64.
(Reading database ... 33363 files and directories currently installed.)
Preparing to unpack .../libllvm19_1%3a19.1.4-1~deb12u1_amd64.deb ...
Unpacking libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
Selecting previously unselected package postgresql-client-13.
Preparing to unpack .../postgresql-client-13_13.20-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-client-13 (13.20-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13.
Preparing to unpack .../postgresql-13_13.20-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13 (13.20-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 libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
Setting up postgresql-client-13 (13.20-1.pgdg120+1) ...
Setting up postgresql-13 (13.20-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 libc-bin (2.36-9+deb12u9) ...
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
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for user-defined encoding conversions              ok
Checking for user-defined postfix operators                 ok
Checking for incompatible polymorphic functions             ok
Creating dump of global objects                             ok
Creating dump of database schemas                           ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.

Performing Upgrade
------------------
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
Deleting files from new pg_xact                             ok
Copying old pg_xact to new server                           ok
Setting oldest XID for new cluster                          ok
Setting next transaction ID and epoch for new cluster       ok
Deleting files from new pg_multixact/offsets                ok
Copying old pg_multixact/offsets to new server              ok
Deleting files from new pg_multixact/members                ok
Copying old pg_multixact/members to new server              ok
Setting next multixact ID and offset for new cluster        ok
Resetting WAL archives                                      ok
Setting frozenxid and minmxid counters in new cluster       ok
Restoring global objects in the new cluster                 ok
Restoring database schemas in the new cluster               ok
Copying user relation files                                 ok
Setting next OID for new cluster                            ok
Sync data directory to disk                                 ok
Creating script to delete old cluster                       ok
Checking for extension updates                              notice

Your installation contains extensions that should be updated
with the ALTER EXTENSION command.  The file
    update_extensions.sql
when executed by psql by the database superuser will update
these extensions.


Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 13 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

./launcher rebuild app
-------------------------------------------------------------------------------------
1개의 좋아요

ARM(aarch64)에서 기본이 아닌 로케일 환경의 업그레이드

컨테이너 2개 구성의 단일 서버에서 발생한 잘못된 업그레이드를 수정하는 데 시간을 꽤 썼습니다.

  1. 해당 서버의 CPU가 ARM입니다.
  2. Discourse가 en_UK.UTF-8 로케일로 설정되어 있었습니다.

단계별로 다음과 같은 사실을 파악했습니다:

  1. tianon/postgres-upgrade:13-to-15는 ARM에서 작동하지 않습니다.
  2. 로케일 설정은 share/${CONTAINER}/postgres_data/postgresql.conf에 저장되어 있습니다.

기본 로케일이 사용되도록 확인하기 위해 데이터 컨테이너의 env: 부분을 주석 처리하는 것부터 시작했습니다.

그리고 업그레이드 난국을 타개하기 위해, en_GB와 en_US 사이의 정렬(collation) 차이가 무시할 수 있을 것이라고 가정하고 위험한 조치를 취했습니다. 클러스터 전체를 en_US로 무차별적으로 업데이트했습니다:

UPDATE pg_database SET datctype='en_US.UTF-8', datcollate='en_US.UTF-8';

이 단계가 반드시 필요한지는 확신할 수 없으며, YMMV(결과가 사람마다 다를 수 있음)입니다. 더 전문적인 분들의 의견을 듣고자 여기에 남겨두며, 다른 언어의 경우 이 작업을 전혀 권장하지 않습니다!

이후 postgresql.conf의 로케일을 교체했습니다:

sed -i -e 's/en_GB/en_US/g' shared/data/postgres_data/postgresql.conf
sudo -H -u discourse ./launcher rebuild data
...
UPGRADE OF POSTGRES COMPLETE

:tada:

쉬운 과정은 아니었습니다: 특히 제가 개입했을 당시 관리자 인터페이스가 사용 불가능했고, 마지막 백업은 6일 전에 이루어진 상태였습니다. 적절한 – 혹은 적어도 작동하는 – 해결책에 도달하기 전에 이것저것 시도해봐야 했습니다. 옵션을 탐색하는 긴 과정을 언급하지 않았습니다.

이 글이 몇몇 분들의 시간을 절약해 주기를 바랍니다.

5개의 좋아요

모든 재빌드 시 로그에서 여전히 이 메시지가 표시되고 있나요? 그렇다면 여기에서 잘못된 디렉터리를 참조하고(따라서 수동으로 이름이 변경된) 있었던 것으로 보입니다:

컨테이너의 /shared 볼륨이 호스트의 /mnt/volume_tor1_01/shared/standalone에 매핑되어 있다면, cat /mnt/volume_tor1_01/shared/standalone/postgres_data/PG_VERSION 명령은 15 대신 13을 반환해야 합니다.

개인 정보를 제거한 app.yml 파일을 공유해 주실 수 있나요?

4개의 좋아요

문제를 정확히 파악하신 것 같습니다. 제 app.yml 파일에는 다음과 같은 설정이 있습니다:

## The Docker container is stateless; all data is stored in /shared
volumes:
  - volume:
      host: /mnt/volume_tor1_01/shared/standalone
      guest: /shared
  - volume:
      host: /mnt/volume_tor1_01/shared/standalone/log/var-log
      guest: /var/log
  - volume:
      host: /var/postgres_data_discourse
      guest: /shared/postgres_data

(이 가이드 Move Uploads and Backups to DigitalOcean Block Storage 를 참고했습니다)

$ cat postgres_data/PG_VERSION 
15
$ cat /var/postgres_data_discourse/PG_VERSION 
13

따라서 이 문제의 원인이 PostgreSQL 15 업데이트 관련이므로, 이 접근 방식 PostgreSQL 15 update - #125 by Vaping_Community 로 해결될 것 같습니다.

저를 혼란스럽게 했던 것은 mnt 볼륨에 postgres_data 폴더가 여러 개 있었다는 점(리빌드를 여러 번 실행했기 때문)이고, 소스 폴더가 실제로는 /var/ 안에 있다는 사실을 인지하지 못했던 것입니다.

오늘 밤 늦게 시도해 보겠습니다.

2개의 좋아요

새 VM을 만들고 거기에 백업을 복원하는 것이 훨씬 쉬울 것입니다. 이렇게 하면 PG 업그레이드 단계를 완전히 건너뛸 수 있고, 새 사이트가 정상 작동하기 전에 기존 사이트가 손상되는 것을 방지할 수 있습니다.

8개의 좋아요

동작했어요 :slight_smile:

2개의 좋아요

UID가 변경된다는 점에 유의하세요!

/launcher enter app
x86_64 arch detected.
grep postgres /etc/passwd
postgres:x:101:104:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash

이것이 저를 당황스럽게 만들었…

네, 제게는 잘 작동했지만, OP 게시물의 최신 지침을 사용하는 것이 더 좋습니다.

내 게시물에 주석을 추가하기 위해 편집할 수 없습니다.

2개의 좋아요

나도 실패하고 있습니다.

more /var/discourse/shared/standalone/postgres_data_new/pg_upgrade_output.d/20250416T103311.340/log/pg_upgrade_server.log

-----------------------------------------------------------------
  pg_upgrade run on Wed Apr 16 10:33:11 2025
-----------------------------------------------------------------

command: "/usr/lib/postgresql/13/bin/pg_ctl" -w -l "/shared/postgres_data_new/pg_upgrade_output.d/20250416T103311.340/log/pg_upgrade_server.log" -D "/shared/postgres_data" -o 
"-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'" start >> "/shared/postgres_data_new/pg_upgrade_output.d/
20250416T103311.340/log/pg_upgrade_server.log" 2>&1
waiting for server to start....2025-04-16 10:33:11.515 UTC [1887] LOG:  starting PostgreSQL 13.20 (Debian 13.20-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12
.2.0-14) 12.2.0, 64-bit
2025-04-16 10:33:11.517 UTC [1887] LOG:  listening on Unix socket "/var/lib/postgresql/.s.PGSQL.50432"
2025-04-16 10:33:11.525 UTC [1887] LOG:  could not open configuration file "/etc/postgresql/13/main/pg_hba.conf": No such file or directory
2025-04-16 10:33:11.525 UTC [1887] FATAL:  could not load pg_hba.conf
2025-04-16 10:33:11.526 UTC [1887] LOG:  database system is shut down

/etc/postgresql/13/main/pg_hba.conf 파일을 찾지 못하는 것 같습니다. 실제로도 해당 위치에 파일이 없으므로 맞는 말입니다. 하지만 파일은 여러 위치에 존재합니다:

/var/discourse/shared/standalone/postgres_data_older/pg_hba.conf
/var/discourse/shared/standalone/postgres_data_new/pg_hba.conf
/var/discourse/shared/standalone/postgres_data/pg_hba.conf
/var/lib/docker/overlay2/6514156241efd883dd59b27a0275ba1cc73a7365fb78c5782536a39ee2d6d641/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/8afed861b039e5a366dc9a5513cd7df5a958d86a41f05063ce5256fb9f8fdfec/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/fa8893e9f714439469d391635d8882b345e90705a886d74cf6fea8d5460df3f0/diff/etc/postgresql/15/main/pg_hba.conf
/var/lib/docker/overlay2/e4eec92eb7b181648ca2bc6744ac3af0935745b75b1abe89170fc4b82a8eca42/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/4cd3189b9d554b1c60891dc5d48cc670e5d7d847ec5a0f2dfa91ad7f66b3a211/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/0db2210fc76fce6f41912183f744517154f46af15a0b1a1e976999eabbd801d9/diff/etc/postgresql/15/main/pg_hba.conf
/var/postgres_data/postgres_data_new/pg_hba.conf
/var/postgres_data/pg_hba.conf

어떤 힌트를 주실 수 있을까요?

사용자님의 docker run… 명령어를 시도해 보았더니 다음과 같은 결과가 나타납니다:

클러스터 버전 확인 중
기존 클러스터 데이터 및 바이너리 디렉터리가 서로 다른 주요 버전입니다.

Docker 버전이 얼마인가요? OS 버전은 어떻게 되나요? 새로운 VM으로 옮기는 것이 종종 더 쉽다는 걸 발견했습니다.

Docker 버전: 28.0.4
Linux 버전: 5.15.0-131-generic

app.yml 파일에서 postgres 13 템플릿으로 변경해 볼 수 있습니다.

그 파일은 컨테이너 내부에 있습니다. 컨테이너 밖을 보고 계신 거예요.

Discourse를 업그레이드하려고만 했는데, 진행은 잘 되었고, 지금은 다음과 같은 상태입니다:

templates:
  - "templates/postgres.13.template.yml"

이렇게 하면 Postgres를 업그레이드할 수 없다는 뜻이 아닌가요?

이제 원래 템플릿으로 되돌려서 다시 시도해 볼 수 있을 것 같습니다. 저는 새 VM으로 옮기겠지만, 원하시면 다시 시도해 보셔도 됩니다.

첫 번째 게시글에 설명된 대로 Postgres를 수동으로 업그레이드했지만, 같은 문제로 인해 다시 빌드되지 않아 템플릿을 postgres.template.yml로 되돌릴 수 없습니다:

2025-04-16 13:40:07.815 UTC [1888] LOG: could not open configuration file “/etc/postgresql/13/main/pg_hba.conf”: No such file or directory
2025-04-16 13:40:07.815 UTC [1888] FATAL: could not load pg_hba.conf

앞으로 문제가 발생하지 않기를 바라며 버전 13을 유지할 것입니다.
@pfaffman 님, 감사합니다.

업그레이드를 실행하려고 했는데, 존재하는 것을 확인한 파일을 찾을 수 없어 실패하고 있습니다:

로그의 끝 + 파일 확인

-----------------------------
Checking cluster versions                                   ok
 
*failure*
Consult the last few lines of "/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log" for
the probable cause of the failure.
 
connection to server on socket "/var/lib/postgresql/.s.PGSQL.50432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
 
could not connect to source postmaster started with the command:
"/usr/lib/postgresql/13/bin/pg_ctl" -w -l "/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log" -D "/shared/postgres_data" -o "-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'" start
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 17 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.
afa058b1ff7d14d9469fe27bc39dc08562c4e249bdf7c7e153b4030a1bb0dbc2
root@amcforum:/var/discourse# ./launcher start app && ./launcher enter app
x86_64 arch detected.
 
starting up existing container
+ /usr/bin/docker start app
app
x86_64 arch detected.
root@amcforum-app:/var/www/discourse# cat /shared/postgres_data_new/pg_upgrade_output.d/0250605T024052.178/log/pg_upgrade_server.log 
-----------------------------------------------------------------
  pg_upgrade run on Thu Jun  5 02:40:52 2025
-----------------------------------------------------------------
 
command: "/usr/lib/postgresql/13/bin/pg_ctl" -w -l "/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log" -D "/shared/postgres_data" -o "-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'" start >> "/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log" 2>&1
waiting for server to start....2025-06-05 02:40:52.313 UTC [1886] LOG:  starting PostgreSQL 13.21 (Debian 13.21-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
2025-06-05 02:40:52.316 UTC [1886] LOG:  listening on Unix socket "/var/lib/postgresql/.s.PGSQL.50432"
2025-06-05 02:40:52.324 UTC [1886] LOG:  could not open configuration file "/etc/postgresql/13/main/pg_hba.conf": No such file or directory
2025-06-05 02:40:52.324 UTC [1886] FATAL:  could not load pg_hba.conf
2025-06-05 02:40:52.327 UTC [1886] LOG:  database system is shut down
 stopped waiting
pg_ctl: could not start server
Examine the log output.
 
 
root@amcforum-app:/var/www/discourse# ls -lah "/etc/postgresql/13/main/pg_hba.conf"
-rw-r----- 1 postgres postgres 4.8K Jan  3 13:02 /etc/postgresql/13/main/pg_hba.conf
root@amcforum-app:/var/www/discourse#
1개의 좋아요