CloudPanel에 Discourse 설치하기

:warning: 이 설치 방법은 공식적으로 권장되지 않습니다. 사용에 따른 모든 책임은 사용자에게 있습니다.

Discourse 팀은 공식 설치 가이드를 사용하여 설치하는 것을 권장합니다.

:information_source: 이는 지원되지 않는 설치 방식이며, CloudPanel에 익숙하고, 경험이 있는 시스템 관리자이며, Docker와 리버스 프록시에 친숙하며, 표준 설치를 성공적으로 완료한 사용자에게 적합합니다.

CloudPanel을 사용하는 이유

CloudPanel이 설치된 VPS 또는 전용 서버에 Discourse 포럼을 설치하고 싶은 이유는 무엇일까요?

저의 이유는 다음과 같습니다:

서버 및 사이트 관리에는 그래픽 인터페이스를 선호합니다. 웹 호스팅 제어 패널 중 대부분을 한때는 사용해 본 경험이 있습니다.

나머지 패널들과 비교했을 때, CloudPanel은 매우 슬림하고 미니멀하며 깔끔합니다. 제가 필요한 모든 기능이 매우 단순하고 직관적으로 제공되며, 그 이상은 없습니다. 제가 필요하지 않은 것은 아무것도 없습니다.

저는 Discourse 포럼 외에도 Ghost 블로그, Wordpress 사이트, Drupal 사이트 및 기타 유형의 사이트를 개발하고 호스팅하며 관리합니다. 저는 Ghost 블로그와 Wordpress, Drupal 사이트 바로 옆에 Discourse 포럼을 호스팅할 수 있는 서버 하나만 있으면 충분합니다. (각 Discourse 인스턴스마다 별도의 서버를 구매하고 유지보수하고 싶지 않습니다.)

CloudPanel에는 (박스에서 바로 꺼내 쓸 수 있는) 내장 Nginx와, 같은 서버에서 Discourse 인스턴스 하나 이상 또는 다른 유형의 웹사이트와 함께 실행하기 위해 필요한 리버스 프록시를 설정하고 관리하는 간단한 인터페이스가 포함되어 있습니다.

Discourse 팀(그리고 여기 메타 포럼 스태프)은 Cpanel이나 Plesk, 또는 (이번 경우처럼) CloudPanel과 같은 대체 서버 환경이나 커맨드 라인에서 출발하는 기타 환경에 대한 지원을 제공하지 않습니다.

그래서 다른 사람들에게 유용할 수 있기를 바라며 제 설정과 과정을 공유하고자 합니다.

[누군가 이 방법을 시도해 보신다면, 어떻게 작동하는지 또는 제가 이 튜토리얼을 어떻게 개선할 수 있는지 알려주세요! :heart_eyes: ]

Docker 설치

Putty(또는 기타 터미널)에서 루트 디렉토리로 이동하여 다음을 실행합니다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io

CloudPanel에서 리버스 프록시 사이트 생성

→ + Add Site 버튼을 클릭합니다…

저의 Discourse 인스턴스에는 도메인 이름 noobish.me를 사용하고 있으므로, 나머지 설명에서 noobish.me를 볼 때마다 실제 도메인 이름(예: yoursite.com)으로 대체하십시오.

→ Discourse 포럼을 호스팅하려는 도메인에 대해 CloudPanel에서 새로운 "Reverse Proxy Site"를 생성합니다. (물론 해당 도메인의 DNS A 레코드가 CloudPanel과 동일한 IP 주소를 가리키도록 설정되어 있어야 합니다.)

도메인 준비 및 SSL 설정

제 사이트에서는 Cloudflare의 네임서버를 사용하여 도메인을 가리키도록 설정했습니다. Cloudflare에서 SSL을 Full 또는 Full (strict)로 설정했습니다.

또한 Cloudflare Page Rule을 생성했습니다. 그 이유는 이 게시물을 참조하세요.

