nginx 経由でプロキシを使用して Webogram インスタンスを生成します

おい、ハブル!

最近、インターネットへのアクセスが不完全な企業ネットワーク内で作業する必要がある状況に陥りました。タイトルから推測できるように、Telegram がネットワーク内でブロックされました。 この状況は多くの人によく知られていると思います。

インスタント メッセンジャーがなくても大丈夫ですが、仕事で必要だったのは Telegram でした。 クライアントを仕事用マシンにインストールしたり、個人のラップトップを使用したりすることはできませんでした。 別の解決策はそれを使用することのようです 公式ウェブ版, しかし、ご想像のとおり、これも利用できませんでした。 私は、非公式のミラーを探すというオプションをすぐに取り消します (明らかな理由があることを願っています)。

幸いなことに、Webogram はオープン ソース プロジェクトであり、そのソース コードは次の場所で入手できます。 githubの その作者(彼に多大な感謝を!)
インストールと起動自体は難しくありませんが、Telegram サーバーへのアクセスがブロックされたネットワーク内での操作状況では、Web バージョンはユーザーのマシンから Telegram サーバーにリクエストを送信するため、成功するよりも失望する可能性が高くなります。

幸いなことに、これは非常に簡単な (ただし、それほど明白ではない) 修正です。 私がこのソリューションの作成者ではないことを警告しておきます。 でなんとか見つけました 、私と同様の問題について説明しました。 github ユーザーが提案した解決策 テクノジョック、私にとってはとても役に立ちましたが、他の人にも役立つと確信しているので、このチュートリアルを書くことにしました。

このカットの下には、Webogram ミラーの段階的なセットアップと、nginx を使用してそのリクエストを Telegram サーバーにプロキシするセットアップが表示されます。

例として、新しくインストールされ更新された Ubuntu Server 18.04.3 を選択しました。

警告: このチュートリアルには、nginx でドメインを設定する手順は含まれません。 これは自分で行う必要があります。 このチュートリアルでは、SSL を使用してドメインがすでに構成されており、ドメインを構成する予定のサーバー自体が Telegram サーバーに (任意の方法で) アクセスできることを前提としています。

このサーバーの IP が 10.23.0.3、ドメイン名が mywebogram.localhost であると仮定します。

これらの規則に基づいて、構成の例を示します。 値を自分のものに変更することを忘れないでください。

それでは始めましょう。

Webogram を実行するには、nodejs が必要です。 デフォルトでは、Ubuntu リポジトリからインストールすると、nodejs バージョン 8.x が取得されます。 12.x が必要です。

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - 
sudo apt update && sudo apt -y install nodejs

ウェボグラムの拠点となる場所を選択します。

たとえば、ホームディレクトリのルートに配置してみましょう。 これを行うには、公式リポジトリのクローンをサーバーに作成します。

cd ~ && git clone https://github.com/zhukov/webogram.git

次のステップでは、アプリケーションの実行に必要なすべての依存関係をインストールします。

cd webogram && npm install

試運転してみましょう。 次のコマンドを実行します。

npm start

その後、ブラウザで開いてみます

 http://10.23.0.3:8000/app/index.html

ここまでの作業がすべて正しく完了していれば、Webogram の認証ページが開きます。

次に、アプリケーションをサービスとして実行するように構成する必要があります。 これを行うには、ファイルを作成しましょう

sudo touch /lib/systemd/system/webogram.service

任意のエディタで開き、次のような外観にします (WorkDirectory へのパスを入力します)。

[Unit]
Description=Webogram mirror
[Service]
WorkingDirectory=/home/tg/webogram
ExecStart=/usr/bin/npm start
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

次に、次のコマンドを実行します。

変更を適用する

sudo systemctl daemon-reload

自動実行を有効にする:

sudo systemctl enable webogram.service

サービスを開始しましょう:

sudo systemctl start webogram.service

手順を完了すると、Webogram はポート 8000 で引き続き使用できるようになります。

nginx 経由で Webogram へのアクセスを設定するため、外部からのリクエストに対してポート 8000 を閉じます。

これには udf ユーティリティを使用します (または便利な方法)。

sudo ufw deny 8000

それでも udf を使用することにしたものの、サーバーで無効になっている場合は、ルールを追加して (すべてがバラバラにならないように)、udf を有効にします。

sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

次に、nginx 構成の変更を開始しましょう。

上で警告したように、SSL を使用したドメインがサーバー上ですでに構成されていることを前提としています。 ここでは、ドメイン構成ファイルが正しく動作するために、ドメイン構成ファイルに何を追加する必要があるかについてのみ説明します。


