이 설치 방법은 공식적으로 권장되지 않습니다. 사용에 따른 모든 책임은 사용자에게 있습니다.
Discourse 팀은 공식 설치 가이드를 사용하여 설치하는 것을 권장합니다.
이는 지원되지 않는 설치 방식이며, CloudPanel에 익숙하고, 경험이 있는 시스템 관리자이며, Docker와 리버스 프록시에 친숙하며, 표준 설치를 성공적으로 완료한 사용자에게 적합합니다.
CloudPanel을 사용하는 이유
CloudPanel이 설치된 VPS 또는 전용 서버에 Discourse 포럼을 설치하고 싶은 이유는 무엇일까요?
저의 이유는 다음과 같습니다:
서버 및 사이트 관리에는 그래픽 인터페이스를 선호합니다. 웹 호스팅 제어 패널 중 대부분을 한때는 사용해 본 경험이 있습니다.
나머지 패널들과 비교했을 때, CloudPanel은 매우 슬림하고 미니멀하며 깔끔합니다. 제가 필요한 모든 기능이 매우 단순하고 직관적으로 제공되며, 그 이상은 없습니다. 제가 필요하지 않은 것은 아무것도 없습니다.
저는 Discourse 포럼 외에도 Ghost 블로그, Wordpress 사이트, Drupal 사이트 및 기타 유형의 사이트를 개발하고 호스팅하며 관리합니다. 저는 Ghost 블로그와 Wordpress, Drupal 사이트 바로 옆에 Discourse 포럼을 호스팅할 수 있는 서버 하나만 있으면 충분합니다. (각 Discourse 인스턴스마다 별도의 서버를 구매하고 유지보수하고 싶지 않습니다.)
CloudPanel에는 (박스에서 바로 꺼내 쓸 수 있는) 내장 Nginx와, 같은 서버에서 Discourse 인스턴스 하나 이상 또는 다른 유형의 웹사이트와 함께 실행하기 위해 필요한 리버스 프록시를 설정하고 관리하는 간단한 인터페이스가 포함되어 있습니다.
Discourse 팀(그리고 여기 메타 포럼 스태프)은 Cpanel이나 Plesk, 또는 (이번 경우처럼) CloudPanel과 같은 대체 서버 환경이나 커맨드 라인에서 출발하는 기타 환경에 대한 지원을 제공하지 않습니다.
그래서 다른 사람들에게 유용할 수 있기를 바라며 제 설정과 과정을 공유하고자 합니다.
[누군가 이 방법을 시도해 보신다면, 어떻게 작동하는지 또는 제가 이 튜토리얼을 어떻게 개선할 수 있는지 알려주세요!
]
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 인스턴스 설치…








