別のアプリから直接データベースに接続することは可能でしょうか?

アプリは Discourse の Docker コンテナの外、ただし同じサーバー上に配置されます。その場合、この設定方法に関する詳細を共有できる方、またはガイドや手順をご案内いただける方はいらっしゃいますでしょうか?

また、DE プラグイン/API を使用する代わりにこの方法を採用することによる欠点はありますでしょうか?

主な欠点は、そのような接続が書き込みアクセスに使用される可能性があるという点です。これは要件ですか?

もしあなたの統合がデータベースへの書き込みアクセスを必要とする場合は、必要な操作のみを公開するプラグインの作成を検討してください。

「いいね!」 2

必須ではありませんが、その欠点については問題ありません :slight_smile:

DE プラグインを使い始めましたが、残念ながら私のユースケースでは直接接続が必要になるようです。サイト上のユーザーが私一人なのに、API 経由で一部のページに対してリクエストが多すぎます。これらは主にカスタムクエリなので、それが影響しているのかはわかりません。それでも DE プラグインは大好きです!
コンテナ外から Postgres DB に直接接続する最適な方法は何かご存知でしょうか?参考までに、フォーラムとサイトは同じサーバー上にあります。


編集: DE プラグインでレート制限に引っかかっているようですが、同じサーバーからのリクエストであればレート制限が適用されないとおっしゃっていたのを Sam さんに見た記憶があります。これはまだ有効でしょうか?

可能ではありますが、他のアプリケーションがテーブルにロックを保持し、Discourse の通常動作を妨げる可能性があります。

必要な API エンドポイントを追加する新しいプラグインを採用するか、Discourse を複製する別の PostgreSQL インスタンスを完全に構築し、そこにアプリケーションを接続する方法もあります。

「いいね!」 3

情報ありがとうございます、ラファエル。私は select 文のみを使用する予定です。私の知る限り、これらはロックをかけないので、Discourse 側のテーブル変更(つまりアップグレード時)と、他のアプリを一時的にオフにできる場所のみを気にすればよいことになります。これでロックに関する懸念は解消されますか?

データベースの複製については、興味深い選択肢のようですが、リアルタイムで実行可能でしょうか?つまり、最新状態との差が数分以内にとどまるようにできるでしょうか?(私は頻繁に最新トピックを取得する必要があります。サイトのほぼすべてのページにそれらが表示されますが、2 分間キャッシュしています。ただし、ページや条件ごとに異なり、このようなタイプのページは数百あります。)また、データベースが成長すると、この選択肢は使えなくなるかもしれませんか?(別の Discourse フォーラムでは、すでにデータベースが数 GB あります。)

(プラグインを作成するのはここでは選択肢ではないと思います。Data Explorer プラグインよりも優れている方法が見当たらないからです。実際、DE プラグインはこの問題を除けばほぼ完璧です。)

なぜ動かないのか、何かご存知の方はいらっしゃいますか?

このトピックの @pfaffman@Nacho_Caballero の投稿:

および、@mpalmer のこちらの投稿:

を参考にしました。

まず、app.yml を以下のように編集しました:

expose:
  - "127.0.0.2:5432:5432"

その後、コンテナを再構築しました。コンテナ内で postgres ユーザーのパスワードを設定し、コンテナ内からは以下のように接続できました:

psql -h localhost -d discourse -U postgres

しかし、コンテナから抜け、外部から接続しようとすると以下のようなエラーになります:

# psql -h 127.0.0.2 -p 5432 -d discourse -U postgres
psql: server closed the connection unexpectedly
	This probably means the server terminated abnormally
	before or while processing the request.

ポート番号を他の値に変更しても同じエラーになります。IP アドレスの 127 は docker ps とネットワーク設定の Inspect から取得しました(3 つのスタンドアロン Discourse インスタンスを稼働させています)。

IP アドレスを他の Discourse フォーラムのアドレスに変更すると、より即座に異なるエラーメッセージが表示されるため、上記の設定は一部正しいようです:

# psql -h 127.0.0.3 -p 5432 -d discourse -U postgres
psql: could not connect to server: Connection refused
	Is the server running on host "127.0.0.3" and accepting
	TCP/IP connections on port 5432?

何が間違っているかご教示いただけないでしょうか?
psql: server closed the connection unexpectedly で Google 検索すると、ネットワークの問題が示唆されています。コンテナ内で他に何か設定を変更する必要があるのでしょうか?

コンテナ外部からこれを動作させる方法は、SSHトンネルを使用することです。私は実際には postgres を使用する代わりに新しいユーザーを作成し、SSH と postgres 用にカスタムポートを設定しましたが、これはあなたの設定でも機能するはずです:

ssh -L 5432:localhost:5432 EXTERNAL_VPS_IP "psql -U postgres -d discourse -h localhost"

EXTERNAL_VPS_IP は、リモートサーバーに接続する際に使用する IP アドレスです。

それでも動作しない場合は、app.yml で公開する IP を、docker ps から取得した内部コンテナ IP の代わりに、docker ブリッジ IP に変更してみてください。これが必須かどうかはわかりませんが、私の設定はこうなっています:

expose:
  - "127.0.0.1:5432:5432"
# またはカスタムポートを使用する場合:  - "127.0.0.1:CUSTOM_PORT:5432"

その後、コンテナを再ビルドすることを忘れないでください。

結果を教えてくださいね。すべてが動作するようになるまでに非常に長い時間がかかりました(振り返ってみればそれほど単純だったのですが)、お手伝いできて嬉しいです。

「いいね!」 1

@Nacho_Caballero 情報ありがとうございます。特にdockerに関するリンクが参考になりました!

あなたのスレッド(および他のスレッド)でのアドバイスが正しかったようです。以下が必要です:

expose:
  - "127.17.0.1:5432:5432"

そのリンクにも記載されている通り、Docker は自動的にコンテナの正しい IP に転送します(これらの IP が動的であるため、これは理にかなっています。私も以前疑問に思っていた点です)。ほとんどの設定では、これで十分だと思います。

ただ、私はすでにそれを試していました。では、私の問題は何だったのでしょうか?それはファイアウォールでした!(psql: server closed the connection unexpectedly というエラーがどこかで見た覚えがあると思い出しました!)

すべて解決しました。皆様、ありがとうございます :blush:

「いいね!」 2

よかった!解決できて何よりです。お使いのファイアウォールは iptables ですか?ポート開放はどう行いましたか?

「いいね!」 2

私は firewalld を使用していますが、iptables の場合は以下のような設定で動作するはずです:

iptables -A INPUT -p tcp --dport xxxx -j ACCEPT
iptables -A OUTPUT -p tcp --dport xxxx -j ACCEPT
「いいね!」 1