주요 웹사이트가 이미 운영 중이고 루트 도메인을 포럼 서버로(임시적으로라도) 가리킬 수 없는 상황에서, Cloudflare와 함께 서브폴더를 설정하는 과정에서 제가 취한 단계를 공유하고자 합니다.
핵심 사항
- 기존
mywebsite.com은 현재1.1.1.1을 가리키며 운영 중입니다. mywebsite.com/forum(및 그 하위 디렉터리)을2.2.2.2로 라우팅해야 합니다.- Discourse 설치 과정에서 Let’s Encrypt 인증(도메인이 현재 서버를 가리키는지 확인)를 통과할 수 없으므로, DNS 인증을 사용해야 합니다.
app.yml 변경 사항
Let’s Encrypt 업데이트
이 주제에 따라 새로운 Let’s Encrypt 템플릿을 생성하고 app.yml에 설정하십시오: LetsEncrypt DNS Validation Template Using Cloudflare
다만, 해당 게시물에서 issue_cert 메서드만 복사하고, 나머지 내용은 원래의 web.letsencrypt.ssl.template.yml에서 가져오시기 바랍니다(게시물 작성 후 템플릿이 변경되었기 때문입니다).
LETSENCRYPT_CF_TOKEN: ""
LETSENCRYPT_CF_ACCOUNT_ID: ""
LETSENCRYPT_CF_ZONE_ID: ""
LETSENCRYPT_DNS_PROVIDER: "dns_cf"
- Cloudflare 토큰은 CF 내 프로필 → “API Tokens” 페이지에서 생성할 수 있습니다.
- 계정 ID와 Zone ID는 도메인의 개요(Overview) 페이지에서 확인할 수 있습니다.
- DNS 제공자 값은 위와 같이 유지하십시오.
서브디렉터리 업데이트
이 주제에 따라 Serve Discourse from a subfolder (path prefix) instead of a subdomain env: 아래에 DISCOURSE_RELATIVE_URL_ROOT: /forum를 설정하고 run: 섹션을 업데이트하십시오.
사용자 IP 관련해서는 이 게시물을 참고하십시오: Serve Discourse from a subfolder (path prefix) instead of a subdomain - #111 by varun21
재빌드(Rebuild)
app.yml을 변경한 후 재빌드 명령을 실행할 때, 도메인이 현재 서버의 IP를 가리키는지 확인하는 Discourse 체크를 건너뛰어야 합니다(우리 mywebsite.com은 이미 1.1.1.1을 가리키고 있으며, Discourse는 루트 도메인을 확인하기 때문입니다). 이를 위해 다음을 실행하십시오:
./launcher rebuild app --skip-connection-test
Cloudflare 설정
일부 사람들은 /forum을 2.2.2.2로 라우팅하기 위해 Workers 사용을 권장하지만, 저는 로드 밸런싱(Load Balancing)을 사용하는 것이 훨씬 더 쉽다고 느꼈습니다. Workers를 사용해도 Rocket Loader와 유사한 설정들을 비활성화하더라도 CSS/JS 관련 문제를 해결할 수 없었습니다. 따라서,
- 로드 밸런서를 활성화하십시오(Traffic 메뉴 아래)
- “Manage Pools” → "Create"를 선택하십시오.
- 2개의 풀(주요 웹사이트용과 포럼용)을 생성하십시오. 각 풀에는 단 하나의 엔드포인트만 있어야 합니다.
- 로드 밸런서를 생성하고, 호스트명은
mywebsite.com으로 설정하십시오. - 엔드포인트 섹션에서 두 개의 풀을 모두 선택하십시오.
- 모니터는 건너뛰십시오(서버의 상태를 모니터링할 필요가 없으므로, 주요 웹사이트는 항상
1.1.1.1으로, 포럼은2.2.2.2로 가리켜야 합니다). 트래픽 스티어링도 건너뛰십시오(기본값은 꺼져 있음). - Custom Rule에서 경로 조건을
/forum으로 설정하고 포럼 엔드포인트를 가리키는 규칙 하나를 생성하십시오.
- 저장/배포(Save/Deploy)를 누르십시오.
참고 사항
- 어떤 이유에서인지 샘플 app.yml을 복사한 후 재빌드하는 방식이 저에게는 작동하지 않았습니다(아마 제가 무언가를 잘못했을 것입니다). 해결책으로, 처음에는 다른 도메인으로 discourse-setup을 실행한 후, 위에서 언급한 app.yml 변경 사항과 함께 호스트명을 변경하고 최종 재빌드를 수행했습니다.
- Discourse는 Let’s Encrypt에서
RSA cert와ECDSA cert두 개의 인증서를 생성합니다. Let’s Encrypt에는 **정확한 도메인(exact domain)**당 주 5개 인증서라는 제한이 있습니다. 만약 2번 연속으로 잘못 설정하면, 3번째 시도는 인증서 하나만 발급하고 포럼이 작동하지 않을 수 있습니다(현재 제한 상태는 이 스크립트로 확인할 수 있습니다: GitHub - sahsanu/lectl: Script to check issued certificates by Let's Encrypt on CTL (Certificate Transparency Log) using https://crt.sh · GitHub). - CF 로드 밸런서는 무료가 아니지만, (현재 기준) 50만 건의 DNS 요청당 5달러라는 비용을 고려할 때, nginx 등과의 번거로움에 비해 가치가 있다고 생각합니다.