또한 제 도메인에 대해 무료 Cloudflare SSL Origin Certificate를 사용하며, 이를 해당 사이트의 “SSL/TLS” 사이트 설정에서 CloudPanel로 “Import”(단순히 Cloudflare 계정에서 해당 도메인용으로 다운로드한 인증서와 개인 키를 모두 붙여넣기만 하면 됩니다)합니다.

Discourse 설치

다시 Putty(또는 기타 터미널)에서 루트 디렉토리(c d Enter를 눌러 루트로 돌아감)로 돌아가서 다음 명령을 사용하여 Discourse Standard Install을 설치합니다…

git clone https://github.com/discourse/discourse_docker.git /var/discourse

Enter

cd /var/discourse

Enter

chmod 700 containers

Standalone 설정 복사

이제 /var/discourse/standalone.yml 파일을 /var/discourse/containers/ 디렉토리로 app.yml이라는 이름으로 복사한 후, 사이트 설정에 맞게 편집합니다.

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml

app.yml 파일 편집

app.yml 파일을 특정 사이트 설정에 맞게 수정하는 것 외에도, 파일을 저장하기 전에 3가지를 더 변경해야 합니다…

templates: 섹션 아래에 다음을 추가해야 합니다.

  - "templates/web.socketed.template.yml"

Cloudflare를 사용하므로, templates: 섹션 아래에 다음도 추가합니다.

  - "templates/cloudflare.template.yml"

expose: 섹션 아래에서 다음을 주석 처리해야 합니다.

  #- "80:80"   # http
  #- "443:443" # https

env: 섹션 아래에 다음을 추가해야 합니다.

   DISCOURSE_FORCE_HTTPS: true
참고로, Cloudflare와 Mailgun을 모두 사용하고 있는 noobish.me의 작동 중인 app.yml 내용을 보려면 여기를 클릭하세요...
## this is the all-in-one, standalone Discourse Docker container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild app
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as needed

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Set db_shared_buffers to a max of 25% of the total memory.
  ## will be set automatically by bootstrap based on detected RAM, or you can override
  db_shared_buffers: "4096MB"

  ## can improve sorting performance, but adds memory usage per-connection
  #db_work_mem: "40MB"

  ## Which Git revision should this container use? (default: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  DISCOURSE_FORCE_HTTPS: true

  ## How many concurrent web requests are supported? Depends on memory and CPU cores.
  ## will be set automatically by bootstrap based on detected CPUs, or you can override
  UNICORN_WORKERS: 8

  ## TODO: The domain name this Discourse instance will respond to
  ## Required. Discourse will not work with a bare IP number.
  DISCOURSE_HOSTNAME: 'noobish.me'

  ## Uncomment if you want the container to be started with the same
  ## hostname (-h option) as specified above (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: List of comma delimited emails that will be made admin and developer
  ## on initial signup example 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@noobish.me'

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@noobish.me
  DISCOURSE_SMTP_PASSWORD:  pYdRLyQW
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
  #DISCOURSE_SMTP_DOMAIN: noobish.me    # (required by some providers)
  DISCOURSE_NOTIFICATION_EMAIL: noreply@noobish.me    # (address to send notifications from)

  ## The http or https CDN address for this Discourse instance (configured to pull)
  ## see https://meta.discourse.org/t/14857 for details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## The maxmind geolocation IP address key for IP address lookup
  ## see https://meta.discourse.org/t/-/137387/23 for details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## The Docker container is stateless; all data is stored in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Any custom commands to run after building
run:
  - exec: echo "Beginning of custom commands"
  ## If you want to set the 'From' email address for your first registration, uncomment and change:
  ## After getting the first signup email, re-comment the line. It only needs to run once.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

그런 다음 app.yml 파일을 저장하고 종료합니다…

CTRL-X

y

Enter

다음으로 app.yml 파일의 권한을 설정합니다…

chmod o-rwx containers/app.yml

그리고…

