同じドメインでカスタムアプリを /tickets で提供しつつ、/ で Discourse を実行する

皆さん、こんにちは。

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. カスタム Go アプリケーションが同じサーバーの 127.0.0.1:8080 で実行中
  3. ホスト上にインストールされた外部の nginx (コンテナ内ではない)

/forum のようなサブフォルダで Discourse を実行しようとしているわけではありません。また、誰かが尋ねる前に言っておきますが、Discourse チケットプラグインは試しましたが、望むようには動作しませんでした。

nginxを使えば簡単にできますが、推奨はされておらず、discourseが/ticketsルートを何かに使用しているという情報はありません。

迅速なご返信ありがとうございます!nginxを使用していますが、うまくいきません。これが私の設定ですが、まだ成功しません。

app.ymlファイル内の設定です

ports:
  - "127.0.0.1:4000:4000"
  #- "80:80" # http
  #- "443:443" # https

/etc/nginx/sites-enabled/filename

server {
    listen 80;
    server_name mydomain.com;

    # ---- チケットアプリ ----
    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;
    }
}

具体的にどこで苦労しているのか詳しく教えていただけますか?

「いいね!」 2

それらの手順が、おそらく最善の指示になるでしょう。その手順に従いますが、ある意味逆の順序になります。外部リバースプロキシで、/ を Discourse に、/tickets をあなたのアプリケーションに提供するようにします。

@pfaffman ということは、設定ではなくコンセプトを再利用する、つまり、外部リバースプロキシを前面に配置して以下のようにルーティングする、ということですね。

  • / → Discourse
  • /tickets → カスタムアプリ

Discourse は /tickets については全く認識しない、と。
つまり、こちらのガイドに従えばよいのですね: Serve Discourse from a subfolder (path prefix) instead of a subdomain

「いいね!」 1

外部のnginxを使うのが一番簡単な方法だと思います。内部のnginxでそれを可能にするテンプレートを作成することも可能ですが、より複雑になり、得られるメリットは少ないと思います。

ええ、しかし、ssl/let’s encryptのテンプレートを削除することと、ソケットを使用すること以外に、Discourseコンテナに変更を加える必要はありません。(ですから、そのトピックのほとんどはあまり役に立ちません。)

動作するようになりました!

お二方とも、返信ありがとうございます!

Discourseヘッダーに追加した「Tickets」リンクも機能します。/ticketsがDiscourseのルートとして扱われ、Reactビューを切り替えようとするため、空欄に設定した場合(selfではなく)は機能します。空欄にすると完全なページ再読み込みが強制されます。

「いいね!」 1

それを修正したい場合、Ember のことはあまり得意ではありませんが、テーマコンポーネントを追加して /tickets のルートを作成し、何かを指示することで修正できると確信しています(…何かを)。また、DISCOURSE_HOST_ALIASES を使用して Discourse サーバーに別のサブドメイン(例: tickets.mydomain.com)を追加し、そのドメインにリンクすることでリダイレクトが実行され、Ember がルートを掴もうとしなくなると思います。