Zvedáme svůj Webogram instance s proxy přes nginx

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 oficiální webovou verzi, 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 github 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 diskuzi, ve které se probírala podobná problém. Řešení, které navrhl uživatel github tecknojock, 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 nodejs

Vybereme 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.git

Dalším krokem je nainstalovat všechny závislosti potřebné k provozu aplikace:

cd webogram && npm install

Zkusíme provést testovací spuštění. Zadejte příkaz:

npm start

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

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

Pokud 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.service

otevř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-reload

Povolíme automatické spuštění:

sudo systemctl enable webogram.service

Spouštíme službu:

sudo systemctl start webogram.service

Po 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 8000

Pro 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 enable

Nyní 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

Zvedáme svůj Webogram instance s proxy přes nginx

Restartujeme nginx:

sudo systemctl restart nginx

Nyní bude Webogram dostupný pouze na adrese mywebogram.localhost/app/index.html 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.

Zvedáme svůj Webogram instance s proxy 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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster