Ember-CLI 프록시 오류로 인해 Docker 서브폴더 설치가 작동하지 않나요?

(이 게시물을 unsupported-install 태그로 달았지만, 어떤 경우든 고수의 조언을 듣고 싶습니다 :slight_smile:)

여러분, 저는 Docker Compose를 통해 비교적 단순한(?) 멀티 도커 컨테이너 환경에서 기본 Discourse 이미지를 실행해 보려 하고 있습니다.

기본적인 설정은 다음과 같습니다:

  • 포럼은 서브폴더에 위치해 있으며, 이를 /board라고 부르겠습니다. 즉 (https://blah.com/board)
  • nginx는 /board:443으로 들어오는 요청을 localhost:4000으로 전달하고 있습니다.
  • Discourse Rails는 포트 4000에서 실행되었습니다. (3000 포트는 다른 서비스에서 사용 중이므로)
  • Rails ENV에는 이 설정을 작동하게 하는 중요한 설정이 포함되어 있습니다:
    DISCOURSE_RELATIVE_URL_ROOT: “/board”

이제 Discourse 버전을 업데이트(Ember-CLI 이전 버전)했는데, 더 이상 작동하지 않습니다.

그래서 당연히 Ember-CLI 컨테이너를 추가했는데, 실행 명령은 다음과 같습니다:

discourse-ember:
    command: bin/ember-cli --port 4000 --proxy "http://localhost:4200"

이제 Ember가 4000 포트에서 들어오는 요청을 가장 먼저 처리하게 됩니다.

Discourse Rails 컨테이너를 포트 4200으로 옮기고 시작했습니다.

먼저 좋은 소식부터:

  • 개발 사이트로 curl을 보내면 작동합니다!

이제 나쁜 소식:

  • 브라우저에서는 작동하지 않습니다. 왜일까요?:

    Apparently Discourse에 접근하려 하지만 다음을 요청하고 있기 때문입니다:

/bootstrap.json

다음과 같은 오류가 발생합니다:

Discourse Ember CLI Proxy Error
Error: Could not get http://0.0.0.0:4200/bootstrap.json

FetchError: invalid json response body at http://0.0.0.0:4200/bootstrap.json?for_url=%2Fboard reason: Unexpected token N in JSON at position 0

대신

/board/bootstrap.json (이것은 데이터를 반환합니다)를 요청해야 합니다.

대신 이 설정을 사용하게 되면:

  discourse-ember:
    command: bin/ember-cli --port 4000 --proxy "http://0.0.0.0:4200/forum"

Rails 오류가 발생합니다:

Routing Error
No route matches [GET] "/forum"

그런데 불과 몇 줄 아래에서 이렇게 제공해 줍니다:

bootstrap_path	GET	/bootstrap(.:format)	
bootstrap#index {:format=>/(json|html|\*\/\*)/}

이것이 제가 도달하려고 했던 정확한 경로인데 말이죠?

Ember가 bootstrap 정보를 가져오려 할 때 서브폴더로 프록시하도록 어떻게 만들 수 있을까요? 즉:

http://0.0.0.0:4200/forum/bootstrap.json

이 경우 Ember는 자체 컨테이너에서 실행되고 있다는 점을 기억해 주세요.

컨테이너를 어떻게 빌드하고 계신가요? docker-compose로 해당 컨테이너를 실행하고 계신 건가요?

음… ember-cli가 동작하지 않도록 시도할 수 있는 환경 변수 설정이 있었는데, 그걸 제거하셨나요? (어쨌든 지금은 무시되는 것 같지만요?)

네, 이 컨테이너 정의는 docker-compose에 있습니다.

현재 ember-cli 컨테이너에는 환경 설정이 없습니다.

docker-compose가 실행하기 전에 서브도메인 대신 서브폴더(경접 접두사)로 Discourse 서빙 문서에 있는 내용으로 launcher를 사용하여 컨테이너를 빌드하고 있는 건가요?

프록시는 무엇인가요? launcher로 discourse를 실행하고, 필요한 다른 설정은 docker-args를 사용하여 설정하는 것만으로도 충분할 수 있습니다. traefik의 경우, 저는 다음과 같이 설정합니다:

        --docker-args "-l traefik.frontend.rule=Host:{{discourse_hostname}};PathPrefix:/{{discourse_subfolder}} \
        -l traefik.frontend.entryPoints=https \
        -l traefik.backend={{discourse_shortname}} \
        -l traefik.port=80 \
        {{ docker_extra_args | default('')}}"

아니요, 저는 그냥 Discourse Docker 이미지(버전 2.8.9)를 사용 중입니다.

(실제로 이미지는 로컬에 호스팅되어 있지만, 내용은 다음과 같습니다:)

  discourse:
    command: bin/rails s -b 0.0.0.0 -p 4200
    image: discourse:v2.8.9
    environment:
      DISCOURSE_PORT: 4200
      DISCOURSE_RELATIVE_URL_ROOT: “/board”
     <SNIP>
    ports:
      - 4200:4200
  discourse-ember:
    command: bin/ember-cli --port 4000 --proxy "http://0.0.0.0:4200"
    image: discourse:v2.8.9
    ports:
      - 4000:4000

음. 그렇다면 이전에는 어떻게 작동했는지 설명할 수 없겠네요. 서브폴더 설치를 지원하기 위해 필요한 항목을 추가하는 런처가 포함된 이미지를 구축해야 할 것 같습니다.

해결했습니다.

Ember CLI 컨테이너에 이 항목을 추가하지 않은 건 제 실수였습니다. (Rails 컨테이너에는 이미 있었습니다.)

DISCOURSE_RELATIVE_URL_ROOT: "/board"

아차 :sweat_smile:

참고로 소스 코드에서 해당 키 파일은 아마도 이것일 겁니다: