데이터베이스 비밀번호 (DISCOURSE_DB_PASSWORD와 동일) 또는 app.yml의 discourse
간단함을 위해, =domain=이라는 이름의 메인 사이트와 두 개의 추가 사이트인 =two=.=domain= 및 =three=.=domain=를 사용하는 경우를 가정합니다. 원하는 이름을 사용할 수 있지만, 이 템플릿의 경우 데이터베이스 이름과 서브포럼 제목에 사용할 short name과 full hostname이 다르면 조금 더 복잡해집니다.
app.yml 또는 web_only.yml의 plugins 뒤에 hooks에 추가
before_bundle_exec:
- file:
path: $home/config/multisite.yml
contents: |
=two=:
adapter: postgresql
database: =two=
pool: 25
timeout: 5000
host: data
password: NThmZTNjZjZhOTczNmVj
host_names:
- =two=.=domain=
=three=:
adapter: postgresql
database: =three=
pool: 25
timeout: 5000
host: data
password: NThmZTNjZjZhOTczNmVj
host_names:
- =three=.=domain=
after_db_migrate:
- exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate
after_ssl:
# letsencrypt에 추가적으로 발급받을 인증서를 지정
- replace:
filename: "/etc/runit/1.d/letsencrypt"
from: /-d =domain= /
to: "-d =domain= -d =two=.=domain= -d =three=.=domain="
global: true
# 모든 호스트를 메인 도메인 이름으로 리다이렉트하지 않음
- replace:
filename: "/etc/nginx/conf.d/discourse.conf"
from: /if \(\$http_host[^\}]*\}/m
to: ""
app.yml 또는 data.yml의 after_postgres 섹션에 추가
- exec: sudo -u postgres createdb =two= || exit 0
- exec:
stdin: |
grant all privileges on database =two= to discourse;
cmd: sudo -u postgres psql =two=
raise_on_fail: false
- exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "alter schema public owner to discourse;"'
- exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists hstore;"'
- exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists pg_trgm;"'
- exec: sudo -u postgres createdb =three= || exit 0
- exec:
stdin: |
grant all privileges on database =three= to discourse;
cmd: sudo -u postgres psql =three=
raise_on_fail: false
- exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "alter schema public owner to discourse;"'
- exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists hstore;"'
- exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists pg_trgm;"'
그 후,
./launcher rebuild app
또는
./launcher rebuild data
./launcher rebuild web_only
가능합니다. 다만 2컨테이너 설치를 생성한 후 web_only2.yml 파일을 갖춰야 합니다. (두 개의 app.yml 스타일 파일을 사용할 수 있다고 생각하지만, 그렇게 하면 불필요하게 두 개의 postgres 인스턴스를 실행하게 됩니다.) 또한 두 개의 redis 인스턴스가 필요할 것 같습니다.
감사합니다. 데이터와 웹 컨테이너를 분리하는 방법에 대해 잘 몰라서 이 가이드라인에 따라 별도의 스탠드얼론 컨테이너를 하나 더 만들었습니다 (certbot으로 생성한 인증서도 잘 작동하는 것 같습니다). 다만 현재 mailgun 설정에 문제가 있는 것 같습니다. gmail로 활성화 이메일은 정상적으로 전송되는데, 제 도메인 등록사(dreamhost)에서 호스팅하는 메일로 보내는 것은 실패하네요
추가된 Postgres 인스턴스가 얼마나 부하를 일으킬까요?
분리 관련해서 작성하신 글을 확인해 보았는데, 절약되는 부분이 크다면 시도해 보겠습니다.
최근에 이 방법을 시도해 보고 있는데, 가이드에서 몇 가지 사항에 대해 어려움을 겪고 있습니다:
데이터베이스 비밀번호를 찾을 수 없거나(또는 파일 내에서 정확히 어떤 용도로 사용되는지) 파악이 되지 않습니다.
제 app.yml 파일에는 원래 after_postgres 섹션이 없어서, 다른 섹션들(after_ssl, after_db_migrate 등)과 일치하도록 hooks 아래에 추가했습니다. 만약 이 섹션이 잘못된 위치에 있다면 알려주시기 바랍니다. 이 유형의 작업은 처음이라 잘 모르겠습니다.
http://www.yamllint.com/에서 YAML 파일의 문법을 검사하면, hooks 섹션 아래에 after_postgres 섹션을 추가한 줄에서 (<unknown>): did not find expected key while parsing a block mapping 오류가 발생합니다.
불행히도 단일 서버/IP에서 추가 Discourse를 실행하는 데 문제가 있습니다.
먼저 문서에 따라 스탠드얼론 사이트를 설정했는데 성공적으로 완료되었습니다.
(예: test.john.com - 단일 IP로 리다이렉트되는 서브도메인)
이제 추가 Discourse(예: 다른 사이트의 서브도메인인 test.joe.com와 test.doe.com)를 추가하려고 시도했습니다.
작성하신 단계를 따라 보았지만 성공하지 못했고, 이제 어떻게 해야 할지 막막합니다.
몇 가지 질문이 있습니다:
이 두 사이트는 어떻게 설치되나요? /standalone.yml을 containers 디렉토리로 복사하고 이름을 변경한 뒤, 일반적인 설치 과정(예: ./launcher rebuild joe)을 수행하면 되는 건가요?
설명에 따르면 변경 사항은 app.yml에 적용해야 하며, 위에서 언급한 모든 코드를 추가해야 한다고 되어 있습니다. 이는 처음에 성공적으로 설치된 파일(test.john.com)에 추가해야 한다는 의미로 이해했는데 맞나요?
containers 디렉토리에 있는 것 외에도 config/multisite.yml을 생성했는데, 제 코드는 다음과 같습니다:
secondsite:
adapter: postgresql
database: b_discourse
username: postgres
password: postgres
host: dbhost
pool: 5
timeout: 5000
host_names:
- test.joe.com
...
...
# 그리고 세 번째 사이트 설정
아니요. 설명된 대로 app.yml 파일에 해당 내용을 추가하면 됩니다. 그러면 컨테이너 내부에 mutlisite.yml 파일이 생성됩니다. 단일 인스턴스가 생성되며, 모든 도메인의 DNS가 해당 컨테이너를 가리키도록 설정되어 있다면 모든 도메인에 대해 작동합니다. 이는 도메인 이름마다 하나씩 여러 Discourse 컨테이너를 실행하기 위한 것이 아닙니다.
마지막으로 확인했을 때, 해당 지시사항은 그대로 작동했습니다. app.yml 파일에 해당 줄을 추가하기만 하면 됩니다. 다른 파일을 수정할 필요는 없습니다.
마이그레이션 부분의 경우, 모든 조합이 항상 실패했습니다… >>>> bundle exec rake multisite:migrate
********************** 프로세스의 마지막 부분**************************
2023-02-11 17:50:43.853 UTC [61] LOG: shutting down
162:M 11 Feb 2023 17:50:43.866 # User requested shutdown...
162:M 11 Feb 2023 17:50:43.866 * Saving the final RDB snapshot before exiting.
162:M 11 Feb 2023 17:50:43.881 * DB saved on disk
162:M 11 Feb 2023 17:50:43.882 # Redis is now ready to exit, bye bye...
2023-02-11 17:50:44.007 UTC [57] LOG: database system is shut down
FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate failed with return #<Process::Status: pid 582 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate"
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.
실패 시점까지 무엇이 생성되고 무엇이 생성되지 않았는지 확인해 보았습니다.
서브도메인 데이터베이스는 생성되었지만 마이그레이션이 실패했습니다. overlay2 폴더나 다른 위치를 확인해 보았을 때 서브도메인 nginx 설정 파일이나 multisite.yml이 생성되지 않았습니다.
./launcher bootstrap, destroy, start, stop, rebuild 또는 fresh setup을 여러 번 실행해 보았습니다… 모든 명령어를 시도해 보았지만 아무런 변화가 없었습니다…
이 튜토리얼은 여전히 v3.1.0.beta 2에 유효한가요, 아니면 제가 무엇을 놓치고 있는 걸까요?
어떤 아이디어라도 있으면 알려주세요?