Discourse로 리버스 프록시 설정

여기서 평범하지 않은 일을 해야 한다는 점이 정말 싫습니다. 다른 누구보다도 싫지만, 제가 아는 방법치고는 이것뿐이고, 제가 사용하는 다른 셀프호스팅 앱들도 모두 이렇게 실행되고 있습니다.

와일드카드 A 레코드를 내 네트워크의 내부 IP로 지정해 두었고, nginx proxy manager를 통해 포트 80과 443을 외부로 노출하고 있으며, SSL 인증서도 모두 설정되어 있습니다. 기존 네트워크 환경의 대부분을 docker로 구축해 두었기 때문에, nginx proxy manager는 docker 네트워크를 통해 HTTP 프록싱만 수행하므로 안전하게 사용할 수 있습니다.

discourse의 경우, discourse.MYDOMAIN.com을 별도의 A 레코드 아래에 다른 로컬 IP 주소로 설정하고 이름을 해석되도록 하였습니다. 그러나 nginx proxy manager의 lets encrypt 설정은 내부 IP 환경에서 작동하는 반면, discourse의 설정 방식은 내부 IP에서는 작동하지 않습니다.

그래서… 저는 단순히 리버스 프록시만 하고 싶습니다. 이 문제를 해결하기 위해 다양한 nginx 프록시 구성을 시도해 볼 계획입니다. 중간자 공격(man-in-the-middle attack)에 대해 약간 우려는 되지만, nginx proxy manager의 lets encrypt 구성은 내부 환경에서 작동하는데 왜 discourse는 작동하지 않는지 파악하고 싶습니다.

반드시 방법이 있을 거예요!

(P.S. 제 정신이 좀 흔들린 상태인 걸 압니다. 구체적인 질문을 주시면 더 명확하게 설명해 드리겠습니다)

여기에 언급된 dns-01 챌린지 옵션을 확인하고 있습니다.

가능하다면, 제 discourse 설정으로 어떻게 하면 될까요?

nginx proxy manager 뒤에 Discourse를 실행하는 방법에 대한 몇 가지 주제가 있습니다. 기본적으로 Discourse가 어떤 포트에도 바인딩되지 않도록 구성하고, app.ymllabels: 섹션에 필요한 라벨을 추가하면 됩니다.

nginx proxy manager 경로를 사용하는 경우, 즉 현재 제가 설정해 둔 방식(lets encrypt를 discourse VM 자체에 설정하는 대신)을 따를 때…

제 경우 discourse VM은 별개의 머신이기 때문에 여전히 discourse VM에서 포트 80에 바인딩해야 합니다.

현재 제 경험에 따르면, nginx proxy manager의 SSL 설정이 discourse VM의 IP 주소 포트 80을 가리키도록 구성되어 있어 Mixed Content 오류가 발생하고 있습니다.

코드에 하드코딩된 http:// 참조 때문에 이를 제거하는 것이 불가능하다고 생각합니다… 아니면 제가 틀린 건가요? 언급하신 그 labels 필드가 바로 이 부분을 변경하는 건가요?

여기(Run other websites on the same machine as Discourse)에 언급된 socketd 템플릿을 시도해 볼 계획입니다. 또한 여기(Run other websites on the same machine as Discourse)의 고급 탭에 있는 nginx proxy manager 설정도 함께 사용할 예정입니다.

force_https라는 설정이 있는데, 이를 ENV나 rails console을 통해 활성화해야 합니다.

또한 프록시에서 적절한 x-forwarded-proto를 설정하는 것도 잊지 마세요.

Unix 소켓 설정이 작동하지 않으면 그 방법을 시도해 보겠습니다. 도움을 주신 @Falco님과 @pfaffman님께 감사드립니다. 어떤 방식이 작동하는지 확인 후 다시 알려드리겠습니다.

Unix 소켓 설정을 할 수 없어요… 제 Discourse VM이 다른 머신에 있으니까요. 원래 계획으로 돌아가겠습니다. 포럼의 다른 게시물을 참고해서 force_https 활성화 방법을 알아볼게요. 참고로, 이 단계를 수행할 수 없어요.

실제로는 Falco가 제안한 것이 필요합니다.

nginx proxy manager에서:

proxy_set_header X-Forwarded-Proto $scheme;

이곳에서 force_https를 활성화할 수 있나요?

DISCOURSE_FORCE_HTTPS=true (환경 변수)라고 생각합니다.
또는
app.yml의 ENV 섹션에 DISCOURSE_FORCE_HTTPS: true를 설정하세요.

앞서 언급했듯이 GUI에서 이를 수행할 수 있었습니다.

@Falco, @pfaffman, @Jagster, @merefield… 여러분 모두에게 감사드립니다. 이제 리버스 프록시를 성공적으로 설정했고, 더 이상 Mixed Content 오류가 발생하지 않습니다.

discourse VM의 80 포트로 리버스 프록시를 설정하고 등록 등을 수행할 수 있게 된 후, GUI에서 force_https를 설정하고 nginx proxy manager의 고급 탭에 x-forwarded-proto 플래그를 추가하는 것만 남았습니다.