我們透過 nginx 代理程式來啟動我們的 Webogram 實例

嘿哈布爾!

最近,我發現自己處於一種情況,需要在無法完全訪問互聯網的公司網絡中工作,正如您從標題中可以猜到的那樣,Telegram 被阻止了。 相信這種情況很多人都熟悉。

我可以不用即時通訊工具,但工作時我需要的是 Telegram。 無法在工作電腦上安裝客戶端,也無法使用個人筆記型電腦。 另一個解決方案似乎是使用它 官方網頁版,但正如您可以猜到的那樣,它也是不可用的。 我立即劃掉了搜尋非官方鏡像的選項(我希望出於顯而易見的原因)。

幸運的是,Webogram 是一個開源項目,其原始碼可以在 GitHub上 它的作者(非常感謝他!)
安裝和啟動本身並不困難,但是,在存取 Telegram 伺服器被封鎖的網路中運作的情況下,您更有可能會失望而不是成功,因為網路版本會從使用者的電腦向 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 會在該連接埠上回應
  • 我們使用 basic-auth 關閉根位置。 這純粹是像徵性的一步,目的是讓我們的應用程式免受窺探和機器人的侵害。 (也是為了避免阻塞問題)
  • 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 實例

我希望本教程對我以外的其他人也有用。

非常感謝所有讀到最後的人。

如果有人有任何困難或我有任何不準確的地方,我很樂意在評論或私訊中回答並盡力幫助你。

來源: www.habr.com

添加評論