Let's Encrypt를 사용하고 리버스 프록시 없이 멀티사이트 구성 설정하기

이 지침은 베타 버전이며 표준 설정에 익숙한 사용자를 대상으로 합니다

하지만 현재(2023.02.11) 이 지침은 작동하지 않습니다!! (fullpath 부분을 추가하기 위해 letsencrypt 설정을 업데이트하는 방법은 Set up Let’s Encrypt with multiple domains / redirects 를 참조하세요. 곧 이 부분을 해당 변경 사항에 맞게 업데이트하겠습니다.)

이 howto를 몇 주 전에 작성했지만, 다른 사람에게도 작동하는지 테스트해 줄 사람이 필요합니다. 시도해 보셨다면 댓글을 남겨 작동 여부를 알려주시고, 불분명한 부분이 있는지도 말씀해 주세요.

그럼 시작하겠습니다. . .

이 howto는 2개의 추가 호스트(총 3개)를 가진 멀티사이트 설정을 어떻게 구성하는지 대략적으로 문서화합니다.

작동하는 Discourse 공식 표준 설치 또는 2컨테이너 설치(Move from standalone container to separate web and data containers)가 이미 되어 있다고 가정합니다.

주 사이트 도메인 이름

2번째 사이트의 서브도메인

3번째 사이트의 서브도메인