앱 부트스트랩

cd /var/discourse
./launcher bootstrap app

이 과정에는 상당한 시간이 소요됩니다. 부트스트랩 과정의 끝에서 다음을 실행하라는 메시지가 표시됩니다:

./launcher start app

Vhost 파일 편집

이제 CloudPanel로 돌아가서 Discourse 사이트의 "Vhost Editor"에 아래 코드를 붙여넣습니다(기존 내용을 덮어쓰기). 물론 yoursite.com을 실제 도메인 이름으로 대체하십시오.

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name yoursite.com;
  {{root}}

  {{nginx_access_log}}
  {{nginx_error_log}}

  if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
  }

  location ~ /.well-known {
    auth_basic off;
    allow all;
  }

  {{settings}}

  add_header Cache-Control no-transform;

  location / {
                proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
                proxy_set_header Host $http_host;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;

  }
}

Nginx 재시작

다음으로 CloudPanel의 관리 영역에서 버튼을 클릭하여 Nginx를 재시작해야 합니다…

축하합니다!

이제 브라우저에서 사이트 URL로 이동하여 Discourse 설치 마법사를 실행할 수 있습니다…

평화로운 공존

이제 저는 깔끔하고 경량적인 관리 패널을 사용하여 터미널/커맨드 라인을 사용할 필요가 최소화되는 상태로, Ghost, Wordpress, Drupal 및 기타 유형의 사이트 바로 옆에서 제 Discourse 사이트를 자체 호스팅하고 관리할 수 있습니다.


추가 Discourse 인스턴스 설치…

3개의 좋아요

이 단계들을 삭제하고 이 오류가 발생하지 않도록 app.yml 파일을 생성해야 합니다. 이렇게 하면 혼란스럽습니다.

(전체 파일을 대체할 것이라면 왜 예시를 복사하나요?) 기존 샘플에서 무엇을 변경해야 하는지 말하는 것이 더 좋습니다. 소켓 템플릿과 강제 https 설정인 것 같습니다.

이렇게 하면 postgres가 두 개가 되며, 이는 단일 postgres보다 더 많은 RAM을 사용합니다. 동작은 하지만, 이는 모범 사례가 아닙니다.

이것이 좋은 예시로 따를 가치가 없게 만드는 여러 가지 이유가 있으며, 지원하기 매우 어려울 것입니다. 여러분이 자신에게 맞는 해결책을 찾았다는 점은 다행이지만, 사람들에게 이 길을 권하는 것은 좋은 방법이 아니라고 생각합니다.

3개의 좋아요

고맙습니다, @pfaffman –

맞는 말씀입니다. 목적은 달성하지만, 절차가 너무 지저분합니다. 순서도 잘못되어 있습니다. 조언해 주셔서 감사드리며, 수정하겠습니다.

왜 그렇게 생각하시는지 좀 더 자세히 설명해 주실 수 있을까요?

그건 복잡하고, 스스로 해결할 수 있는 사람들에게만 좋은 아이디어이기 때문입니다. 꽤 비효율적이고, 목표가 단순히 두 개의 토론(디스커스)을 실행하는 것이라면, 대부분의 경우 두 개의 독립적인 VM을 사용하는 것이 더 저렴하고 쉬운 해결책입니다.

2개의 좋아요

다시 한번 감사합니다, @pfaffman. 이제 절차를 간소화하고 같은 서버에 두 번째 Discourse 사이트를 추가하는 섹션을 제거했습니다.

1개의 좋아요

다음 메시지를 받았습니다

sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
usage: gpg [options] --dearmor [file]
curl: (23) Failed writing body

왜 그런가요?

안토니오, 안녕하세요. 환영합니다.

이것은 Discourse와 관련된 문제가 아니라 Docker 관련 문제로 보입니다. 여기서 질문하는 것보다 운영체제와 docker-ce 업데이트에 대해 검색하는 것이 더 도움이 될 것입니다.

