업그레이드(v3.5.2 -> v3.6.0.beta2) 후 데이터베이스 접근 문제

  • v3.5.2 → v3.5.2
  • v3.6.0.beta2 → v3.6.0.beta2

이 스레드 덕분에 여기까지 왔습니다: Upgrade failed. Database stopped. (multisite install)

현재 데이터베이스 접근 문제가 있습니다:


2025-11-02 17:13:51.212 UTC [1975] postgres@c_discourse LOG:  provided user name (postgres) and authenticated user name (discourse) do not match 
2025-11-02 17:13:51.212 UTC [1975] postgres@c_discourse FATAL:  Peer authentication failed for user "postgres" 
2025-11-02 17:13:51.212 UTC [1975] postgres@c_discourse DETAIL:  Connection matched pg_hba.conf line 89: "local   all             postgres       
                        peer"
postgres=# \l
List of databases
Name     |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | ICU Locale | ICU Rules |   Access privileges
-------------±---------±---------±----------------±------------±------------±-----------±----------±-----------------------
b_discourse | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =Tc/postgres          +
|          |          |                 |             |             |            |           | postgres=CTc/postgres +
|          |          |                 |             |             |            |           | discourse=CTc/postgres
c_discourse | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =Tc/postgres          +
|          |          |                 |             |             |            |           | postgres=CTc/postgres +
|          |          |                 |             |             |            |           | discourse=CTc/postgres
discourse   | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =Tc/postgres          +
|          |          |                 |             |             |            |           | postgres=CTc/postgres +
|          |          |                 |             |             |            |           | discourse=CTc/postgres
postgres    | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           |
template0   | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =c/postgres           +
|          |          |                 |             |             |            |           | postgres=CTc/postgres
template1   | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =c/postgres           +
|          |          |                 |             |             |            |           | postgres=CTc/postgres
(6 rows)


이 버전들 사이에 multisite.yaml 파일이 변경되었습니다.

기존 설정:
secondsite:
adapter: postgresql
database: b_discourse
pool: 25
timeout: 5000
db_id: 2
host_names:
- ``forum.domain.com

새 설정:
mlp:
adapter: postgresql
database: discourse_mlp
username: discourse_mlp
password: applejack
host: dbhost
pool: 5
timeout: 5000
host_names:
- discourse.nudderdomain.com
- discourse.nudderdomain.internal

멀티사이트 설정 시 필수 항목이 아니었고, 기존 템플릿에도 언급되어 있지 않아 멀티사이트용 비밀번호나 사용자를 설정한 적이 없습니다.

처음에는 multisite.yml에 나열된 두 사이트의 권한 문제로 인해 업그레이드를 진행할 수 없었습니다. multisite.yml의 사용자를 postgres로 추가해도 마이그레이션이 작동하지 않았습니다. 이제 보니 discourse 사용자를 시도해 봐야 했을 수도 있겠네요?

소유자를 discourse로만 변경하면 해결될까요? 현재 설정과 일치시키기 위해 멀티사이트에 사용자와 비밀번호를 추가해야 하나요?

여기서 가장 좋은 장기적인 해결책은 무엇일까요?

글이 너무 읽기 어려워 비공개 처리했습니다. 형식을 수정해 주시면 다시 공개할 수 있습니다.

아쉽지만 이해하기 쉽고 일관성 있게 보이도록 최대한 노력했습니다.

제가 무슨 말을 하고 싶은지 아실 겁니다. :wink:

