Aumentamos nossa instância do Webogram com proxy via nginx

Oi, Habr!

Recentemente me encontrei em uma situação em que era necessário trabalhar dentro de uma rede corporativa com acesso incompleto à Internet e, como você pode imaginar pelo título, o Telegram estava bloqueado nela. Tenho certeza de que esta situação é familiar para muitos.

Posso passar sem mensageiros instantâneos, mas era o Telegram que eu precisava para trabalhar. Não foi possível instalar o cliente em uma máquina de trabalho, nem utilizar um laptop pessoal. Outra solução parece ser usá-lo versão web oficial, mas como você pode imaginar, também não estava disponível. Risco imediatamente a opção de procurar um espelho não oficial (espero que por razões óbvias).

Felizmente, o Webogram é um projeto de código aberto cujo código-fonte está disponível em github seu autor (pelo qual muito obrigado!)
A instalação e lançamento em si não são difíceis, porém, em condições de operação dentro de uma rede com acesso bloqueado aos servidores do Telegram, você terá mais chances de se decepcionar do que de ter sucesso, já que a versão web envia solicitações aos servidores do Telegram a partir da máquina do usuário.

Felizmente, esta é uma solução bastante simples (mas não muito óbvia). Gostaria de avisar que não sou o autor desta solução. consegui encontrar em ramo, que discutiu um problema semelhante ao meu. Solução sugerida pelo usuário do github tecknojock, me ajudou muito, porém, tenho certeza que pode ajudar outra pessoa, então resolvi escrever este tutorial.

Abaixo do corte você encontrará a configuração passo a passo do seu espelho do Webogram e a configuração do proxy de suas solicitações para servidores do Telegram usando nginx.

Como exemplo, escolhi um Ubuntu Server 18.04.3 recém-instalado e atualizado.

Nota: Este tutorial não incluirá instruções sobre como configurar um domínio no nginx. Você precisa fazer isso sozinho. O tutorial pressupõe que você já configurou um domínio com SSL, e que o próprio servidor no qual você planeja configurá-lo tenha acesso aos servidores do Telegram (da maneira que você quiser)

Vamos supor que o ip deste servidor seja 10.23.0.3 e o nome do domínio seja mywebogram.localhost

Com base nessas convenções, darei exemplos de configurações. Não se esqueça de alterar os valores para os seus.

Então vamos começar:

Para executar o Webogram, precisamos de nodejs. Por padrão, se instalarmos a partir dos repositórios do Ubuntu, obteremos o nodejs versão 8.x. Precisamos de 12.x:

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

Escolhemos o local onde ficará nosso Webograma.

Por exemplo, vamos colocá-lo na raiz do diretório inicial. Para fazer isso, clone o repositório oficial em nosso servidor:

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

A próxima etapa é instalar todas as dependências necessárias para executar o aplicativo:

cd webogram && npm install

Vamos tentar um teste. Execute o comando:

npm start

Depois disso, tentamos abri-lo no navegador

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

Se até este ponto você fez tudo corretamente, a página de autorização do Webogram será aberta.

Agora precisamos configurar o aplicativo para rodar como um serviço. Para fazer isso, vamos criar um arquivo

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

abra-o em qualquer editor e dê a seguinte aparência (insira seu caminho para 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

Em seguida, executamos os seguintes comandos:

Aplicando as alterações

sudo systemctl daemon-reload

Habilite a execução automática:

sudo systemctl enable webogram.service

Iniciamos o serviço:

sudo systemctl start webogram.service

Após concluir as etapas, o Webogram continuará disponível na porta 8000.

Como configuraremos o acesso ao nosso Webograma via nginx, fecharemos a porta 8000 para solicitações externas.

Usamos o utilitário udf para isso (ou qualquer método conveniente para você):

sudo ufw deny 8000

Caso você ainda decida usar o udf, mas ele está desabilitado no servidor, adicione mais regras (para que tudo não desmorone) e habilite o udf:

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

A seguir, vamos começar a alterar a configuração do nginx.

Como avisei acima, presume-se que já esteja configurado um domínio com SSL no seu servidor. Chamarei apenas sua atenção para o que precisará ser adicionado ao arquivo de configuração do domínio para que ele funcione corretamente:


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;
  }
}

O que adicionamos à configuração do nginx:

  • Alteramos o local raiz, que fará proxy das solicitações para a porta 8000, na qual o Webogram responde
  • Fechamos o local raiz usando autenticação básica. Este é um passo puramente simbólico para proteger nosso aplicativo de olhares indiscretos e bots. (E também para evitar problemas de bloqueio)
  • Vários locais com proxy_path no servidor Telegram são exatamente nossos endpoints através dos quais faremos proxy de nossas solicitações

Além disso, vamos criar um arquivo /etc/nginx/passwd.htpasswd;para que o nginx tenha algo para verificar as senhas dos usuários.

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

Aumentamos nossa instância do Webogram com proxy via nginx

Reinicie o nginx:

sudo systemctl restart nginx

Agora o Webogram estará disponível apenas em mywebogram.localhost/app/index.html após o login e a senha que você definiu ao criar o comando htpasswd serem inseridos.

Resta pouco: faremos pequenas alterações no próprio projeto.

Abra o arquivo em um editor ~/webogram/app/js/lib/mtproto.js

E traga seu início para a seguinte forma:

/*!
 * 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
      }
...
 

Depois disso, você precisa atualizar a página do aplicativo no navegador.

Abra o console do seu navegador e observe as solicitações de rede do aplicativo. Se tudo funcionar e as solicitações XHR forem para o seu servidor, então tudo foi feito corretamente e o Webogram agora é proxy via nginx.

Aumentamos nossa instância do Webogram com proxy via nginx

Espero que este tutorial seja útil para outra pessoa além de mim.

Muito obrigado a todos que leram até o fim.

Se alguém tiver alguma dificuldade ou eu cometi alguma imprecisão, terei prazer em responder e tentar ajudar nos comentários ou no PM.

Fonte: habr.com

Adicionar um comentário