Zvyšujeme naši instanci Webogramu pomocí proxy přes nginx

Čau Habr!

Nedávno jsem se dostal do situace, kdy bylo nutné pracovat uvnitř podnikové sítě s neúplným přístupem k internetu a jak už z názvu tušíte, byl v ní zablokován Telegram. Jsem si jist, že tato situace je mnohým známá.

Bez instant messengerů se obejdu, ale byl to Telegram, který jsem potřeboval k práci. Klienta nebylo možné nainstalovat na pracovní stroj a nebylo možné použít ani osobní notebook. Dalším řešením se zdá být použití oficiální webová verze, ale jak správně tušíte, byl také nedostupný. Okamžitě odškrtávám možnost hledání neoficiálního zrcadla (doufám ze zřejmých důvodů).

Naštěstí je Webogram open source projekt, jehož zdrojový kód je dostupný v GitHub jeho autor (za což mu patří velký dík!)
Samotná instalace a spuštění není obtížné, nicméně v podmínkách provozu v síti s blokovaným přístupem k serverům telegramu budete spíše zklamáni než úspěšní, protože webová verze odesílá požadavky na servery telegramu ze stroje uživatele.

Naštěstí se jedná o poměrně jednoduchou (ale ne příliš zřejmou) opravu. Upozorňuji, že nejsem autorem tohoto řešení. Podařilo se mi to najít v větev, která probírala problém podobný mému. Řešení navržené uživatelem github tecknojock, hodně mi to pomohlo, ale jsem si jistý, že to může pomoci i někomu dalšímu, a tak jsem se rozhodl napsat tento návod.

Pod řezem najdete krok za krokem nastavení vašeho zrcadla Webogramu a nastavení proxy jeho požadavků na telegramové servery pomocí nginx.

Jako příklad jsem zvolil čerstvě nainstalovaný a aktualizovaný Ubuntu Server 18.04.3.

Poznámka: Tento tutoriál nebude obsahovat pokyny pro nastavení domény v nginx. Musíte to udělat sami. Výukový program předpokládá, že jste již nakonfigurovali doménu s ssl a že samotný server, na kterém ji plánujete nakonfigurovat, má přístup k serverům telegramu (jakýmkoli způsobem).

Předpokládejme, že ip tohoto serveru je 10.23.0.3 a název domény je mywebogram.localhost

Na základě těchto konvencí uvedu příklady konfigurací. Nezapomeňte změnit hodnoty na své vlastní.

Začněme tedy:

Ke spuštění Webogramu potřebujeme nodejs. Ve výchozím nastavení, pokud jej nainstalujeme z repozitářů Ubuntu, získáme 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 nodejs

Vybíráme místo, kde bude náš Webogram založen.

Umístíme jej například do kořenového adresáře domovského adresáře. Chcete-li to provést, naklonujte oficiální úložiště na náš server:

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

Dalším krokem je instalace všech závislostí potřebných ke spuštění aplikace:

cd webogram && npm install

Zkusíme zkušební provoz. Spusťte příkaz:

npm start

Poté se jej pokusíme otevřít v prohlížeči

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

Pokud jste do této chvíle udělali vše správně, otevře se stránka autorizace Webogramu.

Nyní musíme nakonfigurovat aplikaci, aby běžela jako služba. Chcete-li to provést, vytvořte soubor

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

otevřete jej v libovolném editoru a dejte mu následující vzhled (zadejte svou cestu 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é spustíme následující příkazy:

Uplatnění změn

sudo systemctl daemon-reload

Povolit automatické spouštění:

sudo systemctl enable webogram.service

Začněme službu:

sudo systemctl start webogram.service

Po dokončení kroků bude Webogram nadále dostupný na portu 8000.

Vzhledem k tomu, že budeme nastavovat přístup k našemu Webogramu přes nginx, uzavřeme port 8000 pro požadavky zvenčí.

K tomu používáme nástroj udf (nebo jakoukoli vhodnou metodu):

sudo ufw deny 8000

V případě, že se přesto rozhodnete používat udf, ale na serveru je zakázáno, přidejte další pravidla (aby se vše nerozpadlo) a povolte udf:

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

Dále začněme měnit konfiguraci nginx.

Jak jsem varoval výše, předpokládá se, že doména s ssl je již na vašem serveru nakonfigurována. Upozorňuji pouze na to, co bude potřeba přidat do konfiguračního souboru domény, aby správně fungoval:


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áme do konfigurace nginx:

  • Změníme kořenové umístění, které bude proxy požadavky na port 8000, na který Webogram odpovídá
  • Uzavřeme kořenové umístění pomocí základního ověření. Toto je čistě symbolický krok k uzavření naší aplikace před zvědavýma očima a roboty. (A také abyste se vyhnuli problémům s blokováním)
  • Spousta míst s proxy_path na serveru Telegram jsou přesně naše koncové body, přes které budeme zastupovat naše požadavky

Pojďme také vytvořit soubor /etc/nginx/passwd.htpasswd;aby měl nginx čím kontrolovat uživatelská hesla.

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

Zvyšujeme naši instanci Webogramu pomocí proxy přes nginx

Restartujte nginx:

sudo systemctl restart nginx

Nyní bude Webogram dostupný pouze na mywebogram.localhost/app/index.html po zadání přihlašovacího jména a hesla, které jste definovali při vytváření příkazu htpasswd.

Zbývá málo: provedeme malé změny v samotném projektu.

Otevřete soubor v editoru ~/webogram/app/js/lib/mtproto.js

A převeďte jeho začátek do následující podoby:

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

Poté musíte obnovit stránku aplikace v prohlížeči.

Otevřete konzolu prohlížeče a podívejte se na síťové požadavky aplikace. Pokud vše funguje a požadavky XHR jdou na váš server, pak je vše provedeno správně a Webogram je nyní proxy přes nginx.

Zvyšujeme naši instanci Webogramu pomocí proxy přes nginx

Doufám, že tento tutoriál bude užitečný i pro někoho dalšího kromě mě.

Moc děkuji všem, kteří dočetli až do konce.

Pokud by měl někdo nějaké potíže nebo jsem udělal nějaké nepřesnosti, rád odpovím a pokusím se pomoci v komentářích nebo v PM.

Zdroj: www.habr.com

Přidat komentář