こんにちは、
Web UI を介してアップグレードを実行すると、Discourse が以下を実行するように指示することがあります。
cd /var/discourse
git pull
./launcher rebuild app
rebuild プロセスは GitHub に複数回接続しますが、私のサーバーがホストされている中国では GitHub が部分的にブロックされているため、GitHub へのアクセスを改善するために HTTP/HTTPS プロキシを設定する必要があります。プロキシなしとプロキシありでの YouTube へのアクセスを比較した結果は以下の通りです。
root@iosre:/var/discourse# wget https://youtube.com
--2021-06-10 23:55:05-- https://youtube.com/
Resolving youtube.com (youtube.com)... 66.220.152.17, 2001::3d6f:fadc
Connecting to youtube.com (youtube.com)|66.220.152.17|:443... ^C
root@iosre:/var/discourse# export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
root@iosre:/var/discourse# wget https://youtube.com
--2021-06-10 23:56:12-- https://youtube.com/
Connecting to 127.0.0.1:7890... connected.
Proxy request sent, awaiting response... 301 Moved Permanently
Location: https://www.youtube.com/ [following]
--2021-06-10 23:56:13-- https://www.youtube.com/
Connecting to 127.0.0.1:7890... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
index.html [ <= ] 510.58K 813KB/s in 0.6s
2021-06-10 23:56:14 (813 KB/s) - ‘index.html’ saved [522830]
しかし、./launcher rebuild image を実行すると、スクリプトはアプリに入り、Docker 内ですべての操作を実行します。Docker 内のネットワーク環境はプロキシされたホストとは異なるため、YouTube にアクセスできず、rebuild はほとんどの場合失敗します。
root@iosre:/var/discourse# ./launcher enter app
root@iosre-app:/var/www/discourse# wget https://youtube.com
--2021-06-10 15:59:57-- https://youtube.com/
Resolving youtube.com (youtube.com)... 69.171.248.128, 2001::d238:33c1
Connecting to youtube.com (youtube.com)|69.171.248.128|:443... ^C
root@iosre-app:/var/www/discourse# export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
root@iosre-app:/var/www/discourse# wget https://youtube.com
--2021-06-10 16:00:10-- https://youtube.com/
Connecting to 127.0.0.1:7890... failed: Connection refused.
質問ですが、特に ./launcher rebuild app において、Docker 内でホストのプロキシを利用するにはどうすればよいでしょうか?
「いいね!」 2
pfaffman
(Jay Pfaffman)
2
もしかすると、Replace rubygems.org with taobao mirror to resolve network error in China をご覧ください。
また、中国向けのテンプレートも含まれています。templates フォルダで確認できますが、何をしているのかははっきりとはわかりません。
(あまり良い回答ではありませんが、2 日経っても回答がないようなので。)
「いいね!」 4
Jay さん、ありがとうございます!中国向けテンプレートは、taobao/アリババがホストする gems.ruby-china.com を用いて rubygems.org をミラーリングしています。
このアイデアに触発され、github.com を国内のサイト(できればアリババがホストするもの)でミラーリングしてみたいと思います。
「いいね!」 3
@snakeninny さん、質問の意図を正しく理解できていれば、以下のようなコマンドが必要かもしれません:
/var/discourse/launcher rebuild app --docker-args --net=host --skip-mac-address
この場合、おそらく app.yml の expose セクションを修正する必要があります(実際にコンテナがどのポートでリッスンしているかを確認するには、netstat -ltupen を実行してください)。
「いいね!」 2
イワン、ありがとう!これを試したのですが、app.yml の expose セクションを修正していません。どのように設定すればよいでしょうか?
「いいね!」 1
pfaffman
(Jay Pfaffman)
6
テキストエディタで app.yml を開き、「expose」を探してください。
「いいね!」 1
app.yml の expose セクションには以下が表示されます:
expose:
- "30080:80" # ホストのポート 80 をコンテナのポート 80 (http) に転送
- "2222:22" # ホストのポート 2222 をコンテナのポート 22 (ssh) に転送
ホストのポート 443 (https) をコンテナのポートに転送する必要がありますか?どのコンテナのポートに転送すべきでしょうか?
「いいね!」 1
pfaffman
(Jay Pfaffman)
8
以前は動作していませんでしたか?リバースプロキシが HTTPS 処理を行っていると思われます。
「いいね!」 1
いいえ、そうではありません。前述の通り、ホストでは YouTube にアクセスできますが、Docker 内ではできません。
「いいね!」 1
pfaffman
(Jay Pfaffman)
10
設定が少し複雑すぎて、問題の原因を特定するのが難しいですね。まずはリバースプロキシを使わずにセットアップすることをお勧めします。その後、以下のガイドを参考にしてください。
既存の Apache サイトがあるサーバーに Discourse を設定する方法
または
Discourse と同じマシンで他のウェブサイトを動かす
「いいね!」 2
@snakeninny さん、遅くなり申し訳ありません。
expose セクションで 30080:80 という設定をされているとのことですので、Nginx や Apache などでプロキシリクエストを設定するだけで大丈夫です。
以下は、私の Nginx 設定の例です(私は 30080 ではなく 2080 を使用しています)。
/etc/nginx/sites-available/00-default-ssl.conf
server {
...
location / {
# これは Docker を通常(ブリッジモード)で実行する際に Nginx で使用されます
proxy_pass http://example.com:2080/;
# Docker ネットワークがホストモード(--net=host)の場合に使用される 2 行
#proxy_pass http://example.com:3000/;
#proxy_redirect http://example.com:2080/ https://example.com;
proxy_read_timeout 90;
proxy_http_version 1.1;
proxy_set_header Host $http_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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
error_page 502 =502 /errorpages/discourse_offline.html;
proxy_intercept_errors on;
# 特定の IP からのリクエストをアクセスログから除外する場合があります
if ( $remote_addr = "x.x.x.x" )
{
access_log off;
}
}
location /errorpages/ {
alias /var/www/errorpages/;
}
}
コンテナをホストモード(--net=host)で実行する場合は、プロキシ設定を 3000 ポートを使用するように切り替え、リダイレクト(上記の例のようにおそらく https)を設定することを検討してください。
「いいね!」 2