수정: 아, 알겠습니다. 제가 사용하는 다른 포럼은 조금 다릅니다. 저는 코드 블록 앞뒤 줄에 세 개의 백틱(```)을 사용했습니다. 이제 무슨 일이 일어나고 있는지 알겠습니다. 이 포럼에서는 첫 번째 백틱 세 개가 붙여넣기 창을 표시하더군요. 왜 백틱 세 개가 작동하지 않는지, 그리고 </>가 제가 실제로 원하는 결과를 주지 않는지 이해할 수 없었습니다.

게시글에 마크다운을 많이 사용해야 한다면 마크다운 편집기로 전환할 수 있습니다.

데이터베이스 비밀번호 관련 문제가 좀 이상하네요. 새 서버로 이전하는 건 고려해 보셨나요? 이 문제를 계속 해결하려 애쓰는 것보다 더 빠르고 쉬울 수 있습니다.

이 안내를 따르셨나요? (그렇지 않아 보이는데?)

그렇게 될 가능성이 높지만, 멀티사이트 설치 주제에 나와 있는 것과 같은 항목들을 확인해 두셨는지 점검해 보세요.

사이트가 현재 정상 작동 중이라면, 저도 깨끗한 멀티사이트 설치를 수행한 뒤 데이터베이스를 백업/복원하는 것을 권장합니다. Move a Discourse site to another VPS with rsync에 설명된 대로 나머지 모든 파일을 복사할 수 있습니다.

내 데이터베이스 이름을 b_discourse와 c_discourse로 지은 이유가 궁금했었습니다. 이제 그 이유를 알았네요. :wink:

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_postgres:
     - exec: sudo -u postgres createdb b_discourse || exit 0
     - exec:
          stdin: |
            grant all privileges on database b_discourse to discourse;
          cmd: sudo -u postgres psql b_discourse
          raise_on_fail: false
            
     - exec: sudo -u postgres createdb c_discourse || exit 0
     - exec:
          stdin: |
            grant all privileges on database c_discourse to discourse;
          cmd: sudo -u postgres psql c_discourse
          raise_on_fail: false

     - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "alter schema public owner to discourse;"'
     - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists hstore;"'
     - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists pg_trgm;"'

권한이 어떻게 부여되는지 완전히 이해하지 못해서 이 부분에 대해 궁금해했습니다. (위에서 두 가지 문제 있는 데이터베이스의 스크린샷):

글쎄, 좋은 소식과 나쁜 소식이 있습니다. :frowning:
지금은 이렇게 :frowning:

2025-11-07 18:05:41.555 UTC [4724] discourse@b_discourse ERROR:  must be owner of extension vector
2025-11-07 18:05:41.555 UTC [4724] discourse@b_discourse STATEMENT:  ALTER EXTENSION vector UPDATE TO '0.8.0';
2025-11-07 18:05:41.752 UTC [4725] discourse@c_discourse ERROR:  must be owner of extension vector
2025-11-07 18:05:41.752 UTC [4725] discourse@c_discourse STATEMENT:  ALTER EXTENSION vector UPDATE TO '0.8.0';

이렇게 되길 바랍니다.

ALTER EXTENSION vector UPDATE TO ‘0.7.0’;

하지만:

b_discourse=# ALTER EXTENSION vector UPDATE TO '0.8.0';
ERROR:  extension "vector" has no update path from version "0.7.4" to version "0.8.0"

데이터베이스 소유자를 그냥 변경하는 것은 꺼려왔지만, 다음 단계로 넘어가야 할 것 같습니다.

수정: 네. 효과가 없었습니다. 여기서는 데이터베이스 소유자가 아니라 확장(extension) 소유자가 핵심인 것 같습니다. 현재 제 컨테이너에는 0.8.0이 존재하지 않습니다. 0.7.4까지가 최대 버전입니다. :frowning: 'base’는 15버전 설치 시도에 업데이트된 것 같습니다.

./launcher가 postgres 사용자로 연결되도록 하는 방법이 있을까요? 그렇게 하면 여기의 업그레이드 문제를 모두 해결할 수 있을 것 같습니다.

b_discourse=# select e.extname, u.usename 
             from pg_extension e 
             join pg_user u on e.extowner = u.usesysid;
 extname  |  usename  
----------+-----------
 plpgsql  | postgres
 hstore   | postgres
 pg_trgm  | postgres
 unaccent | discourse
 vector   | postgres
(5 rows)

확장 소유자를 변경하는 것만으로도 '문제’가 있는 것 같습니다. 처음 찾은 참고 자료는 2017년 것이었고, 2022년에도 여전히 구현되지 않았습니다.

apt를 사용해 새 확장 기능을 설치하고 작동하게 만들었습니다. 정말이지. 이제 제대로 된 백업과 PostgreSQL 15 업그레이드를 해야 합니다. 하지만 오늘 밤은 아닙니다. :wink:

제 명령어 히스토리가 지워진 것 같아서 정확히 어떻게 했는지 말씀드리기 어렵습니다. 하지만 주의하세요. PostgreSQL 13이 필요하며, 이를 재설치하려고 시도할 수 있습니다.

P.S.: 알고 보니 자동 백업은 켜져 있었지만, 그 사실을 잊고 있었습니다. 백업 파일이 어디 있는지조차 몰랐으니까요. 이제 rsync 프로세스를 설정해서 다른 서버 백업도 저장하는 디렉토리에 함께 보관하도록 하겠습니다.