Установка Docker в подпапку не работает из-за ошибки прокси Ember-CLI?

(Я пометил это как unsupported-install, но буду признателен за мнение экспертов, несмотря на это :slight_smile:)

Ребята, я пытаюсь запустить базовый образ Discourse в относительно простом наборе из нескольких Docker-контейнеров с помощью Docker Compose.

Вот основы:

  • Форум находится в подпапке, назовём её /board, то есть (https://blah.com/board)
  • nginx перенаправляет запросы к /board:443 на localhost:4000.
  • Discourse Rails работал на порту 4000 (потому что порт 3000 занят чем-то другим)
  • В переменных окружения Rails есть критически важная настройка, обеспечивающая эту работу:
    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 и запустил всё.

Сначала хорошие новости:

  • Запрос к dev-сайту через 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 в настоящее время отсутствуют настройки окружения.

Вы собираете контейнер с лаунчером, используя материалы из статьи Размещение Discourse в подпапке (префикс пути) вместо поддомена, прежде чем запускать его через docker-compose?

Какой у вас прокси? Может, стоит просто запустить 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('')}}"

Нет, я просто использую образ Docker для Discourse (версия 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:

Кстати, ключевой файл в исходном коде, насколько я помню, находится здесь: