자체 호스팅 사용자를 위한 PostgreSQL 18 업데이트

:warning: 경고! 업그레이드에 상당한 자유 디스크 공간(데이터베이스 크기의 2배)이 필요합니다.

Docker 이미지를 PostgreSQL 18로 업그레이드하기 위한 변경 사항을 적용했습니다. 커맨드 라인에서 Discourse를 다시 빌드하는 사이트 관리자는 이전의 PostgreSQL 15에서 PostgreSQL 18로 업그레이드됩니다. 참고로, 2025년에 PostgreSQL 15 업데이트가 진행되었을 때 업그레이드를 보류하셨다면, 해당 업그레이드를 건너뛰고 바로 PostgreSQL 18로 이동할 수 있습니다.

이전에 업그레이드를 보류하셨다면, app.yml의 PostgreSQL 템플릿을 templates/postgres.13.template.yml에서 templates/postgres.template.yml로 변경하십시오.

모든 업그레이드와 마찬가지로, 작업을 수행하기 전에 백업을 만드는 것이 강력히 권장됩니다.

로케일 변경

이전에는 OS 업그레이드와 같은 상황에서 glibc가 업데이트될 때 인덱스 손상 현상이 발생했습니다. PostgreSQL 17부터는 OS의 glibc와 분리되어 버전 간에 안정성을 유지하는 새로운 내장 로케일 제공자가 도입되었습니다. 이번 업그레이드의 일환으로 C.UTF-8 로케일을 사용하여 이 내장 제공자로 전환합니다. 이 로케일은 코드 포인트 순서를 사용하며, aforementioned 안정성 이유로 인해 이를 권장합니다.

로케일 변경을 수행하려면 먼저 내장 로케일 제공자를 사용하여 새로운 DB 클러스터를 생성한 다음, DB를 덤프하고 이 클러스터로 복원해야 합니다. 이 때문에 이전의 인플레이스(in-place) 업그레이드와 달리 디스크 공간 요구 사항이 더 큽니다.

업데이트

공식 설치 가이드 (단일 컨테이너)

다음 재빌드 시 끝에 다음 메시지가 표시됩니다:

-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 15 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

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

이는 업그레이드가 정상적으로 완료되었음을 의미합니다. 사이트를 다시 실행 상태로 돌리기 위해 새로운 재빌드를 수행하기만 하면 됩니다.

데이터 컨테이너 설치

discourse_docker 저장소에 제공된 샘플을 기반으로 한 전용 데이터 컨테이너가 있는 설정을 사용 중이라면, PostgreSQL을 안전하고 깨끗하게 종료하는지 확인해야 합니다.

요즘에는 몇 분 동안 실행되는 쿼리를 실행하는 백그라운드 작업이 있으므로, 웹 컨테이너를 종료하면 데이터 컨테이너가 안전하게 종료되도록 도울 수 있습니다.

./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only

데이터 컨테이너에 대한 첫 번째 재빌드를 수행하기 전에, PostgreSQL 로그를 tail하여 올바르게 종료되었는지 확인할 수 있습니다.

tail -f shared/standalone/log/var-log/postgres/current을 실행하면 깨끗하게 종료된 경우 다음 로그가 표시됩니다:

2025-01-24 09:19:06.437 UTC [37] LOG:  received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG:  background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG:  shutting down
2025-01-24 09:19:06.468 UTC [37] LOG:  database system is shut down

업데이트 보류

다음 재빌드 시 업데이트를 보류해야 하는 경우, app.yml 파일에서 "templates/postgres.template.yml""templates/postgres.15.template.yml"으로 변경하여 PostgreSQL 템플릿을 교체할 수 있습니다.

이후 변경 사항을 되돌리는 것을 잊을 수 있으므로 이 방법은 권장되지 않습니다.

업데이트 후 선택적 작업

PostgreSQL 통계 최적화

업데이트 후 새로운 PostgreSQL에는 테이블 통계를 보유하지 않습니다. 다음을 사용하여 생성할 수 있습니다:

docker exec -u postgres app \
	/usr/lib/postgresql/18/bin/vacuumdb -d discourse --analyze-in-stages

오래된 데이터 정리

표준 설치의 경우, 다음 명령을 사용하여 PG15 형식의 오래된 데이터를 삭제할 수 있습니다:

cd /var/discourse
./launcher cleanup

별도의 데이터 컨테이너가 있는 경우, 다음과 같이 백업 카피를 제거해야 합니다:

rm -fr /var/discourse/shared/data/postgres_data_old/

FAQ

소스 클러스터가 깨끗하게 종료되지 않았습니다

위와 같은 메시지와 함께 업그레이드가 실패하면, 더 나은 상태로 복원하기 위해 더 간단한 방법을 시도해 볼 수 있습니다.

./launcher start app으로 구 컨테이너를 다시 시작하십시오. 몇 분간 기다렸다가 다시 실행될 때까지 기다립니다.

이제 ./launcher stop app으로 다시 종료하십시오. 그런 다음 로그를 tail하여 깨끗하게 종료되었는지 확인하십시오:

tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG:  received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG:  background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG:  shutting down
2025-01-24 09:19:06.468 UTC [37] LOG:  database system is shut down

로그에 데이터베이스가 종료되었음을 나타내는 내용이 없다면, 구 컨테이너를 다시 시작하고 ./launcher enter app으로 진입하여 다음 명령을 실행한 후 완료되면 다시 로그를 tail하십시오.