server {
...
  location ^~ /pluto/apiw1/ {
    proxy_pass https://pluto.web.telegram.org/apiw1/;
  }
  location ^~ /venus/apiw1/ {
    proxy_pass https://venus.web.telegram.org/apiw1/;
  }
  location ^~ /aurora/apiw1/ {
    proxy_pass https://aurora.web.telegram.org/apiw1/;
  }
  location ^~ /vesta/apiw1/ {
    proxy_pass https://vesta.web.telegram.org/apiw1/;
  }
  location ^~ /flora/apiw1/ {
    proxy_pass https://flora.web.telegram.org/apiw1/;
  }
  location ^~ /pluto-1/apiw1/ {
    proxy_pass https://pluto-1.web.telegram.org/apiw1/;
  }
  location ^~ /venus-1/apiw1/ {
    proxy_pass https://venus-1.web.telegram.org/apiw1/;
  }
  location ^~ /aurora-1/apiw1/ {
    proxy_pass https://aurora-1.web.telegram.org/apiw1/;
  }
  location ^~ /vesta-1/apiw1/ {
    proxy_pass https://vesta-1.web.telegram.org/apiw1/;
  }
  location ^~ /flora-1/apiw1/ {
    proxy_pass https://flora-1.web.telegram.org/apiw1/;
  }
  location ^~ /DC1/ {
    proxy_pass http://149.154.175.10:80/;
  }
  location ^~ /DC2/ {
    proxy_pass http://149.154.167.40:80/;
  }
  location ^~ /DC3/ {
    proxy_pass http://149.154.175.117:80/;
  }
  location ^~ /DC4/ {
    proxy_pass http://149.154.175.50:80/;
  }
  location ^~ /DC5/ {
    proxy_pass http://149.154.167.51:80/;
  }
  location ^~ /DC6/ {
    proxy_pass http://149.154.175.100:80/;
  }
  location ^~ /DC7/ {
    proxy_pass http://149.154.167.91:80/;
  }
  location ^~ /DC8/ {
    proxy_pass http://149.154.171.5:80/;
  }
 location / {
    auth_basic "tg";
    auth_basic_user_file /etc/nginx/passwd.htpasswd;
    proxy_pass http://localhost:8000/;
    proxy_read_timeout 90s;
    proxy_connect_timeout 90s;
    proxy_send_timeout 90s;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

nginx 設定に追加するもの:

  • ルートの場所を変更し、リクエストをポート 8000 にプロキシし、Webogram が応答するようにします。
  • 基本認証を使用してルートの場所を閉じます。 これは、覗き見やボットからアプリケーションを閉じるための純粋に象徴的な手順です。 (ブロックの問題を避けるためでもあります)
  • Telegram サーバー上の proxy_path を持つ多数の場所は、まさにリクエストをプロキシするエンドポイントです。

また、ファイルを作成しましょう /etc/nginx/passwd.htpasswd;そのため、nginx にはユーザーのパスワードをチェックする手段が備わっています。

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg

nginx 経由でプロキシを使用して Webogram インスタンスを生成します

nginx を再起動します。

sudo systemctl restart nginx

現在、Webogram は次の場所でのみ利用可能です。 mywebogram.localhost/app/index.html htpasswd コマンドの作成時に定義したログイン名とパスワードを入力した後。

残りはほとんどありません。プロジェクト自体に小さな変更を加えます。

エディタでファイルを開きます ~/webogram/app/js/lib/mtproto.js

そして、その始まりを次の形式にします。

/*!
 * Webogram v0.7.0 - messaging web application for MTProto
 * https://github.com/zhukov/webogram
 * Copyright (C) 2014 Igor Zhukov <[email protected]>
 * https://github.com/zhukov/webogram/blob/master/LICENSE
 */

angular.module('izhukov.mtproto', ['izhukov.utils'])

  .factory('MtpDcConfigurator', function () {
    var sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora']

    var dcOptions = Config.Modes.test
      ? [
        {id: 1, host: 'mywebogram.localhost/DC1',  port: 80},
        {id: 2, host: 'mywebogram.localhost/DC2',  port: 80},
        {id: 3, host: 'mywebogram.localhost/DC3', port: 80}
      ]
      : [
        {id: 1, host: 'mywebogram.localhost/DC4',  port: 80},
        {id: 2, host: 'mywebogram.localhost/DC5',  port: 80},
        {id: 3, host: 'mywebogram.localhost/DC6', port: 80},
        {id: 4, host: 'mywebogram.localhost/DC7',  port: 80},
        {id: 5, host: 'mywebogram.localhost/DC8',   port: 80}
      ]

    var chosenServers = {}

    function chooseServer (dcID, upload) {
      if (chosenServers[dcID] === undefined) {
        var chosenServer = false,
          i, dcOption

        if (Config.Modes.ssl || !Config.Modes.http) {
          var subdomain = sslSubdomains[dcID - 1] + (upload ? '-1' : '')
          var path = Config.Modes.test ? 'apiw_test1' : '/apiw1/'
          chosenServer = 'https://mywebogram.localhost/' + subdomain + path
          return chosenServer
        }
       for (i = 0; i < dcOptions.length; i++) {
          dcOption = dcOptions[i]
          if (dcOption.id == dcID) {
            chosenServer = 'http://' + dcOption.host + '/apiw1'
            break
          }
        }
        chosenServers[dcID] = chosenServer
      }
...
 

この後、ブラウザでアプリケーション ページを更新する必要があります。

ブラウザ コンソールを開いて、アプリケーションのネットワーク リクエストを確認します。 すべてが機能し、XHR リクエストがサーバーに送信されれば、すべてが正しく行われ、Webogram は nginx 経由でプロキシされます。

nginx 経由でプロキシを使用して Webogram インスタンスを生成します

このチュートリアルが私以外の人にも役立つことを願っています。

最後まで読んでくださった皆様、本当にありがとうございました。

誰かが何か問題を抱えている場合、または私が不正確な点を犯した場合は、コメントまたは PM で喜んで回答し、お手伝いさせていただきます。

出所: habr.com

コメントを追加します