Discourse 포럼을 WordPress 서버와 함께 실행하고 싶습니다. 하지만 두 서비스 모두 기본적으로 포트 80과 443을 사용하죠. 이 문제를 해결하기 위해 NGINX 리버스 프록시를 사용해, 외부에서 접근하는 서브도메인을 백엔드에서 다른 포트에서 실행 중인 애플리케이션으로 변환할 계획입니다. 아래는 Discourse를 설치하기 위해 수행한 단계입니다:
mkdir /var/discourse
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
# 설정 파일 생성
cat <<"EOF" > /var/discourse/containers/discourse
## 이것은 올인원, 스탠드얼론 Discourse Docker 컨테이너 템플릿입니다
##
## 이 파일을 변경한 후에는 반드시 재빌드해야 합니다
## /var/discourse/launcher rebuild app
##
## 편집할 때 *매우* 주의하세요!
## YAML 파일은 공백이나 정렬 실수에 대해 매우 민감합니다!
## 필요할 경우 http://www.yamllint.com/에서 이 파일을 검증하세요
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## Lets Encrypt(https)를 추가하려면 아래 두 줄의 주석을 해제하세요
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## 이 컨테이너가 노출해야 할 TCP/IP 포트는 무엇인가요?
## Apache나 nginx 같은 다른 웹서버와 포트를 공유하려면
## https://meta.discourse.org/t/17247 을 참고하세요
expose:
- "10080:80" # http
- "10443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## db_shared_buffers를 총 메모리의 최대 25%로 설정하세요.
## bootstrap이 감지된 RAM 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
#db_shared_buffers: "256MB"
## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다
#db_work_mem: "40MB"
## 이 컨테이너가 사용할 Git 리비전은 무엇인가요? (기본값: tests-passed)
#version: tests-passed
env:
LC_ALL: en_GB.UTF-8
LANG: en_GB.UTF-8
LANGUAGE: en_GB.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## 동시 웹 요청을 얼마나 지원할 수 있나요? 메모리와 CPU 코어 수에 따라 달라집니다.
## bootstrap이 감지된 CPU 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
#UNICORN_WORKERS: 3
## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
## 필수 항목입니다. Discourse는 IP 주소만으로는 작동하지 않습니다.
DISCOURSE_HOSTNAME: 'forum.example.com'
## 컨테이너가 위에서 지정한 도메인 이름(-h 옵션)과 동일한
## 호스트네임으로 시작되도록 하려면 주석을 해제하세요 (기본값 "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: 초기 가입 시 관리자 및 개발자로 지정될 쉼표로 구분된 이메일 목록
## 예시 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'webmaster@example.com'
## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
# SMTP 주소, 사용자 이름, 비밀번호는 필수입니다
# 경고: SMTP 비밀번호에 '#' 문자가 있으면 문제가 발생할 수 있습니다!
DISCOURSE_SMTP_ADDRESS: smtp-relay.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: info@example.com
DISCOURSE_SMTP_PASSWORD: password
DISCOURSE_SMTP_ENABLE_START_TLS: true # (선택 사항, 기본값 true)
#DISCOURSE_SMTP_DOMAIN: discourse.example.com # (일부 제공업체에서 필수)
DISCOURSE_NOTIFICATION_EMAIL: no-reply@example.com # (알림을 보내는 주소)
## Lets Encrypt 템플릿을 추가했다면, 무료 SSL 인증서를 얻으려면 아래 주석을 해제하세요
LETSENCRYPT_ACCOUNT_EMAIL: webmaster@example.com
## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (인출 설정)
## 세부 사항은 https://meta.discourse.org/t/14857 을 참고하세요
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## IP 주소 조회를 위한 maxmind 지리 위치 IP 주소 키
## 세부 사항은 https://meta.discourse.org/t/-/137387/23 을 참고하세요
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## Docker 컨테이너는 상태가 없으며(stateless), 모든 데이터는 /shared에 저장됩니다
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## 플러그인은 여기에 배치됩니다
## 세부 사항은 https://meta.discourse.org/t/19157 을 참고하세요
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## 빌드 후 실행할 사용자 정의 명령
run:
- exec: echo "Beginning of custom commands"
## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
## 첫 번째 가입 이메일을 받은 후, 이 줄의 주석을 다시 설정하세요. 한 번만 실행하면 됩니다.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "End of custom commands"
EOF
# 설정 파일로 discourse 설정
./launcher bootstrap discourse
Discourse가 올바른 포트에서 리스닝하는지 확인할 수 있습니다:
root@ubuntu-server:~# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:10080 0.0.0.0:* LISTEN 185948/docker-proxy
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 150667/docker-proxy
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 150655/docker-proxy
tcp 0 0 0.0.0.0:10443 0.0.0.0:* LISTEN 185937/docker-proxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 169991/nginx: maste
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 519/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1465/sshd: /usr/sbi
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 169991/nginx: maste
tcp6 0 0 :::22 :::* LISTEN 1465/sshd: /usr/sbi
URL과 포트 번호로 curl을 실행하면 301 Moved permanently가 반환됩니다:
root@ubuntu-server:~# curl forum.example.com:10080
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>