export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit

로그가 위와 같다면 이제 ./launcher rebuild app을 사용하여 다시 업그레이드를 시도할 수 있습니다.

데이터베이스 "postgres"의 lc_collate 값이 일치하지 않습니다

이 오류는 데이터베이스에 기본이 아닌 로케일을 사용하는 경우 발생합니다. 성공하려면 3개의 변수가 필요하다는 보고가 있습니다. app.yml 파일의 env: 섹션에 다음 3줄이 있는지 확인하십시오:

  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

en_US.UTF-8을 사용자의 로케일로 변경하십시오.

모든 재빌드에서 업그레이드가 다시 실행되는 경우 (즉, 업그레이드 루프)

이것이 발생하면 업그레이드 로그에 다음 내용이 포함됩니다:

mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty

이는 이전 업그레이드에서 남은 파일이 여전히 남아 있음을 의미합니다. 계속하기 전에 이 파일들을 다른 곳으로 이동하십시오.

PostgreSQL 15 업데이트를 건너뛴 경우, 이제 어떻게 해야 합니까?

이 가이드 상단의 표준 지침을 따르시면 현재 버전에서 18로 문제 없이 업그레이드됩니다.

21개의 좋아요

완벽하네요, 크리스! 감사합니다!

1개의 좋아요

디스크의 사용 가능한 공간이 부족할 경우, 어떤 종류의 hopefully 우아한 실패가 발생합니까? 반드시 그 경로를 실행해 볼 사람이 생길 것입니다!

사용 가능한 디스크 공간이 부족한 경우, 백업을 수행한 후 새로운 설치 환경에 복원하여 마이그레이션으로 사용하는 것이 작동할까요?

(이 경우 운영 체제의 새로운 LTS 버전으로 업그레이드하는 것도 좋은 시기가 될 수 있습니다. Ubuntu 26.04는 아직 비교적 새로운 버전이며, 26.04.1은 곧 출시될 예정입니다. 기존 위치에 업그레이드를 시도하는 것보다 운영 체제를 새로 설치하는 것이 덜 문제일 수 있습니다.)

4개의 좋아요

저도 그랬을 텐데, 이 게시물에 대한 이메일 알림을 받지 않았다면요 :raised_back_of_hand: :flushed_face:

1개의 좋아요

확인차 묻는데, 지금 바로 적용된 상태인가요?

오늘 오전에 명령줄을 통해 업데이트를 진행하면 이 모든 과정이 수행되나요?

업그레이드 스크립트는 자유 공간을 확인하고 안전할 경우에만 진행합니다.

디스크 공간이 치명적으로 부족해질 수 있는 과정은 두 단계가 있습니다. 자유 공간 확인을 우회할 경우, 다음과 같은 곳에서 문제가 발생할 수 있습니다:

  1. pg_dump를 실행하여 기존 DB에서 데이터를 추출할 때 (이 시점에 DB 저장 공간의 2배가 필요합니다).
  2. pg_restore를 실행하여 데이터를 새 DB에 다시 삽입할 때 (이 시점에 DB 저장 공간의 3배가 필요합니다).

이 상태로부터 복구하려면 /shared/postgres_dump/shared/postgres_data_new를 제거해야 합니다.

업그레이드 종료 시 임시 pg_dump 파일은 제거하지만, 만에 하나를 대비하여 업그레이드 전 DB 데이터는 /shared/postgres_data_old에 유지해 둡니다. 모든 것이 정상적으로 작동하는지 확인한 후에는 디스크 공간을 확보하기 위해 해당 디렉터리를 제거하는 것이 좋습니다.

PG15 사이트에서 Discourse 백업을 받아 PG18 사이트에 복원하는 것을 테스트해 보았습니다. 저에게는 잘 작동했지만, 이는 공식적으로 지원되는 방법이 아님을 유의하세요. 먼저 프로덕션이 아닌 환경에서 철저히 테스트하고 롤백 경로를 확보해 두세요!

업그레이드 스크립트가 사용하는 과정을 연구해 볼 것을 권장합니다. 특수한 저장 요구 사항이 있다면 이를 필요에 맞게 조정할 수 있을 것입니다. 역시 먼저 테스트하세요:

네, 이 기능은 현재 discourse_docker에 적용되어 있습니다. main을 가져오거나 ./launcher rebuild app을 실행하면 해당 기능을 사용할 수 있습니다.

원하는 경우 업그레이드를 보류할 때 의도치 않은 업그레이드를 방지하는 데 도움이 됩니다 discourse_docker를 main 브랜치에서 전환하세요.

4개의 좋아요

"매우 크다"가 구체적으로 무엇을 의미하는지 설명해 주실 수 있을까요?

이것은 데이터베이스 여분의 3배 크기가 필요하다는 뜻으로 읽힙니다. 크기가 얼마든 말이죠?

1개의 좋아요

죄송합니다. 해당 경고 문구가 부자연스럽고 정확하지 않았습니다.

디스크에 이미 존재하는 DB 외에, 덤프 출력 파일과 복원 중인 새 DB 사본을 위한 충분한 여유 공간이 필요합니다. pg_dump의 출력 파일은 일반적으로 DB 데이터 디렉터리보다 작으므로, 현재 DB 크기의 2배만큼의 여유 공간이면 충분할 것입니다. 업그레이드 스크립트에서 이 부분을 수정하겠습니다.