Discourse를 사용하려는 건가요? 아니면 CloudPanel인가요?

1개의 좋아요

여기 있는 가이드를 그대로 따라했습니다. 도커 설치용 첫 번째 명령어를 실행했는데, 서버가 이렇게 응답했습니다.
명령어는 다음과 같습니다:

1개의 좋아요

해당 각 줄의 끝에 역슬래시()가 있어서는 안 됩니다. 역슬래시는 줄바꿈을 이스케이프하므로, 셸은 다음 줄을 같은 줄의 연속으로 취급합니다.

이 경우, 다음을 단일 명령으로 실행하려고 시도하게 되며, 여기서 오류가 발생합니다:
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable"

줄 끝의 역슬래시를 제거하면 이 문제가 해결됩니다:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
2개의 좋아요

감사합니다. 이제 잘 작동합니다.

2개의 좋아요

감사합니다 @Simon_Manning – 상단 게시물의 튜토리얼 코드 스니펫에서 백슬래시를 제거했습니다.

2개의 좋아요

실수했어요, 이제 이런 오류가 발생했습니다: FAILED

Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end' failed with return #<Process::Status: pid 112 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"
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.
214c73c4474ed59e7b6fb7f42143ce126d2b453022b08770da3af31ca2fdaaba

CloudPanel은 잘 모르지만, 오류 메시지는 스스로 설명이 되는 것 같습니다:

'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end'
'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"

./discourse-setup 실행 중 또는 app.yml 내부에서 이메일이 구성되지 않은 것으로 보입니다. (원하시는 시점에 수동으로 편집할 수 있습니다.) :thinking:

2개의 좋아요

죄송합니다만, 저는 페르미 고등학교의 교수입니다. 학교에 디스코스 커뮤니티를 설치하려고 하고 있습니다. 클라우드 패널을 사용 중이므로 해당 가이드를 따랐는데, Apparently 무언가 누락된 것 같습니다. 도움을 받을 수 있으며, 더 자세한 가이드를 받을 수 있을까요? 정말 감사합니다.

1개의 좋아요

시스템 관리에 대한 지식이 많지 않다면, 고급 설치를 사용하는 것이 여러분이 원하는 것이 아닐 수 있습니다. 또한 고려해야 할 중요한 점은, 이러한 설치 방식은 unsupported-install 범주에 해당하여 문제가 발생했을 때 여기서 도움을 받기 어렵다는 것입니다.

예산이 충분하고 커뮤니티의 규모에 따라, Discourse를 다른 서버에 호스팅하고 표준 설치 방식을 따르는 것이 더 나을 수 있습니다.

1개의 좋아요

죄송합니다. 이런 서비스가 어떤 용도로 쓰이는 건가요? 제 생각엔 가이드가 아주 상세하지는 않은 것 같고, 시스템 관리자를 대상으로 작성된 것 같습니다. 그냥 각 단계를 간단히 표시해 주는 것으로도 충분했을 것 같아요. 제 고향에서는 이렇게 말하더군요: “아무도 태어날 때부터 이미 교육받은 상태로 태어나는 사람은 없다.” 도움과 시간 내어 주셔서 감사합니다.

1개의 좋아요

맞습니다. 그래서 표준 설치를 권장한 것이죠.

그리고 @denvergeeks, 이런 가이드를 만드는 것이 처음부터 좋은 생각이 아니라고 생각한 이유이기도 합니다. 작성하기도 어렵고 유지보수도 힘들며, 이를 확인할 수 있는 사람은 오직 당신뿐이니까요.

4개의 좋아요

