Eleve sua instância do Webogram com proxy via nginx

Olá Habr!

Recentemente, entrei em uma situação em que era necessário trabalhar em uma rede corporativa com acesso incompleto à Internet e, como você pode imaginar na manchete, o Telegram estava bloqueado nela. Estou certo de que essa situação é familiar para muitos.

Eu posso ficar sem mensageiros, no entanto, era o Telegram que eu precisava para trabalhar. Não foi possível instalar o cliente em uma máquina que funcionava nem usar um laptop pessoal. Outra solução parece ser usar sua versão web oficial , mas como você pode imaginar, ela também não estava disponível. Eu apago imediatamente a opção com a busca de um espelho não oficial (espero por razões óbvias).

Felizmente, o Webogram é um projeto de código aberto, cujo código fonte está disponível no githubseu autor (pelo qual
muitos agradecimentos a ele!) A instalação e o lançamento em si não são um grande problema, no entanto, no caso de operação dentro da rede com acesso bloqueado aos servidores Telegram, você provavelmente ficará desapontado e bem-sucedido, pois a versão web envia solicitações para Servidores de telegrama da máquina do usuário.

Felizmente, isso é bastante simples (mas não muito óbvio) de corrigir. Quero avisar que não sou o autor desta solução. Consegui encontrá-lo em um tópico que discutia um problema semelhante ao meu. A solução sugerida pelo usuário github tecknojock me ajudou muito, no entanto, tenho certeza de que ela pode ajudar alguém, então decidi escrever este tutorial.

Sob o gato, você encontrará uma configuração passo a passo do seu espelho Webogram e configurações de proxy de suas solicitações aos servidores Telegram usando o nginx.

Como exemplo, selecionei o Ubuntu Server 18.04.3 recém-instalado e atualizado.

Nota: Neste tutorial, não haverá instruções para configurar um domínio no nginx. Isso deve ser feito de forma independente. O tutorial pressupõe que você já configurou um domínio com ssl, bem como o servidor no qual planeja configurar, tem acesso aos servidores Telegram (da maneira que desejar)

Suponha 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 por conta própria.

Então,

aqui vamos nós : Para executar o Webogram, precisamos do nodejs. Por padrão, se você instalá-lo a partir dos repositórios do Ubuntu, obtemos o nodejs versão 8.x. Precisamos do 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 o nosso Webograma será baseado.

Por exemplo - vamos colocá-lo na raiz de um diretório inicial. Para fazer isso, clonamos o repositório oficial no 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 executar um teste. Execute o comando:

npm start

Depois disso, tentamos abrir no navegador

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

Se, até esse ponto, você fez tudo corretamente, sua página de autorização do Webograma será aberta.

Agora, precisamos configurar o lançamento do aplicativo como um serviço. Para fazer isso, crie um arquivo

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

abra-o em qualquer editor e dê a seguinte aparência (digite 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:

Aplique as alterações

sudo systemctl daemon-reload

Ative a inicialização automática:

sudo systemctl enable webogram.service

Iniciamos o serviço:

sudo systemctl start webogram.service

Após a conclusão das etapas, o Webograma continuará disponível na porta 8000.

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

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

sudo ufw deny 8000

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

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

Em seguida, vamos alterar a configuração do nginx.

Como avisei acima - presume-se que um domínio com ssl já esteja configurado no seu servidor. Vou chamar sua atenção apenas para o fato de que será necessário adicionar ao arquivo de configuração do domínio para a operação correta:


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á o proxy das solicitações para a porta 8000, à qual o Webogram responde.
  • Feche o local raiz com autenticação básica. Este é um passo puramente simbólico para fechar nosso aplicativo de olhares indiscretos e bots. (E também que não houve problemas com bloqueios)
  • A pilha de local com proxy_path no servidor Telegram é apenas nossos pontos de extremidade através dos quais proxy nossas solicitações

Além disso, crie um arquivo /etc/nginx/passwd.htpasswd;para que o nginx tenha algo com o qual comparar senhas de usuário.

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

imagem

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.

Ainda resta pouco: faça pequenas alterações no próprio projeto.

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

e traga seu início para o seguinte formulário:

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

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

Abra o console do navegador e veja as solicitações de rede do aplicativo. Se tudo funcionar, e as solicitações XHR forem para o servidor, tudo será feito corretamente, e o Webogram agora será submetido a proxy através do 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 tiver imprecisões - terei o maior prazer em responder e tentar ajudá-lo nos comentários ou no PM.

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


All Articles