수정: 여유 공간 체크가 이제 3배가 아닌 2배의 DB 크기를 기준으로 확인하도록 업데이트되었습니다.

3개의 좋아요

싱글 코어 VM에서는 다음 제한 사항 때문에 PG15 postgres.15.template.yml을 유지해야 하는 것 같습니다:

pg_dump: error: -j/--jobs must be in range 1..2147483647

또는 web.template.yml-j1로 패치하여 CPU 1개를 사용하도록 설정할 수 있습니다. (다음 재빌드 시 기본값으로 돌아갑니다.)

네, 이런 구성도 존재합니다! :blob_wave:

nproc 계산 방식 때문에 이 오류가 발생했습니다 (단일 vCPU 환경에서 실행 중입니다): -j/–jobs 값은 1..2147483647 범위에 있어야 합니다 ($(($(nproc) - 1))이 1 - 1 = 0이 되어 -j0을 시도하고 있습니다)

업데이트 스크립트는 다음과 같이 수정되어야 할 것 같습니다: -j$(( $(nproc) > 1 ? $(nproc) - 1 : 1 ))

3개의 좋아요

서버 중 하나에서 다음과 같은 문제가 발생했습니다:

저는 다음과 같이 디렉토리를 이동하여 이 문제를 해결했습니다:

cd /var/discourse/shared/standalone
mv postgres_data_older postgres_data_oldest
mv postgres_data_old postgres_data_older

그 후 ./launcher rebuild app 실행이 다음과 같은 메시지와 함께 완료되었습니다:

-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 15 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

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

다른 서버에서 pg_dump 관련 오류가 발생했습니다:

