Olá, Habr!
Recentemente, encontrei-me em uma situação em que era necessário trabalhar dentro de uma rede corporativa com acesso limitado à internet e, como você pode adivinhar pelo título, o Telegram estava bloqueado. Tenho certeza de que essa situação é familiar para muitos.
Posso perfeitamente viver sem mensageiros, no entanto, o Telegram era necessário para o meu trabalho. Instalar o cliente na máquina de trabalho não era uma opção, e usar meu laptop pessoal também não. Outra solução que parece viável é usar sua , mas, como você pode imaginar, esta também estava indisponível. O caminho de procurar um espelho não oficial eu elimino imediatamente (esperando por razões bastante óbvias).
Felizmente, o Webogram é um projeto open source, cujo código-fonte está disponível em seu autor (muito obrigado a ele!)
A instalação e execução em si não são complicadas, porém, em um ambiente onde o acesso aos servidores do Telegram está bloqueado, você provavelmente enfrentará mais frustração do que sucesso, já que a versão web envia requisições para os servidores do Telegram a partir da máquina do usuário.
Felizmente, isso é bastante simples (mas não muito evidente) de corrigir. Quero avisar que não sou o autor desta solução. Consegui encontrá-la em , que discutia um problema semelhante ao meu. A solução proposta pelo usuário do github , me ajudou muito, no entanto, estou certo de que pode ajudar mais alguém, então decidi escrever este tutorial.
Logo abaixo, você encontrará um passo a passo para configurar seu próprio espelho do Webogram e configurar o proxy de suas requisições para os servidores do Telegram usando nginx.
Como exemplo, escolhi um Ubuntu Server 18.04.3 recém-instalado e atualizado.
Atenção: Neste tutorial, não haverá instruções sobre como configurar um domínio no nginx. Isso precisa ser feito de forma independente. Este tutorial pressupõe que você já tenha um domínio configurado com ssl, e que o servidor no qual a configuração será feita tenha acesso aos servidores do Telegram (da maneira que você preferir)
Suponha que o IP deste servidor seja 10.23.0.3 e o nome de domínio mywebogram.localhost
Com base nessas premissas, eu trarei exemplos de configurações. Não se esqueça de mudar os valores para os seus.
Então, vamos lá:
Para executar o Webogram, precisamos do nodejs. Por padrão, se instalarmos a partir dos repositórios do Ubuntu, receberemos a versão 8.x do nodejs. Precisamos da versão 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsEscolhemos o local onde o nosso Webogram será baseado.
Como exemplo, vamos colocá-lo na raiz do diretório pessoal. Para isso, clonamos o repositório oficial para o nosso servidor:
cd ~ && git clone https://github.com/zhukov/webogram.gitO próximo passo é instalar todas as dependências necessárias para executar o aplicativo:
cd webogram && npm installVamos tentar executar um teste. Execute o comando:
npm startDepois disso, tentamos abrir no navegador
http://10.23.0.3:8000/app/index.htmlSe até este momento você tiver feito tudo corretamente, a página de autenticação do Webogram será aberta.
Agora precisamos configurar a execução do aplicativo como um serviço. Para isso, vamos criar um arquivo
sudo touch /lib/systemd/system/webogram.serviceabrimos ele em qualquer editor e damos a seguinte aparência (preencha o 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
Depois disso, executamos os seguintes comandos:
Aplicamos as alterações
sudo systemctl daemon-reloadHabilitamos a inicialização automática:
sudo systemctl enable webogram.serviceIniciamos o serviço:
sudo systemctl start webogram.serviceApós as operações realizadas, o Webogram continuará disponível na porta 8000.
Como iremos configurar o acesso ao nosso Webogram através do nginx, vamos fechar a porta 8000 para solicitações externas.
Usamos a utilidade udf (ou qualquer maneira que você preferir):
sudo ufw deny 8000Caso você decida usar o udf, mas ele esteja desativado no servidor, vamos adicionar mais regras (para que tudo não desmorone) e ativar o udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableEm seguida, vamos alterar a configuração do nginx.
Como mencionei acima, presume-se que seu servidor já tenha um domínio configurado com ssl. Quero apenas chamar sua atenção para o fato de que você precisará adicionar ao arquivo de configuração do domínio para um funcionamento adequado:
servidor {
...
localização ^~ /pluto/apiw1/ {
proxy_pass https://pluto.web.telegram.org/apiw1/;
}
localização ^~ /venus/apiw1/ {
proxy_pass https://venus.web.telegram.org/apiw1/;
}
localização ^~ /aurora/apiw1/ {
proxy_pass https://aurora.web.telegram.org/apiw1/;
}
localização ^~ /vesta/apiw1/ {
proxy_pass https://vesta.web.telegram.org/apiw1/;
}
localização ^~ /flora/apiw1/ {
proxy_pass https://flora.web.telegram.org/apiw1/;
}
localização ^~ /pluto-1/apiw1/ {
proxy_pass https://pluto-1.web.telegram.org/apiw1/;
}
localização ^~ /venus-1/apiw1/ {
proxy_pass https://venus-1.web.telegram.org/apiw1/;
}
localização ^~ /aurora-1/apiw1/ {
proxy_pass https://aurora-1.web.telegram.org/apiw1/;
}
localização ^~ /vesta-1/apiw1/ {
proxy_pass https://vesta-1.web.telegram.org/apiw1/;
}
localização ^~ /flora-1/apiw1/ {
proxy_pass https://flora-1.web.telegram.org/apiw1/;
}
localização ^~ /DC1/ {
proxy_pass http://149.154.175.10:80/;
}
localização ^~ /DC2/ {
proxy_pass http://149.154.167.40:80/;
}
localização ^~ /DC3/ {
proxy_pass http://149.154.175.117:80/;
}
localização ^~ /DC4/ {
proxy_pass http://149.154.175.50:80/;
}
localização ^~ /DC5/ {
proxy_pass http://149.154.167.51:80/;
}
localização ^~ /DC6/ {
proxy_pass http://149.154.175.100:80/;
}
localização ^~ /DC7/ {
proxy_pass http://149.154.167.91:80/;
}
localização ^~ /DC8/ {
proxy_pass http://149.154.171.5:80/;
}
localização / {
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 estamos adicionando à configuração do nginx:
- Alteramos a localização raiz, que irá proxiar as solicitações para a porta 8000, na qual o Webogram responde.
- Fechamos a localização raiz com autenticação básica. Esta é uma simples medida simbólica para proteger nosso aplicativo de olhos curiosos e bots. (E também para evitar problemas de bloqueios)
- Um monte de localizações com proxy_path para os servidores do Telegram — esses são os nossos endereços finais, através dos quais iremos proxiar nossas solicitações.
Além disso, criaremos um arquivo /etc/nginx/passwd.htpasswd;, para que o nginx tenha algo com que comparar as senhas dos usuários.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Reiniciamos o nginx:
sudo systemctl restart nginxAgora o Webogram estará disponível apenas pelo endereço após a inserção do nome de usuário e senha que você definiu ao criar a equipe htpasswd.
Faltam apenas algumas alterações no próprio projeto.
Abra no editor o arquivo ~/webogram/app/js/lib/mtproto.js
E traga seu início para o seguinte formato:
/*!
* 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ê precisará atualizar a página com o aplicativo no navegador.
Abra o console do navegador e observe as solicitações de rede do aplicativo. Se tudo estiver funcionando e as solicitações XHR estão indo para o seu servidor — significa que tudo foi feito corretamente e o Webogram agora está sendo proxiado através do nginx.

Espero que este tutorial seja útil para mais alguém além de mim.
Muito obrigado a todos que chegaram até aqui.
Se alguém tiver dificuldades ou eu cometi alguma imprecisão — ficarei feliz em responder e tentar ajudar nos comentários ou por mensagem privada.
Fonte: habr.com
