中国からの手動アップグレードを楽に
手順
- 中国国外で SOCKS5 プロキシを作成
- 中国国内サーバーでプロキシ接続を設定・構成
- 編集を簡単にするためのテンプレートを作成
- テンプレートに Git プロキシ設定を追加
app.yml にテンプレートを含める
- アプリを再構築
1 - リモート SOCKS5
使いやすさ(そして手頃な価格)を考慮し、シンガポールなどの地域に Digital Ocean サーバーをセットアップすることを推奨します。標準的な Ubuntu サーバーを使用し、SSH キーペア、UFW など、すべての基本的なセキュリティ要件の設定を完了した後、Shadowsocks をインストールします。
リモートマシン上
$ sudo apt install shadowsocks-libev
プロキシ設定を構成します。
$ cd /etc/shadowsocks-libev
# 元のファイルを保持するのが好きなので
$ sudo cp config.json orig.config.json
$ sudo nano config.json
timeout と method に特に注意してください。
{
"server":"123.123.123.123", # リモートサーバーの IP
"server_port":8400, # お好みで
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= 必須!
"method":"chacha20-ietf-poly1305"
}
systemd 設定(/lib/systemd/system/shadowsocks-libev-local@.service)内のすべての設定をダブルチェックしてください。shadowsocks-libev-local@.service を有効にし、再起動して、サービスが実行されているか確認します。
2 - 中国国内サーバーでのプロキシ接続設定
Discourse マシン上
$ sudo apt install shadowsocks-libev
Aliyun を使用している場合は、彼らの奇妙なコンソール内のファイアウォール設定を検索し、それぞれのポート設定を確認してください。
クライアントマシンで systemd 設定をいじくり回す必要はありませんが、Docker 用と通常の使用用の設定ファイルを分けて保持してください。Docker のコンテキスト外でも SOCKS5 プロキシを使用する可能性があるため、Docker でアクセス可能なネットワークアドレスの代わりに 127.0.0.1 を使用したい場合があるからです。
$ cd /etc/shadowsocks-libev
$ sudo cp config.json local.json
$ sudo cp config.json docker.json
設定を以下のように適応させます。
$ sudo nano local.json
{
"server":["123.123.123.123"], # リモートマシンの IP
"mode":"tcp_and_udp", # 私のセットアップでは異なるバージョンの shadowsocks-libev があるため、この注釈が異なります
"server_port":8400,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= これを確認してください
"method":"chacha20-ietf-poly1305"
}
便宜上、.bashrc にエイリアスを追加しましょう。
$ nano ~/.bashrc
# 貼り付け
alias dockershadow='ss-local -c /etc/shadowsocks-libev/local.json'
Docker がホストマシンのネットワークを通過できるように、もう一方の設定も適応させます。
$ sudo nano docker.json
{
"server":["123.123.123.123"],
"mode":"tcp_and_udp",
"server_port":8400,
"local_address":"172.17.0.1",
"local_port":1080,
"password":"Swordfish",
"timeout":600,
"method":"chacha20-ietf-poly1305"
}
Docker 固有の設定を使用するためのエイリアスを設定します。
alias dockershadow='ss-local -c /etc/shadowsocks-libev/docker.json'
3 & 4 - app.yml を整理するためのテンプレート作成
これは完全にオプションであり、好みに依存します。私は app.yml を読みやすく短く保ち、代わりにコンポーネントを別の場所で管理することを好みます。名前は好みに合わせて付けられますが、私は web.git.template.yml にしました。
$ nano templates/web.git.template.yml
# 貼り付け:
hooks:
before_code:
- exec:
cmd:
- git config --global http.proxy socks5://172.17.0.1:1080
- git config --global https.proxy socks5://172.17.0.1:1080
- git config --global https.sslVerify = false
# オプション
after_code:
- exec:
cmd:
- git config --global --unset http.proxy
- git config --global --unset https.proxy
- git config --global --unset https.sslVerify
私は after_web フックでテストしましたが、それはうまくいきませんでした。
5 - app.yml の適応
app.yml でテンプレートを呼び出します。
$ cd /<discourse dir>
$ sudo nano containers/app.yml
templates:
- "templates/web.template.yml"
- "templates/web.china.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.socketed.template.yml"
- "templates/web.git.template.yml"
テンプレートセクションは多分異なる表示になっているでしょうが、web.china と web.git-blabla(またはあなたが付けた名前)のテンプレートを含めるようにしてください。app.yml で 1080:1080 を公開しないでください!
6 - 再構築
再構築する前に、Git でのクローン時にプロキシ設定が機能しているか確認してください。
$ git config --global http.proxy socks5://172.17.0.1:1080
$ git config --global https.proxy socks5://172.17.0.1:1080
$ git config --global https.sslVerify = false
もちろん、これによりユーザーのホームディレクトリにある .gitconfig にプロキシフラグが追加されますので、テスト後に削除するよう注意してください。
GitHub 上の多数のファイルを持つランダムな大きなリポジトリを選択し、クローン速度を確認してください。設定が正しければ、Aliyun のセットアップにもよりますが、約 12〜15 MB/s でクローンできるはずです。接続速度が 200 KB/s から徐々に約 10 MB/s まで上昇する場合は、努力は失敗しています。
最後に再構築します。
$ cd /<discourse directory>
# 以前設定したエイリアスを使用してプロキシを実行
$ dockershadow
$ ./launcher rebuild app
再構築プロセスは頻繁に失敗するため、根気(そしておそらく白酒)が必要です。app.yml に設定されているプラグインが少ないほど、再構築が成功する可能性が高くなります。
7 - 備考
私はこれをまだ 本番環境対応 の手順ではなく、単なる回避策と考えています。そのため、GitHub リポジトリを中国国内でミラーリングする方法について、誰かがアイデアを持っているかもしれません。そうすれば、この作業がもう少し楽になるでしょう。ご存知の通り、GFW 内部の不透明なメカニズムは絶えず変化しています。
もちろん、SOCKS5 プロキシは多くの選択肢の一つに過ぎませんが、私は多目的なソリューションを手にしたいと考えています。
もし誰かがこの回避策を本番環境対応にするアイデアを持っているなら、あなたの意見をお待ちしています。Discourse は素晴らしいソフトウェアですが、中国で広く使用されていない理由の一つは、面倒なインストールとメンテナンスプロセスだと推測します。過去 1 年間は、nGinx リバースプロキシで設定したタイムアウト設定に関係なく、GUI 経由でのアップグレードは 100% 失敗しました。
中国語翻訳は後ほど掲載します