x86_64 arch detected.
Ensuring launcher is up to date
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20260803-0122: Pulling from discourse/base
Digest: sha256:ab1e7217470759e63313a16bc5b71b9f2dd7d3ae8303286e5985f563ad12b7b3
Status: Image is up to date for discourse/base:2.0.20260803-0122
docker.io/discourse/base:2.0.20260803-0122
/usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups.rb
/usr/local/bin/pups --stdin
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_GB.UTF-8)
I, [2026-08-03T09:02:29.698631 #1]  INFO -- : Reading from stdin
I, [2026-08-03T09:02:29.724575 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2026-08-03T09:02:29.737296 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2026-08-03T09:02:29.750650 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2026-08-03T09:02:29.763301 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2026-08-03T09:02:29.775620 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2026-08-03T09:02:29.777021 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/18/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.778673 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.780140 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.781699 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.783144 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.784461 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.785820 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.787120 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.788468 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/18/main/postgresql.conf
I, [2026-08-03T09:02:29.789816 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/18/main/pg_hba.conf
I, [2026-08-03T09:02:29.790932 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/18/main/pg_hba.conf
I, [2026-08-03T09:02:29.792274 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/18/main/pg_hba.conf
I, [2026-08-03T09:02:29.793638 #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

/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_GB.UTF-8)
Generating locales (this might take a while)...
  en_GB.UTF-8... done
  en_US.UTF-8... done
Generation complete.
2026/08/03 09:02:33 socat[35] E connect(, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): Connection refused
Upgrading PostgreSQL from version 15 to 18
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 this locale configuration:
  locale provider:   builtin
  default collation: C.UTF-8
  LC_COLLATE:  C.UTF-8
  LC_CTYPE:    C.UTF-8
  LC_MESSAGES: C.UTF-8
  LC_MONETARY: C.UTF-8
  LC_NUMERIC:  C.UTF-8
  LC_TIME:     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 /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

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.

Success. You can now start the database server using:

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

Get:1 http://deb.debian.org/debian bookworm-backports InRelease [59.4 kB]
Hit:2 http://deb.debian.org/debian bookworm InRelease
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Hit:4 http://deb.debian.org/debian-security bookworm-security InRelease
Hit:5 https://deb.nodesource.com/node_22.x nodistro InRelease
Hit:6 https://dl.yarnpkg.com/debian stable InRelease
Hit:7 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease
Fetched 115 kB in 1s (77.2 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following NEW packages will be installed:
  postgresql-15 postgresql-15-pgvector
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 15.2 MB of archives.
After this operation, 52.6 MB of additional disk space will be used.
Get:1 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-15 amd64 15.18-1.pgdg12+1 [15.0 MB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-15-pgvector amd64 0.8.6-1.pgdg12+1 [271 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 15.2 MB in 1s (29.8 MB/s)
Selecting previously unselected package postgresql-15.
(Reading database ... 32784 files and directories currently installed.)
Preparing to unpack .../postgresql-15_15.18-1.pgdg12+1_amd64.deb ...
Unpacking postgresql-15 (15.18-1.pgdg12+1) ...
Selecting previously unselected package postgresql-15-pgvector.
Preparing to unpack .../postgresql-15-pgvector_0.8.6-1.pgdg12+1_amd64.deb ...
Unpacking postgresql-15-pgvector (0.8.6-1.pgdg12+1) ...
Setting up postgresql-15 (15.18-1.pgdg12+1) ...
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-15-pgvector (0.8.6-1.pgdg12+1) ...
Processing triggers for postgresql-common (293.pgdg12+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Creating new PostgreSQL cluster 15/main ...
/usr/lib/postgresql/15/bin/initdb -D /var/lib/postgresql/15/main --auth-local peer --auth-host scram-sha-256 --no-instructions
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_GB.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/15/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
Stopping PostgreSQL 15 database server: main.
Stopping PostgreSQL 18 database server: main.
waiting for server to start....2026-08-03 09:02:47.642 UTC [1145] LOG:  starting PostgreSQL 15.18 (Debian 15.18-1.pgdg12+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14+deb12u1) 12.2.0, 64-bit
2026-08-03 09:02:47.643 UTC [1145] LOG:  listening on IPv6 address "::1", port 5432
2026-08-03 09:02:47.644 UTC [1145] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2026-08-03 09:02:47.647 UTC [1145] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2026-08-03 09:02:47.664 UTC [1148] LOG:  database system was interrupted; last known up at 2026-08-03 08:59:02 UTC
2026-08-03 09:02:48.205 UTC [1148] LOG:  database system was not properly shut down; automatic recovery in progress
2026-08-03 09:02:48.212 UTC [1148] LOG:  invalid record length at 12/F5C779B0: wanted 24, got 0
2026-08-03 09:02:48.213 UTC [1148] LOG:  redo is not required
2026-08-03 09:02:48.218 UTC [1146] LOG:  checkpoint starting: end-of-recovery immediate wait
2026-08-03 09:02:48.230 UTC [1146] LOG:  checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.004 s, sync=0.002 s, total=0.013 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB
2026-08-03 09:02:48.252 UTC [1145] LOG:  database system is ready to accept connections
 done
server started
pg_dump: error: -j/--jobs must be in range 1..2147483647
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED
Failed on: su postgres -c "/usr/lib/postgresql/${PG_MAJOR_OLD}/bin/pg_dump -Fd -j$(($(nproc) - 1)) discourse -f /shared/postgres_dump/discourse"

Please visit https://meta.discourse.org/t/postgresql-18-update/406194 for support.

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


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.4.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in 'Pups::ExecCommand#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
---
HINT: The plugin 'discourse-calendar' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-calendar' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-templates' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-templates' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-policy' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-policy' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
** 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.
d2f4b0c8ce1d67917f88c87da7d3fd8886b2b3c93800e30ae6d8ceeeb131a419

이것은 위와 동일한 오류이며 그 위의 게시물과도 같습니다. @Nacho_Caballero의 제안에 따라 ./templates/web.template.yml을 편집하여 210번째 줄을 변경해 보았습니다:


  - exec:
      cd: $home
      tag: build
      hook: bundle_exec
      cmd:
        # - su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
        - su discourse -c 'bundle install --jobs $(( $(nproc) > 1 ? $(nproc) - 1 : 1 )) --retry 3'
        - su discourse -c 'bundle clean'
        - su discourse -c 'find /var/www/discourse/vendor/bundle -name cache -not -path "*/gems/*" -type d -exec rm -rf {} +'
        - su discourse -c 'find /var/www/discourse/vendor/bundle -name tmp -type d -exec rm -rf {} +'

하지만 실패하여 다시 다음과 같이 편집했습니다:

  - exec:
      cd: $home
      tag: build
      hook: bundle_exec
      cmd:
        # - su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
        # - su discourse -c 'bundle install --jobs $(( $(nproc) > 1 ? $(nproc) - 1 : 1 )) --retry 3'
        - su discourse -c 'bundle install --jobs 1 --retry 3'
        - su discourse -c 'bundle clean'
        - su discourse -c 'find /var/www/discourse/vendor/bundle -name cache -not -path "*/gems/*" -type d -exec rm -rf {} +'
        - su discourse -c 'find /var/www/discourse/vendor/bundle -name tmp -type d -exec rm -rf {} +'

하지만 여전히 다음과 같은 오류가 발생했습니다:

pg_dump: error: -j/--jobs must be in range 1..2147483647
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED
Failed on: su postgres -c "/usr/lib/postgresql/${PG_MAJOR_OLD}/bin/pg_dump -Fd -j$(($(nproc) - 1)) discourse -f /shared/postgres_dump/discourse"

Please visit https://meta.discourse.org/t/postgresql-18-update/406194 for support.

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

여러 파일을 편집해야 하기 때문입니다:

grep -l nproc templates/*.yml
templates/postgres.18.template.yml
templates/postgres.template.yml
templates/web.template.yml

세 파일 모두를 vim으로 열고 nproc을 검색하십시오:

vim $(grep -l nproc templates/*.yml|xargs)

templates/postgres.18.template.yml의 154번과 160번 줄:

          # su postgres -c "/usr/lib/postgresql/${PG_MAJOR_OLD}/bin/pg_dump -Fd -j$(($(nproc) - 1)) discourse -f /shared/postgres_dump/discourse"
          su postgres -c "/usr/lib/postgresql/${PG_MAJOR_OLD}/bin/pg_dump -Fd -j1) discourse -f /shared/postgres_dump/discourse"

          # su postgres -c "/usr/lib/postgresql/18/bin/pg_restore -e -j$(($(nproc) - 1)) -d discourse /shared/postgres_dump/discourse"
          su postgres -c "/usr/lib/postgresql/18/bin/pg_restore -e -j1 -d discourse /shared/postgres_dump/discourse"

그리고 templates/postgres.template.yml의 155번과 161번 줄:

          # su postgres -c "/usr/lib/postgresql/${PG_MAJOR_OLD}/bin/pg_dump -Fd -j$(($(nproc) - 1)) discourse -f /shared/postgres_dump/discourse"
          su postgres -c "/usr/lib/postgresql/${PG_MAJOR_OLD}/bin/pg_dump -Fd -j1 discourse -f /shared/postgres_dump/discourse"

          # su postgres -c "/usr/lib/postgresql/18/bin/pg_restore -e -j$(($(nproc) - 1)) -d discourse /shared/postgres_dump/discourse"
          su postgres -c "/usr/lib/postgresql/18/bin/pg_restore -e -j1 -d discourse /shared/postgres_dump/discourse"

그리고 templates/web.template.yml의 209번 줄:

        # - su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
        - su discourse -c 'bundle install --jobs 1 --retry 3'

그리고 나서 모든 것이 정상 작동했습니다.

그러나 어떤 서버에서는 다음과 같은 루프에 빠졌습니다:

x86_64 arch detected.
Ensuring launcher is up to date
Updating Launcher...
Updating 0949304..7de2cf5
error: Your local changes to the following files would be overwritten by merge:
	templates/postgres.18.template.yml
	templates/postgres.template.yml
Please commit your changes or stash them before you merge.
Aborting

따라서 편집 내용을 stash하고, 코드를 업데이트한 후, ./launcher rebuild app을 다시 시도하기 전에 편집 내용을 다시 적용했습니다:

git stash
git pull
git stash drop

한 서버에서는 다음과 같은 상황이 발생했습니다:

-------------------------------------------------------------------------------------
WARNING: Upgrading PostgreSQL would require an additional 896M of disk space
Please free up some space, or expand your disk, before continuing.

To avoid upgrading change "templates/postgres.template.yml" TO "templates/postgres.15.template.yml" in containers/app.yml

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

따라서 다시 시도하기 전에 디스크를 확장해야 했습니다.

이 문제를 해결하는 데 도움을 주신 @Nacho_Caballero님과 @Ivan_Rapekas님께 감사드립니다 :slight_smile:

업데이트

PostgreSQL 템플릿 파일은 이제 @chrisr님에 의해 수정되었습니다. 감사합니다! 따라서 위에서 제가 한 변경 사항을 되돌리기 위해 다음을 실행했습니다:

git stash
git pull
git stash drop
3개의 좋아요

로컬 docker 개발 환경에서 최신 release/2026.7 브랜치를 가져왔습니다

d/shutdown_dev

d/boot_dev

그런 다음 실행했습니다

d/rails s

아래와 같은 오류가 발생했는데, 어떻게 해야 하나요?

singi@GL-D-009011A:~/discourse$ d/rails s
Starting Pitchfork...
Starting CSS change watcher
URGENT: Failed to initialize site default: ActiveRecord::ConnectionNotEstablished connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
connection to server on socket "/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?

/src/config/initializers/000-pg_connection_patch.rb:35:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.new_client'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql_adapter.rb:944:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#connect'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql_adapter.rb:956:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#reconnect'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:670:in 'block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:1224:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:669:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:668:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:778:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:766:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:786:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:992:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:991:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/quoting.rb:128:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting#quote_string'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract/quoting.rb:76:in 'ActiveRecord::ConnectionAdapters::Quoting#quote'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/quoting.rb:122:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting#quote'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/schema_statements.rb:1142:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements#quoted_scope'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/schema_statements.rb:1119:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements#data_source_sql'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:60:in 'ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?'
/src/lib/site_settings/db_provider.rb:58:in 'SiteSettings::DbProvider#table_exists?'
/src/lib/site_settings/db_provider.rb:14:in 'SiteSettings::DbProvider#all'
/src/lib/site_setting_extension.rb:1286:in 'SiteSettingExtension#fetch_setting_hash_from_provider'
/src/lib/site_setting_extension.rb:602:in 'block in SiteSettingExtension#refresh!'
/src/lib/site_setting_extension.rb:598:in 'Thread::Mutex#synchronize'
/src/lib/site_setting_extension.rb:598:in 'SiteSettingExtension#refresh!'
/src/config/initializers/005-site_settings.rb:19:in 'block (2 levels) in '<main>'
/src/lib/freedom_patches/rails_multisite.rb:15:in 'block in RailsMultisite::ConnectionManagement.safe_each_connection'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in 'RailsMultisite::ConnectionManagement::NullInstance#with_connection'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:36:in 'RailsMultisite::ConnectionManagement::NullInstance#each_connection'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in 'RailsMultisite::ConnectionManagement.each_connection'
/src/lib/freedom_patches/rails_multisite.rb:9:in 'RailsMultisite::ConnectionManagement.each_active_connection'
/src/lib/freedom_patches/rails_multisite.rb:14:in 'RailsMultisite::ConnectionManagement.safe_each_connection'
/src/config/initializers/005-site_settings.rb:18:in 'block in <main>'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:406:in 'BasicObject#instance_exec'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:406:in 'block in ActiveSupport::Callbacks::CallTemplate::InstanceExec0#make_lambda'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:178:in 'block in ActiveSupport::Callbacks::Filters::Before#call'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:668:in 'block (2 levels) in ActiveSupport::Callbacks::CallbackChain#default_terminator'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:667:in 'Kernel#catch'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:667:in 'block in ActiveSupport::Callbacks::CallbackChain#default_terminator'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:179:in 'ActiveSupport::Callbacks::Filters::Before#call'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'block in ActiveSupport::Callbacks::CallbackSequence#invoke_before'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'Array#each'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'ActiveSupport::Callbacks::CallbackSequence#invoke_before'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:108:in 'ActiveSupport::Callbacks#run_callbacks'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/reloader.rb:96:in 'ActiveSupport::Reloader.prepare!'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/application/finisher.rb:73:in 'block in <module:Finisher>'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:32:in 'BasicObject#instance_exec'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:32:in 'Rails::Initializable::Initializer#run'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:61:in 'block in Rails::Initializable#run_initializers'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:231:in 'block in TSort.tsort_each'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:353:in 'block (2 levels) in TSort.each_strongly_connected_component'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:434:in 'TSort.each_strongly_connected_component_from'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:352:in 'block in TSort.each_strongly_connected_component'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'Rails::Initializable::Collection#each'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'Method#call'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'TSort.each_strongly_connected_component'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:229:in 'TSort.tsort_each'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:208:in 'TSort#tsort_each'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:60:in 'Rails::Initializable#run_initializers'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/application.rb:444:in 'Rails::Application#initialize!'
/src/config/environment.rb:7:in '<top (required)>'
/usr/local/lib/ruby/3.4.0/bundled_gems.rb:82:in 'Kernel.require'
/usr/local/lib/ruby/3.4.0/bundled_gems.rb:82:in 'block (2 levels) in Kernel#replace_require'
config.ru:8:in 'block in <main>'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/rack-2.2.23/lib/rack/builder.rb:125:in 'BasicObject#instance_eval'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/rack-2.2.23/lib/rack/builder.rb:125:in 'Rack::Builder#initialize'
config.ru:3:in 'Class#new'
config.ru:3:in '<main>'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:91:in 'Kernel#eval'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:91:in 'block in Pitchfork.builder'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:1160:in 'Pitchfork::HttpServer#build_app!'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:694:in 'block in Pitchfork::HttpServer#spawn_initial_mold'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:170:in 'block in Pitchfork.clean_fork'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Kernel#catch'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Pitchfork.clean_fork'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:690:in 'Pitchfork::HttpServer#spawn_initial_mold'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:176:in 'Pitchfork::HttpServer#start'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/exe/pitchfork:110:in '<top (required)>'
/src/bin/pitchfork:58:in 'Kernel#load'
/src/bin/pitchfork:58:in 'block in <main>'
/src/bin/pitchfork:58:in 'Kernel#fork'
/src/bin/pitchfork:58:in '<main>'
/src/config/initializers/000-pg_connection_patch.rb:35:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.new_client': connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory (ActiveRecord::ConnectionNotEstablished)
        Is the server running locally and accepting connections on that socket?
connection to server on socket "/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?

        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql_adapter.rb:944:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#connect'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql_adapter.rb:956:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#reconnect'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:670:in 'block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:1224:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:669:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:668:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:778:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:766:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:786:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:992:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:991:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/quoting.rb:128:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting#quote_string'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract/quoting.rb:76:in 'ActiveRecord::ConnectionAdapters::Quoting#quote'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/quoting.rb:122:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting#quote'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/schema_statements.rb:1142:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements#quoted_scope'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/schema_statements.rb:1119:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements#data_source_sql'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:45:in 'ActiveRecord::ConnectionAdapters::SchemaStatements#data_source_exists?'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/schema_migration.rb:102:in 'block in ActiveRecord::SchemaMigration#table_exists?'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in 'ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/schema_migration.rb:101:in 'ActiveRecord::SchemaMigration#table_exists?'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/migration.rb:1282:in 'ActiveRecord::MigrationContext#get_all_versions'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/migration.rb:1299:in 'ActiveRecord::MigrationContext#pending_migration_versions'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/migration.rb:1295:in 'ActiveRecord::MigrationContext#needs_migration?'
        from /src/config/initializers/100-flags.rb:6:in 'block in <main>'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:406:in 'BasicObject#instance_exec'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:406:in 'block in ActiveSupport::Callbacks::CallTemplate::InstanceExec0#make_lambda'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:178:in 'block in ActiveSupport::Callbacks::Filters::Before#call'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:668:in 'block (2 levels) in ActiveSupport::Callbacks::CallbackChain#default_terminator'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:667:in 'Kernel#catch'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:667:in 'block in ActiveSupport::Callbacks::CallbackChain#default_terminator'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:179:in 'ActiveSupport::Callbacks::Filters::Before#call'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'block in ActiveSupport::Callbacks::CallbackSequence#invoke_before'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'Array#each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'ActiveSupport::Callbacks::CallbackSequence#invoke_before'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:108:in 'ActiveSupport::Callbacks#run_callbacks'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/reloader.rb:96:in 'ActiveSupport::Reloader.prepare!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/application/finisher.rb:73:in 'block in <module:Finisher>'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:32:in 'BasicObject#instance_exec'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:32:in 'Rails::Initializable::Initializer#run'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:61:in 'block in Rails::Initializable#run_initializers'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:231:in 'block in TSort.tsort_each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:353:in 'block (2 levels) in TSort.each_strongly_connected_component'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:434:in 'TSort.each_strongly_connected_component_from'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:352:in 'block in TSort.each_strongly_connected_component'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'Rails::Initializable::Collection#each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'Method#call'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'TSort.each_strongly_connected_component'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:229:in 'TSort.tsort_each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:208:in 'TSort#tsort_each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:60:in 'Rails::Initializable#run_initializers'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/application.rb:444:in 'Rails::Application#initialize!'
        from /src/config/environment.rb:7:in '<top (required)>'
        from /usr/local/lib/ruby/3.4.0/bundled_gems.rb:82:in 'Kernel.require'
        from /usr/local/lib/ruby/3.4.0/bundled_gems.rb:82:in 'block (2 levels) in Kernel#replace_require'
        from config.ru:8:in 'block in <main>'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/rack-2.2.23/lib/rack/builder.rb:125:in 'BasicObject#instance_eval'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/rack-2.2.23/lib/rack/builder.rb:125:in 'Rack::Builder#initialize'
        from config.ru:3:in 'Class#new'
        from config.ru:3:in '<main>'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:91:in 'Kernel#eval'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:91:in 'block in Pitchfork.builder'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:1160:in 'Pitchfork::HttpServer#build_app!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:694:in 'block in Pitchfork::HttpServer#spawn_initial_mold'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:170:in 'block in Pitchfork.clean_fork'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Kernel#catch'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Pitchfork.clean_fork'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:690:in 'Pitchfork::HttpServer#spawn_initial_mold'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:176:in 'Pitchfork::HttpServer#start'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/exe/pitchfork:110:in '<top (required)>'
        from /src/bin/pitchfork:58:in 'Kernel#load'
        from /src/bin/pitchfork:58:in 'block in <main>'
        from /src/bin/pitchfork:58:in 'Kernel#fork'
        from /src/bin/pitchfork:58:in '<main>'
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pg-1.6.3-x86_64-linux/lib/pg/connection.rb:944:in 'PG::Connection.connect_start': connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory (PG::ConnectionBad)
        Is the server running locally and accepting connections on that socket?
connection to server on socket "/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?

        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pg-1.6.3-x86_64-linux/lib/pg/connection.rb:944:in 'PG::Connection.connect_to_hosts'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pg-1.6.3-x86_64-linux/lib/pg/connection.rb:871:in 'PG::Connection.new'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pg-1.6.3-x86_64-linux/lib/pg.rb:88:in 'PG.connect'
        from /src/config/initializers/000-pg_connection_patch.rb:5:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.new_client'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql_adapter.rb:944:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#connect'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql_adapter.rb:956:in 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#reconnect'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:670:in 'block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:1224:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:669:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:668:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:778:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:766:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:786:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:992:in 'block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:991:in 'ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/quoting.rb:128:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting#quote_string'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract/quoting.rb:76:in 'ActiveRecord::ConnectionAdapters::Quoting#quote'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/quoting.rb:122:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting#quote'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/schema_statements.rb:1142:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements#quoted_scope'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/postgresql/schema_statements.rb:1119:in 'ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements#data_source_sql'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:45:in 'ActiveRecord::ConnectionAdapters::SchemaStatements#data_source_exists?'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/schema_migration.rb:102:in 'block in ActiveRecord::SchemaMigration#table_exists?'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in 'ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/schema_migration.rb:101:in 'ActiveRecord::SchemaMigration#table_exists?'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/migration.rb:1282:in 'ActiveRecord::MigrationContext#get_all_versions'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/migration.rb:1299:in 'ActiveRecord::MigrationContext#pending_migration_versions'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activerecord-8.0.5/lib/active_record/migration.rb:1295:in 'ActiveRecord::MigrationContext#needs_migration?'
        from /src/config/initializers/100-flags.rb:6:in 'block in <main>'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:406:in 'BasicObject#instance_exec'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:406:in 'block in ActiveSupport::Callbacks::CallTemplate::InstanceExec0#make_lambda'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:178:in 'block in ActiveSupport::Callbacks::Filters::Before#call'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:668:in 'block (2 levels) in ActiveSupport::Callbacks::CallbackChain#default_terminator'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:667:in 'Kernel#catch'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:667:in 'block in ActiveSupport::Callbacks::CallbackChain#default_terminator'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:179:in 'ActiveSupport::Callbacks::Filters::Before#call'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'block in ActiveSupport::Callbacks::CallbackSequence#invoke_before'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'Array#each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:559:in 'ActiveSupport::Callbacks::CallbackSequence#invoke_before'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/callbacks.rb:108:in 'ActiveSupport::Callbacks#run_callbacks'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/activesupport-8.0.5/lib/active_support/reloader.rb:96:in 'ActiveSupport::Reloader.prepare!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/application/finisher.rb:73:in 'block in <module:Finisher>'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:32:in 'BasicObject#instance_exec'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:32:in 'Rails::Initializable::Initializer#run'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:61:in 'block in Rails::Initializable#run_initializers'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:231:in 'block in TSort.tsort_each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:353:in 'block (2 levels) in TSort.each_strongly_connected_component'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:434:in 'TSort.each_strongly_connected_component_from'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:352:in 'block in TSort.each_strongly_connected_component'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'Rails::Initializable::Collection#each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'Method#call'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:350:in 'TSort.each_strongly_connected_component'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:229:in 'TSort.tsort_each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb:208:in 'TSort#tsort_each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/initializable.rb:60:in 'Rails::Initializable#run_initializers'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/railties-8.0.5/lib/rails/application.rb:444:in 'Rails::Application#initialize!'
        from /src/config/environment.rb:7:in '<top (required)>'
        from /usr/local/lib/ruby/3.4.0/bundled_gems.rb:82:in 'Kernel.require'
        from /usr/local/lib/ruby/3.4.0/bundled_gems.rb:82:in 'block (2 levels) in Kernel#replace_require'
        from config.ru:8:in 'block in <main>'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/rack-2.2.23/lib/rack/builder.rb:125:in 'BasicObject#instance_eval'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/rack-2.2.23/lib/rack/builder.rb:125:in 'Rack::Builder#initialize'
        from config.ru:3:in 'Class#new'
        from config.ru:3:in '<main>'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:91:in 'Kernel#eval'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:91:in 'block in Pitchfork.builder'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:1160:in 'Pitchfork::HttpServer#build_app!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:694:in 'block in Pitchfork::HttpServer#spawn_initial_mold'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:170:in 'block in Pitchfork.clean_fork'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Kernel#catch'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Pitchfork.clean_fork'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:690:in 'Pitchfork::HttpServer#spawn_initial_mold'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:176:in 'Pitchfork::HttpServer#start'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/exe/pitchfork:110:in '<top (required)>'
        from /src/bin/pitchfork:58:in 'Kernel#load'
        from /src/bin/pitchfork:58:in 'block in <main>'
        from /src/bin/pitchfork:58:in 'Kernel#fork'
        from /src/bin/pitchfork:58:in '<main>'
mold gen=0 pid=189 reaped (#<Process::Status: pid 189 exit 1>)
/home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:179:in 'Pitchfork::HttpServer#start': The initial mold failed to boot (Pitchfork::BootFailure)
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/exe/pitchfork:110:in '<top (required)>'
        from /src/bin/pitchfork:58:in 'Kernel#load'
        from /src/bin/pitchfork:58:in 'block in <main>'
        from /src/bin/pitchfork:58:in 'Kernel#fork'
        from /src/bin/pitchfork:58:in '<main>'

pg15에서 pg18로 업그레이드한 것이 원인이었을 것 같습니다.

저도 같은 문제에 부딪힌 것 같습니다.

/var/discourse/templates/web.template.yml에서 수정해야 할 줄은 bundle install jobs 관련 줄입니다(약 209번째 줄 근처):

수정 전 (CPU 1개 호스트에서 오류 발생):

- su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'

수정 후:

- su discourse -c 'bundle install --jobs 1 --retry 3'

여기서는 -j1이 아니라 --jobs 1을 사용합니다. Bundler는 --jobs 옵션을 사용하며, -j 옵션은 templates/postgres.template.yml(및 postgres.18.template.yml)의 pg_dump / pg_restore에서 사용됩니다. 다시 PostgreSQL 업그레이드 실패가 발생하면 해당 파일에서 -j$(($(nproc) - 1))-j1로 변경하십시오.

2개의 좋아요

아래 방법으로 문제를 해결했습니다.

d/shutdown_dev

# 로컬 데이터베이스 삭제
sudo rm -rf ~/discourse/data/postgres

# 데이터베이스 재초기화
 d/boot_dev -i

로컬 개발 데이터가 손실됩니다!!! 테스트 환경에서 복원하는 것을 고려해 보세요.

코어 수 관련 수정이 진행 중입니다. 단일 CPU 사용자가 이렇게 많을 줄 몰랐네요, 죄송합니다!

5개의 좋아요

코어 수 감지 방식을 nproc --ignore=1을 사용하도록 업데이트했습니다.

1개의 좋아요

첫 번째 업그레이드는 성공적으로 완료되었지만, 중간에 몇 가지 이상한 컨테이너 연결 오류가 발생했습니다. 데이터 재구성을 한 번 더 수행한 후에야 해결되었습니다.

(이것은 두 개의 컨테이너로 구성된 환경입니다.)

하지만 결국 모든 것이 잘 끝났습니다.

이 작업에 기울여 주신 노고에 진심으로 감사드립니다!

5개의 좋아요

Literate Computing 대시보드를 사용하여 스탠드얼론 사이트 2개와 컨테이너 2개로 구성된 사이트 1개를 문제없이 업그레이드했습니다. 변수의 대상 Postgres 버전을 변경하는 것만으로 충분했기 때문에, 홍보된 대로 이전 몇 번의 업그레이드와 동일한 프로세스였습니다.

실제로 꽤 많이 지원되는 방법입니다. 데이터베이스 메이저 버전을 업그레이드하는 것보다 훨씬 안전합니다. 문제가 발생하면 새 서버로 전환하지 않으면 됩니다. OS 업그레이드가 필요하거나 최소한의 다운타임을 원한다면 좋은 방법입니다. 새 서버를 구축하는 동안 읽기 전용 모드로 유지하다가 전환하면 됩니다. 쉬운 방법은 최종 재구축 시에만 다운타임이 발생하며, 이전 서버에서 인증서를 복사하면 다운타임이 제로가 될 수도 있습니다.

DB 업그레이드에서 모든 것이 잘못되면, 새 서버를 구축하고 백업을 복원하는 것이 가장 쉬운 해결책입니다.

시작하기 전에 반드시 백업을 만들어 두세요. 업로드 파일을 잃지 않으므로 데이터베이스 전용 백업만 수행하면 됩니다.

5개의 좋아요