DB_USER 또는 multisite.yml 값 대신 사용자 discourse를 사용한 멀티사이트 백업

수정/Tl;dr: ActiveRecord::Base.connection_pool.db_config.configuration_hash에는 username이 아닌 user 키에 사용자 이름이 포함되어 있지만, Discourse는 username에서 이를 찾으려 합니다.

사소한 PR: FIX: backup_restore.rb wants db user from user, not username - Pull Request #28229 - discourse/discourse - GitHub

…

Digital Ocean의 호스팅 Postgres를 사용하는 멀티사이트 인스턴스를 운영하고 있습니다. 정상적으로 작동하고 있지만 백업을 시도하면 다음과 같은 오류가 발생합니다.

[2024-08-05 16:13:31] pg_dump: error: connection to server at "private-forum-cluster-postgresql-prod-do-user-1230.j.db.ondigitalocean.com" (10.11.1.6), port 25060 failed: FATAL:  password authentication failed for user "discourse"

하지만 사용자는 discourse가 아닙니다. ActiveRecord::Base.connection_pool.db_config.configuration_hash와 BackupRestore.database_configuration(RAILS_DB=sitename rails c에서 해당 명령을 실행할 때)을 포함한 다른 곳에서는 올바른 사용자를 사용하고 있습니다. 환경 변수에 PG_USER가 설정되어 있지 않습니다(제가 볼 수 있는 범위 내에서).

이것이 원인인 것 같습니다:

컨테이너에서 이를 수정하여 DISCOURSE_DB_USER에서 값을 가져오도록 했습니다(당시에 좋은 아이디어인 것 같았죠). 이제 백업이 정상적으로 작동합니다. multisite.yml에서 연결 정보를 가져오는 것이 허용되는지 모르겠지만, DB_USER를 무시하는 것은 잘못된 것 같습니다.

아니면, 다른 사람들이 다 그렇듯이 사용자 이름을 discourse로 설정하는 것이 정답일까요?

수정: 잠깐. 아니요.

config['username']은 config['user']여야 합니다.

    config = ActiveRecord::Base.connection_pool.db_config.configuration_hash

은 다음과 같은 결과를 반환합니다!

   
=> {:adapter=>"postgresql",
 :database=>"theDatabase",
 :pool=>25,
 :port=>25060,
 :timeout=>5000,
 :host=>"private-forum-cluster-postgresql-prod-do-user-123-0.j.db.ondigitalocean.com",
 :user=>"theCurrentUsername",
 :password=>"supersecret",
 :host_names=>["forum.example.com"],
 :db_key=>"mydb",
 :prepared_statements=>false}

따라서

    config["username"] || username || ENV["USER"] || "postgres",

은 다음과 같이 되어야 합니다.

    config["user"] || username || ENV["USER"] || "postgres",
2개의 좋아요

@pfaffman 죄송하지만, 이 변경 사항을 되돌려야 했습니다. 프로덕션 환경에서 백업 복원 기능이 깨졌기 때문입니다.

하지만 저희 샘플 멀티사이트 설정(그리고 실제로 프로덕션 설정)에서는 'username’으로 되어 있습니다:

2개의 좋아요

정말 죄송합니다! 백업을 제외한 모든 부분이 어떻게 작동하는지 여전히 혼란스럽습니다.

음.

아마도 그게 제 문제일 수도 있습니다. 하지만 다른 모든 부분은 어떻게 작동하고 있나요?

아마도 다른 모든 부분은 환경 변수의 전역 설정을 사용하는 것 같습니다.

2개의 좋아요

정말 죄송합니다.

ActiveRecord::Base.connection_pool.db_config.configuration_hash가 제가 multisite.yml 파일에 아무렇게나 넣은 값 그대로 사용된다는 점을 전혀 고려하지 못했습니다.

잘못 입력했던 모든 user: 필드를 username:으로 변경했고, 이제 백업이 정상적으로 작동합니다.

제 추측(아직 테스트하지는 않았습니다)은, Rails의 나머지 부분이 GlobalSettings에 설정된 db_username이 있으면 이를 오버라이드하지만, pg_dump를 위한 외부 호출 정보를 가져올 때는 multisite 설정에서 가져온다는 것입니다.

여전히 백업이 다른 사용자를 사용하는 것은 버그라고 생각하며, 수정 방법은 해당 할당 문에 env['DISCOURSE_DB_USERNAME']을 가져오는 로직을 포함하는 것이라고 봅니다. 하지만 프로덕션 환경을 다시 깨뜨릴 위험을 감수할 의향은 없으며, 지금은 정상 작동하고 있습니다.

제 게시글의 추천을 취소하고 배지를 제거해 주세요! :crying_cat_face:

2개의 좋아요

걱정하지 마세요, 이런 일은 흔합니다. 이상적으로는 CI에서 잡아냈어야 했지만, 이 로직에 대한 커버리지가 없는 것 같습니다(테스트에서는 DB 설정이 완전히 다르기 때문에 어려울 수 있겠죠).

발견한 내용을 문서화해 주셔서 감사합니다. 앞으로 다른 사람들에게 도움이 될 거라고 확신합니다. 여기의 일관성 부족은 문제가 크다고 동의하며, 언젠가 수정하는 것이 좋겠습니다.

3개의 좋아요