通过Nginx代理提升Webogram实例

哈Ha!

最近,我陷入一种情况,那就是必须在公司网络内部工作,并且不能完全访问Internet,并且从标题可以看出,Telegram被阻止了。我相信许多人都熟悉这种情况。

我可以不使用Messenger,但是,工作所需的正是Telegram。无法将客户端安装在工作计算机上,也无法使用个人笔记本电脑。另一个解决方案似乎是使用其官方Web版本,但是您可以猜到它也不可用。我立即通过搜索非官方镜像删除了该选项(希望出于明显的原因)。

幸运的是,Webogram是一个开源项目,其源代码可在github上找到。它的作者(为此,他要非常感谢!)
安装和启动本身并不重要,但是,在网络内部运行情况下,无法访问Telegram服务器的情况下,您会很失望而不是成功,因为Web版本会发送请求。从用户计算机电报服务器。

幸运的是,这很容易解决(但不是很明显)。我想警告您,我不是此解决方案的作者。我设法在讨论类似于我的问题线程找到它。用户github tecknojock提出的解决方案对我有很大帮助,但是,我确定它可以帮助其他人,所以我决定编写本教程。

在该目录下,您将找到Webogram镜像的逐步配置以及使用nginx向Telegram服务器发送请求的代理设置。

例如,我选择了刚刚安装并更新的Ubuntu Server 18.04.3.。

注意:在本教程中,没有关于在nginx中设置域的说明。这必须独立完成。本教程假定您已经使用ssl配置了域,并且计划在其上配置的服务器可以访问Telegram服务器(以您喜欢的任何方式)

假定此服务器的ip为10.23.0.3,域名为mywebogram。本地主机

基于这些约定,我将提供配置示例。不要忘记将值更改为自己的值。

所以

我们开始要运行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

我们选择Webogram所基于的位置。

例如,我们将其放置在主目录的根目录中。为此,我们将官方存储库克隆到我们的服务器:

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:

sudo systemctl restart nginx

输入创建htpasswd命令时定义的登录名和密码后, 现在Webogram仅在mywebogram.localhost / app / index.html上可用

所剩无几:对项目本身进行小的更改。

在编辑器中打开文件,~/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 <igor.beatle@gmail.com>
 * 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代理了。



我希望本教程对除我以外的其他人有用。

非常感谢阅读到底的每个人。

如果有人遇到任何困难或我有一些不准确之处,我将很乐意回答并尝试在评论或项目经理中为您提供帮助。

Source: https://habr.com/ru/post/undefined/


All Articles