Zvyšujeme našu inštanciu Webogramu pomocou proxy cez nginx

Čau Habr!

Nedávno som sa ocitol v situácii, v ktorej bolo potrebné pracovať vo vnútri podnikovej siete s neúplným prístupom na internet a ako už z názvu tušíte, bol v nej zablokovaný telegram. Som si istý, že táto situácia je mnohým známa.

Môžem sa zaobísť bez okamžitých správ, ale bol to Telegram, ktorý som potreboval na prácu. Klienta nebolo možné nainštalovať na pracovný stroj a nebolo možné použiť ani osobný notebook. Ďalším riešením sa zdá byť použitie oficiálna webová verzia, no ako tušíte, aj tá bola nedostupná. Okamžite škrtnem možnosť hľadania neoficiálneho zrkadla (dúfam, že z pochopiteľných dôvodov).

Našťastie je Webogram open source projekt, ktorého zdrojový kód je dostupný v GitHub jeho autor (za čo mu patrí veľká vďaka!)
Samotná inštalácia a spustenie nie je ťažké, avšak v podmienkach prevádzky v rámci siete s zablokovaným prístupom k serverom telegramu budete skôr sklamaní ako úspešní, pretože webová verzia odosiela požiadavky na servery telegramu zo stroja používateľa.

Našťastie je to pomerne jednoduchá (ale nie príliš zrejmá) oprava. Upozorňujem, že nie som autorom tohto riešenia. Podarilo sa mi to nájsť v pobočka, ktorá diskutovala o podobnom probléme ako ja. Riešenie navrhnuté používateľom github tecknojock, veľmi mi to pomohlo, ale som si istý, že to môže pomôcť aj niekomu inému, a tak som sa rozhodol napísať tento návod.

Pod strihom nájdete krok za krokom nastavenie vášho zrkadla Webogramu a nastavenie proxy jeho požiadaviek na telegramové servery pomocou nginx.

Ako príklad som vybral čerstvo nainštalovaný a aktualizovaný server Ubuntu 18.04.3.

varovanie: Tento tutoriál nebude obsahovať pokyny na nastavenie domény v nginx. Musíte to urobiť sami. Výukový program predpokladá, že ste už nakonfigurovali doménu s ssl a že samotný server, na ktorom ju plánujete nakonfigurovať, má prístup k serverom telegramu (akýmkoľvek spôsobom chcete)

Predpokladajme, že ip tohto servera je 10.23.0.3 a názov domény je mywebogram.localhost

Na základe týchto konvencií uvediem príklady konfigurácií. Nezabudnite zmeniť hodnoty na svoje vlastné.

Začnime teda:

Na spustenie Webogramu potrebujeme nodejs. V predvolenom nastavení, ak ho nainštalujeme z repozitárov Ubuntu, dostaneme nodejs verziu 8.x. Potrebujeme 12.x:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - 
sudo apt update && sudo apt -y install nodejs

Vyberáme miesto, kde bude náš Webogram založený.

Umiestnime ho napríklad do koreňového adresára domovského adresára. Ak to chcete urobiť, naklonujte oficiálne úložisko na náš server:

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

Ďalším krokom je inštalácia všetkých závislostí potrebných na spustenie aplikácie:

cd webogram && npm install

Skúsme skúšobnú prevádzku. Spustite príkaz:

npm start

Potom sa ho pokúsime otvoriť v prehliadači

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

Ak ste až do tohto bodu urobili všetko správne, otvorí sa stránka autorizácie Webogramu.

Teraz musíme nakonfigurovať aplikáciu, aby bežala ako služba. Ak to chcete urobiť, vytvorte súbor

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

otvorte ho v ľubovoľnom editore a dajte mu nasledujúci vzhľad (zadajte svoju 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

Potom spustíme nasledujúce príkazy:

Aplikovanie zmien

sudo systemctl daemon-reload

Povoliť automatické spustenie:

sudo systemctl enable webogram.service

Začnime službu:

sudo systemctl start webogram.service

Po dokončení krokov bude Webogram naďalej dostupný na porte 8000.

Keďže budeme nastavovať prístup k nášmu Webogramu cez nginx, zatvoríme port 8000 pre požiadavky zvonku.

Na tento účel používame nástroj udf (alebo akúkoľvek vhodnú metódu):

sudo ufw deny 8000

V prípade, že sa stále rozhodnete používať udf, ale je na serveri zakázané, pridajte ďalšie pravidlá (aby sa všetko nerozpadlo) a povoľte udf:

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

Ďalej začnime meniť konfiguráciu nginx.

Ako som varoval vyššie, predpokladá sa, že doména s ssl je už na vašom serveri nakonfigurovaná. Len upriamim vašu pozornosť na to, čo bude potrebné pridať do konfiguračného súboru domény, aby správne 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;
  }
}

Čo pridáme do konfigurácie nginx:

  • Zmeníme koreňové umiestnenie, ktoré bude proxy požadovať port 8000, na ktorý Webogram odpovedá
  • Zatvoríme koreňové umiestnenie pomocou základného overenia. Toto je čisto symbolický krok na zatvorenie našej aplikácie pred zvedavými očami a robotmi. (A tiež aby ste sa vyhli problémom s blokovaním)
  • Množstvo miest s proxy_path na telegramovom serveri sú presne naše koncové body, cez ktoré budeme zastupovať naše požiadavky

Tiež si vytvoríme súbor /etc/nginx/passwd.htpasswd;aby mal nginx niečo na kontrolu používateľských hesiel.

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

Zvyšujeme našu inštanciu Webogramu pomocou proxy cez nginx

Reštartujte nginx:

sudo systemctl restart nginx

Teraz bude Webogram dostupný iba na mywebogram.localhost/app/index.html po zadaní prihlasovacieho mena a hesla, ktoré ste zadali pri vytváraní príkazu htpasswd.

Zostáva málo: urobíme malé zmeny v samotnom projekte.

Otvorte súbor v editore ~/webogram/app/js/lib/mtproto.js

A priveďte jeho začiatok do nasledujúcej 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
      }
...
 

Potom musíte obnoviť stránku aplikácie v prehliadači.

Otvorte konzolu prehliadača a pozrite sa na sieťové požiadavky aplikácie. Ak všetko funguje a požiadavky XHR idú na váš server, potom je všetko vykonané správne a Webogram je teraz proxy cez nginx.

Zvyšujeme našu inštanciu Webogramu pomocou proxy cez nginx

Dúfam, že tento tutoriál bude užitočný aj pre niekoho iného okrem mňa.

Veľká vďaka všetkým, ktorí dočítali až do konca.

Ak by mal niekto nejaké ťažkosti alebo som urobil nejaké nepresnosti, rád odpoviem a pokúsim sa pomôcť v komentároch alebo v PM.

Zdroj: hab.com

Pridať komentár