죄송하지만 동의하기 어렵습니다. 저는 이미 다양한 도메인을 사용하여 클라우드 패널(Cloud Panel)을 활용하고 있으며, 또한 디스코르스 커뮤니티(Discourse community)는 서브도메인으로 운영될 것입니다. 따라서 작성자의 전제가 매우 명확해 보입니다(이 가이드는 VPS에 다양한 서비스가 설치된 상태로 클라우드 패널을 사용하는 사람들을 위한 것입니다). 모든 것을 좀 더 자세히 설명하는 데는 조금의 노력만 들면 됩니다. 결국 지식 공유는 커뮤니티의 근간이며, 그렇지 않았다면 이미 설치되어 바로 사용 가능한 소프트웨어를 구매했을 것입니다. 아무쪼록 누구를 거슬리게 하고 싶지 않습니다. 도움을 받을 수 있다면 감사드리며, 그렇지 않다면 다시 번거롭게 하지 않겠습니다.

1개의 좋아요

@denvergeeks 이메일 설정은 정상적인 운영에 필수적이며, 표준 설치에 대한 링크는 제공되고 있지만 현재 가이드의 작성 방식은 이메일 설정은 물론 특정 설정 환경에서 중요할 수 있는 기타 정보들을 우회하고 있습니다.

Install Discourse부터 Bootstrap the App까지의 섹션을 다음과 같은 내용으로 대체하는 것이 가치가 있을지 궁금합니다:

Discourse 설치 및 구성

표준 설치 문서의 1단계부터 6단계까지를 따르세요: 표준 설치

<현재 Edit the app.yml File 섹션에 있는 작업을 수행합니다.>

Discourse 재빌드:

./launcher rebuild app

그리고 Congratulations! 섹션에서 스크린샷 아래에 "표준 설치 문서의 나머지 단계를 계속 진행하세요."와 같은 문장을 추가하는 것입니다. 본질적으로 대안적인 설치 지침을 제공하는 대신, 표준 설보를 보완하는 추가 단계를 제공하도록 가이드를 재구성하는 것입니다.

CloudPanel에 대해 제공해 주신 정보는 매우 유용하고 지침도 명확하지만, Discourse 쪽은 표준 설치와의 편차를 줄이는 것이 더 안전할 뿐만 아니라, #unsupported-install 태그를 통해 여기가 위험한 영역임을 더 명확히 알리는 데 도움이 될 것입니다.

2개의 좋아요

토론이 원래 주제에서 약간 벗어났지만, 기꺼이 도와드릴 수 있으니 안심하세요. :slight_smile:

요약하면 다음과 같습니다:

기본적인 IT 지식이 있다면 표준 설치 과정을 따를 수 있습니다. 도메인 이름도 필요하며, Mailgun과 같은 이메일 전송 서비스를 구성해야 합니다(튜토리얼: Configure Mailgun for email when using Digital Ocean for DNS).

이 포럼의 범위를 벗어난 사안에 대해서는 일반적으로 도움을 드리지 않습니다. 예를 들어 "도메인 이름을 어떻게 등록하나요?"라는 질문은 여기에 적합하지 않습니다.

기본적인 IT 지식이 없거나 예산에 따라, #marketplace에서 유료 지원을 요청할 수 있습니다.

마지막으로, 거의 모든 것을 저희가 처리해 드리고 팀 지원에 접근할 수 있는 Discourse 관리형 유료 플랜도 살펴볼 수 있습니다.

또한 학교를 위해 사용한다고 언급하셨으므로, 교육 목적에 대해 할인을 제공하는 점도 알아두시기 바랍니다:

교육 또는 비영리 기관에 대한 할인이 있나요?

네! 법적 교육 기관으로 인정받으신 경우 85% 할인을 제공합니다. 연방 세금 면제 대상 비영리 단체로 법적 인정을 받으신 경우 50% 할인을 제공합니다. 이러한 할인은 기본, 프로, 비즈니스 플랜에만 적용되며, 다른 할인과 중복 적용할 수 없고, 체크카드/신용카드로 월별 또는 연별로 결제해야 합니다. 저희에게 연락하여 트라이얼을 시작하신 후, 저희가 고객님의 계정에 할인을 적용해 드리겠습니다.

4개의 좋아요