동일 도메인에서 /에 Discourse, /tickets에 커스텀 앱을 실행하는 경우

여러분 안녕하세요,

Discourse를 루트(/)에 유지하면서 커스텀 애플리케이션을 서브패스에 서빙하기 위한 올바른 아키텍처를 확인하려고 합니다. Discourse 내부 코드를 수정하지 않는 것이 전제 조건입니다.

목표 (최종 목표)

https://mydomain.com/         → Discourse
https://mydomain.com/tickets  → 커스텀 티켓 시스템 (Go + Gin)

요구 사항:

  1. Discourse는 /에, 커스텀 앱은 /tickets에 위치해야 합니다.
  2. 동일한 도메인 사용
  3. Discourse 플러그인 사용 불가

현재 환경

  1. OVH VPS (Ubuntu), Docker에서 실행 중인 Discourse (/var/discourse)
  2. 같은 서버의 127.0.0.1:8080 포트에서 실행 중인 커스텀 Go 애플리케이션
  3. 컨테이너 외부(호스트)에 설치된 외부 nginx

Discourse를 /forum과 같은 서브폴더에 실행하려는 것이 아닙니다. 그리고 누군가 물어볼 수 있으니 미리 말씀드리자면, Discourse 티켓 플러그인을 사용해 봤지만 제가 원하는 방식대로 동작하지 않았습니다.

nginx를 사용하면 쉽게 수행할 수 있습니다. 권장되지는 않지만, discourse가 /tickets 경로를 다른 용도로 사용하는지는 제가 알지 못합니다.

빠른 답변 감사합니다! 저는 nginx를 사용 중인데 어려움을 겪고 있습니다. 제 설정은 아래와 같지만 여전히 해결되지 않습니다.

이 내용은 제 app.yml 파일 안에 있습니다

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

/etc/nginx/sites-enabled/filename

server {
    listen 80;
    server_name mydomain.com;

    # ---- Tickets 앱 ----
    location ^~ /tickets {
        proxy_pass http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Discourse 인증 헤더
        proxy_set_header X-Discourse-Username $http_x_discourse_username;
        proxy_set_header X-Discourse-User-Id $http_x_discourse_user_id;
        proxy_set_header X-Discourse-Groups $http_x_discourse_groups;
    }

    # ---- Discourse ----
    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_http_version 1.1;
        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

정확히 어디서 어려움을 겪고 있는지 자세히 설명해 주실 수 있나요?

아마 그 지침이 가장 좋은 방법일 것입니다. 다만, 그 지침을 약간 뒤집어서 따라야 합니다. 외부 리버스 프록시를 통해 / 경로는 Discourse로, /tickets 경로는 여러분의 앱으로 전달하도록 설정하면 됩니다.

@pfaffman 제가 이해한 내용은 다음과 같습니다: 개념은 재사용하되, 설정은 재사용하지 말 것 — 라우팅을 처리하는 외부 리버스 프록시를 앞에 배치합니다:

  • / → Discourse

  • /tickets → 사용자 정의 앱

Discourse는 /tickets 경로에 대해 전혀 인지하지 못하게 됩니다.
다음 링크를 참고해 보세요: Serve Discourse from a subfolder (path prefix) instead of a subdomain

외부 nginx를 사용하는 것이 가장 쉬운 방법이라고 생각합니다. 내부 nginx를 그렇게 하도록 템플릿을 만들 수도 있지만, 더 복잡하고, 저는 그로 인한 이득이 크지 않다고 생각합니다.

네, 하지만 ssl/let’s encrypt 템플릿을 제거하고 소켓을 사용하는 것 외에는 discourse 컨테이너에 변경 사항을 가할 필요가 없습니다. (즉, 실제로는 그 주제에서 많은 도움이 되는 부분이 아닙니다.)

드디어 작동하게 만들었습니다!

답변해 주셔서 둘 다 감사합니다!

Discourse 헤더에 추가한 “Tickets” 링크도, NOT self로 설정하고 공란으로 두면 잘 작동합니다. 이 경우 /tickets가 Discourse 라우트로 처리되어 단순히 react 뷰만 교체하려고 하기 때문입니다. 공란으로 설정하면 전체 페이지가 새로고침됩니다.

이 문제를 해결하려면, /tickets 라우트를 추가하고 해당 라우트에 . . . 무언가(저는 Ember에 능숙하지 않습니다)를 수행하도록 지시하는 테마 컴포넌트를 사용하는 것이 효과적일 것입니다. 또한, DISCOURSE_HOST_ALIASES를 사용하여 디스코urs 서버에 다른 서브도메인(예: tickets.mydomain.com)을 추가하고 해당 도메인으로 링크를 걸면 리다이렉트가 이루어져 Ember가 라우트를 가로채지 않도록 할 수 있다고 생각합니다.