Ahoj, Habr!
Nedávno jsem se dostal do situace, kdy bylo nutné pracovat ve firemní síti s omezeným přístupem k internetu a, jak asi tušíte z nadpisu, Telegram byl v ní blokován. Jsem si jist, že tato situace je mnohým známá.
Docela dobře se bez messengerů obejdu, ale právě Telegram jsem potřeboval k práci. Nainstalovat klienta na pracovní počítač nebylo možné, osobní notebook použit také nešel. Dalším řešením by bylo použít jeho , ale jak už asi tušíte — ta také nebyla dostupná. Možnost hledat neoficiální zrcadlo ihned vylučuji (doufám, že z pochopitelných důvodů).
Naštěstí Webogram je open source projekt, jehož zdrojový kód je dostupný v jeho autorství (za což mu patří obrovské díky!)
Samotná instalace a spuštění není nijak složité, avšak v podmínkách provozu uvnitř sítě s blokovaným přístupem k serverům Telegram vás spíše čeká zklamání než úspěch, protože webová verze odesílá požadavky na servery Telegram z počítače uživatele.
Naštěstí to lze poměrně jednoduše (ale ne příliš zřejmým způsobem) opravit. Chci varovat, že nejsem autorem tohoto řešení. Podařilo se mi ho najít v , ve které se probírala podobná problém. Řešení, které navrhl uživatel github , mi velmi pomohlo, ale jsem si jistý, že by mohlo pomoci i někomu jinému, proto jsem se rozhodl napsat tento tutoriál.
Pod katem čeká na vás podrobná příručka pro nastavení vlastního zrcadla Webogram a nastavení proxy pro jeho požadavky na servery Telegram s použitím nginx.
Jako příklad jsem zvolil právě nainstalovaný a aktualizovaný Ubuntu Server 18.04.3.
Pozor: V rámci tohoto tutoriálu nebudou zahrnuty pokyny pro nastavení domény v nginx. To si musíte udělat sami. Tutoriál předpokládá, že máte již nastavenou doménu se SSL, a také samotný server, na kterém plánujete nastavení, má přístup k serverům Telegram (jakýmikoli způsoby dle vlastního výběru).
Předpokládejme, že IP tohoto serveru je 10.23.0.3 a doménové jméno je mywebogram.localhost.
Na základě těchto podmínek budu uvádět příklady konfigurací. Nezapomeňte nahradit hodnoty svými.
Tak jdeme na to:
Pro spuštění Webogramu potřebujeme nodejs. Ve výchozím nastavení, pokud jej nainstalujeme z repozitářů Ubuntu, dostaneme nodejs verze 8.x. Potřebujeme 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsVybereme místo, kde bude náš Webogram sídlit.
Jako příklad ho umístíme do kořenového adresáře domácího uživatele. K tomu si klonujeme oficiální repozitář na server:
cd ~ && git clone https://github.com/zhukov/webogram.gitDalším krokem je nainstalovat všechny závislosti potřebné k provozu aplikace:
cd webogram && npm installZkusíme provést testovací spuštění. Zadejte příkaz:
npm startPoté se pokusíme otevřít v prohlížeči
http://10.23.0.3:8000/app/index.htmlPokud jste do této chvíle dělali vše správně, otevře se vám přihlašovací stránka Webogramu.
Nyní je potřeba nastavit spuštění aplikace jako služby. K tomu vytvoříme soubor
sudo touch /lib/systemd/system/webogram.serviceotevřeme jej v libovolném editoru a upravíme následujícím způsobem (nahradíme svůj cestou k 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
Poté provedeme následující příkazy:
Aplikujeme změny
sudo systemctl daemon-reloadPovolíme automatické spuštění:
sudo systemctl enable webogram.serviceSpouštíme službu:
sudo systemctl start webogram.servicePo vykonaných akcích bude Webogram dostupný na portu 8000.
Jelikož budeme nastavovat přístup k našemu Webogramu přes nginx, zakážeme port 8000 pro externí požadavky.
Použijeme k tomu utilitu ufw (nebo jakýkoliv jiný vhodný způsob):
sudo ufw deny 8000Pro případ, že byste se přece jen rozhodli použít ufw, ale je na serveru vypnutý — přidáme ještě pravidla (aby se nic nezhroutilo) a povolíme ufw:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableNyní přistoupíme ke změně konfigurace nginx.
Jak jsem již varoval výše — předpokládá se, že na vašem serveru je již nastavená doména se ssl. Rád bych však vyzdvihl, že bude potřeba přidat do konfiguračního souboru domény pro správnou funkci:
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;
}
}
Co přidáváme do konfigurace nginx:
- Měníme kořenovou lokaci, která bude proxyovat požadavky na port 8000, na kterém odpovídá Webogram.
- Kořenovou lokaci uzavíráme pomocí basic-auth. To je čistě symbolický krok pro ochranu naší aplikace před zvědavými očima a boty. (A také aby nedocházelo k problémům s blokacemi.)
- Spousta lokaci s proxy_path na servery Telegram – to jsou naše koncové body, přes které budeme proxyovat naše požadavky.
Také vytvoříme soubor /etc/nginx/passwd.htpasswd;, aby měl nginx s čím porovnávat uživatelské hesla.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Restartujeme nginx:
sudo systemctl restart nginxNyní bude Webogram dostupný pouze na adrese po zadání uživatelského jména a hesla, které jste určili při vytváření příkazu htpasswd.
Zbývá ještě pár drobných změn v samotném projektu.
Otevřete v editoru soubor ~/webogram/app/js/lib/mtproto.js
A upravte jeho začátek na následující podobu:
/*!
* 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
}
...
Poté je nutné obnovit stránku s aplikací v prohlížeči.
Otevřete konzoli prohlížeče a podívejte se na síťové požadavky aplikace. Pokud vše funguje a XHR požadavky směřují na váš server – znamená to, že vše bylo správně provedeno a Webogram je nyní proxyován přes nginx.

Doufám, že tento tutoriál bude užitečný i někomu jinému kromě mě.
Velké díky všem, kdo dočetli až do konce.
Pokud má někdo potíže nebo jsem udělal nějaké nepřesnosti – rád odpovím a pokusím se vám pomoci v komentářích nebo soukromě.
Zdroj: habr.com