데이터베이스 비밀번호 (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
10개의 좋아요

사실 방금 직접 테스트해 보았습니다. 처음 시도부터 아무 문제 없이 바로 작동해서 믿기지 않아서 두 번이나 시도했네요 :smile: 제가 한 일은 복사하고, 도메인과 비밀번호를 조정하고, 2개의 컨테이너가 있는 신규 설치 환경의 각 파일에 붙여넣는 것이었습니다. :ok_hand:

불분명한 부분이 있는지 피드백을 주십시오. 이 단락은 좀 더 생각해 봐야 했습니다:

2개 컨테이너 구성이 따라가기 위해 필수적인 것처럼 보이지만, 실제로는 그렇지 않습니다. 또한 왜 해당 토픽의 첫 번째 게시글이 아니라 48번째 게시글로 링크를 걸었는지도 이해가 되지 않았습니다.

2개의 좋아요

감사합니다! 확인해 보겠습니다. 둘 다 제가 알려주길 바랐던那种 무심코 범하기 쉬운 실수인 것 같아요!

수정: 감사합니다! 2-컨테이너 주제에서 제 현재 위치를 무심코 복사해 두었더라고요. 그래서 수정했고, 어떤 정상 설치 환경에서도 작동한다는 것으로 언어를 변경했습니다.

감사합니다!

2개의 좋아요

안녕하세요

DigitalOcean에서 표준 Discourse 설치로 시작했고, 같은 드롭렛에 Drupal 사이트 몇 개를 더 두고 싶어서 nginx를 설정했습니다(이 안내문 참고).

Discourse 인스턴스를 하나 더 추가하려면 위 방법을 따르는 것이 좋을까요?

아니면 이 가이드가 더 나을까요?

감사합니다!
/Sifaan

이 안내문은 리버스 프록시를 사용하지 않는 경우를 위한 것입니다. Docker를 사용한 멀티사이트 구성을 따르시는 것을 권장합니다. 링크하신 안내문도 작동할 수 있지만, 우선 여기에 나와 있는 내용을 따라 보시길 권합니다.

2개의 좋아요

감사합니다. 그런데 그렇게 하면 두 사이트가 동일한 SMTP 설정을 사용하게 되는 것 같네요 :frowning:
이걸 우회하는 방법이 있을까요?
아니면 다른 가이드를 따르는 게 나을까요? (기존 사이트를 Docker 네트워크에 연결하려면 꽤 많은 작업이 필요해 보입니다.)

대안으로, 다른 코드베이스를 설치하는 게 가능할까요? 예를 들어 /var/discourse2 같은 경로에요.
(약 500MB가 더 차지하겠지만, 두통을 피할 수 있다면 가치가 있습니다.)

네.

멀티사이트를 사용하지 마세요.

가능합니다. 다만 2컨테이너 설치를 생성한 후 web_only2.yml 파일을 갖춰야 합니다. (두 개의 app.yml 스타일 파일을 사용할 수 있다고 생각하지만, 그렇게 하면 불필요하게 두 개의 postgres 인스턴스를 실행하게 됩니다.) 또한 두 개의 redis 인스턴스가 필요할 것 같습니다.

3개의 좋아요

감사합니다. 데이터와 웹 컨테이너를 분리하는 방법에 대해 잘 몰라서 이 가이드라인에 따라 별도의 스탠드얼론 컨테이너를 하나 더 만들었습니다 (certbot으로 생성한 인증서도 잘 작동하는 것 같습니다). 다만 현재 mailgun 설정에 문제가 있는 것 같습니다. gmail로 활성화 이메일은 정상적으로 전송되는데, 제 도메인 등록사(dreamhost)에서 호스팅하는 메일로 보내는 것은 실패하네요 :frowning:

추가된 Postgres 인스턴스가 얼마나 부하를 일으킬까요?
분리 관련해서 작성하신 글을 확인해 보았는데, 절약되는 부분이 크다면 시도해 보겠습니다.

그다지 많지는 않을 겁니다. RAM이 조금 더 사용될 정도일 텐데, 정확히 얼마나인지 저는 잘 모르겠네요.

1개의 좋아요

최근에 이 방법을 시도해 보고 있는데, 가이드에서 몇 가지 사항에 대해 어려움을 겪고 있습니다:

  1. 데이터베이스 비밀번호를 찾을 수 없거나(또는 파일 내에서 정확히 어떤 용도로 사용되는지) 파악이 되지 않습니다.
  2. 제 app.yml 파일에는 원래 after_postgres 섹션이 없어서, 다른 섹션들(after_ssl, after_db_migrate 등)과 일치하도록 hooks 아래에 추가했습니다. 만약 이 섹션이 잘못된 위치에 있다면 알려주시기 바랍니다. 이 유형의 작업은 처음이라 잘 모르겠습니다.
  3. http://www.yamllint.com/에서 YAML 파일의 문법을 검사하면, hooks 섹션 아래에 after_postgres 섹션을 추가한 줄에서 (<unknown>): did not find expected key while parsing a block mapping 오류가 발생합니다.

app.yml 파일을 편집하는 단계를 명확히 설명해 주시면 감사하겠습니다.

2개의 좋아요

단일 컨테이너 구성을 사용 중이라면 비밀번호가 필요하지 않을 수도 있습니다 (이전 게시물에서 그렇게 제안하고 있습니다).

제안하신 대로 해당 섹션을 추가하면 작동할 것입니다.

정확히 무엇이 문제인지 파악이 어렵습니다. 며칠 안에 더 자세히 살펴보겠습니다.

1개의 좋아요

나와 친구가 더 많은 투자를 결정하기 전에 몇 가지 다른 포럼을 테스트해 보고 싶어서 이렇게 설정하려고 생각하고 있습니다. 필요에 따라 호스팅도 따로 두는 방식이 될 수도 있습니다.

서로 다른 도메인을 사용하려고 생각하고 있습니다. 사람들이 메인 SMTP 주소에서만 이메일을 받게 되므로 약간 혼란을 줄 수 있다는 점은 이해하고 있습니다. 그런데, 별도의 도메인을 사용하면 다른 문제가 발생할 수 있는지 아시는 분 계신가요?

Discourse는 모든 비즈니스 고객과 표준 고객을 위해 단일 도메인을 사용합니다. 알림 이메일 주소를 shortname@whatevermail.com과 같이 원하는 대로 설정할 수 있습니다.

2개의 좋아요

이렇게 말씀해 주셔서 정말 기쁘고, 감사합니다!

1개의 좋아요

안녕하세요, 먼저 튜토리얼을 작성해 주셔서 감사합니다.

불행히도 단일 서버/IP에서 추가 Discourse를 실행하는 데 문제가 있습니다.
먼저 문서에 따라 스탠드얼론 사이트를 설정했는데 성공적으로 완료되었습니다.
(예: test.john.com - 단일 IP로 리다이렉트되는 서브도메인)
이제 추가 Discourse(예: 다른 사이트의 서브도메인인 test.joe.com와 test.doe.com)를 추가하려고 시도했습니다.
작성하신 단계를 따라 보았지만 성공하지 못했고, 이제 어떻게 해야 할지 막막합니다.

몇 가지 질문이 있습니다:

  1. 이 두 사이트는 어떻게 설치되나요? /standalone.yml을 containers 디렉토리로 복사하고 이름을 변경한 뒤, 일반적인 설치 과정(예: ./launcher rebuild joe)을 수행하면 되는 건가요?
  2. 설명에 따르면 변경 사항은 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 파일에 해당 줄을 추가하기만 하면 됩니다. 다른 파일을 수정할 필요는 없습니다.

1개의 좋아요

단일 웹사이트 표준 설정은 완벽하게 작동합니다. 문제없습니다.
하지만 멀티사이트를 위해 많은 조합을 시도해 보았습니다. 단일 app.yml 구성 또는 web_only.yml, data.yml로 분리하는 방식 등… Docker를 사용한 멀티사이트 구성이나 스탠드얼론 컨테이너에서 웹과 데이터 컨테이너로 분리하기에 대한 다른 팁들도 시도해 보았습니다.

마이그레이션 부분의 경우, 모든 조합이 항상 실패했습니다… >>>> 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을 여러 번 실행해 보았습니다… 모든 명령어를 시도해 보았지만 아무런 변화가 없었습니다… :slight_smile:

이 튜토리얼은 여전히 v3.1.0.beta 2에 유효한가요, 아니면 제가 무엇을 놓치고 있는 걸까요?
어떤 아이디어라도 있으면 알려주세요?

1개의 좋아요

아니요. Let’s Encrypt 관련 사항이 어느 시점에 변경되었습니다. 컨테이너 내부에서 여러 도메인을 처리하기 위해 무엇이든 변경해야 하는지 더 자세히 살펴볼 수 있도록 하겠습니다.

1개의 좋아요

이 메서드를 사용 중이며 잘 작동하고 있습니다. 현재 https를 활성화하지 않아서 Let’s Encrypt 관련 문제점에 대해서는 언급할 수 없습니다.

저는 이 설정을 스테이징 서버에서 수년째 사용해 왔습니다. 하지만 3.5.0.beta5-dev로 업데이트한 이후로는 서브도메인을 입력할 때마다 항상 메인 사이트로 리다이렉트됩니다.

인증 관련 복잡한 과정을 거치지 않아도 되어 정말 좋았는데요. 그런데 지금은 상황이 너무 막막합니다. 무슨 일이 일어나고 있는지 디버깅할 수 있는 도구가 있을까요?

1개의 좋아요