Zvyšujeme svoj inštanciu Webogram s proxy cez nginx

Ahoj, Habr!

Nedávno som sa ocitol v situácii, kde bolo potrebné pracovať v korporátnej sieti s obmedzeným prístupom na internet a ako si môžete domyslieť z nadpisu — Telegram bol tam blokovaný. Som si istý, že táto situácia je mnohým známa.

Celkom sa bez messengerov zaobídem, avšak práve Telegram som potreboval pre pracovné účely. Nainštalovať klienta na pracovný počítač nebolo možné, používať osobný laptop — tiež nie. Ďalšou možnosťou sa javí použiť jeho oficiálnu webovú verziu, ale ako si môžete domyslieť — tá bola tiež nedostupná. Možnosť hľadania neoficiálnych zrkadiel okamžite vyraďujem (snáď z dôvodov, ktoré sú viac než jasné).

Našťastie, Webogram je opensource projekt, jehož zdrojový kód je dostupný na github jeho autora (za čo mu nesmierne ďakujem!)
Inštalácia a spustenie samotné nie sú nijako zložité, avšak za podmienok prevádzky v sieti s blokovaným prístupom na servery Telegram vás skôr čaká sklamanie ako úspech, pretože webová verzia posiela požiadavky na servery Telegram z používateľovho počítača.

Našťastie, je to dosť jednoduché (ale nie veľmi zrejmé) opraviť. Chcem upozorniť, že nie som autorom tohto riešenia. Podarilo sa mi ho nájsť v vlákne, v ktorom bola diskutovaná problematika podobná tej mojej. Riešenie, ktoré navrhol používateľ github tecknojock, mi veľmi pomohlo, avšak som si istý, že môže pomôcť aj niekomu inému, preto som sa rozhodol napísať tento tutoriál.

Pod katom vás čaká podrobná inštalácia vášho zrkadla Webogram a nastavenie proxy pre jeho požiadavky na servery Telegram s využitím nginx.

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

Pozor: V rámci tohto tutoriálu nebudú pokyny na nastavenie domény v nginx. To je potrebné urobiť samostatne. Tutoriál predpokladá, že už máte nastavenú doménu so ssl, a taktiež server, na ktorom sa plánuje nastavenie, má prístup na servery Telegram (akýmkoľvek spôsobom, ktorý uznáte za vhodný)

Predpokladajme, že ip tohto servera je 10.23.0.3 a doménové meno mywebogram.localhost

Na základe týchto predpokladov budem uvádzať príklady konfigurácií. Nezabudnite si upraviť hodnoty na vlastné.

A teraz sa pustime do práce:

Na spustenie Webogramu potrebujeme nodejs. Ako predvolené, 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 sídliť náš Webogram.

Ako príklad – umiestnime ho do koreňa domácej adresáre. Na to naklonujeme oficiálny repozitár na náš server:

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

Ďalší krok – nainštalovať všetky závislosti potrebné na spustenie aplikácie:

cd webogram && npm install

Skúsime vykonať testovací štart. Vykonajte príkaz:

npm start

Potom sa pokúsime otvoriť vo webovom prehliadači

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

Ak ste do tohto momentu robili všetko správne – otvorí sa vám prihlasovacia stránka Webogramu.

Teraz je potrebné nastaviť spustenie aplikácie ako službu. Na to vytvoríme súbor

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

otvoríme ho v akomkoľvek editore a dodáme nasledujúci obsah (zaznačíme 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 vykonáme nasledujúce príkazy:

Uplatníme zmeny

sudo systemctl daemon-reload

Povoľujeme automatické spúšťanie:

sudo systemctl enable webogram.service

Spustíme službu:

sudo systemctl start webogram.service

Po vykonaných akciách bude Webogram naďalej dostupný na porte 8000.

Keďže budeme nastavovať prístup k nášmu Webogramu prostredníctvom nginx – uzavrieme port 8000 pre vonkajšie požiadavky.

Na to použijeme nástroj udf (alebo akýkoľvek iný spôsob, ktorý vám vyhovuje):

sudo ufw deny 8000

V prípade, že ste však zvolili používať udf, ale je vypnutý na serveri – pridáme ďalšie pravidlá (aby sa všetko nerozpadlo) a zapneme udf:

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

Ďalej prejdeme k zmene konfigurácie nginx.

Ako som varoval vyššie – predpokladá sa, že na vašom serveri je už nastavená doména so ssl. Pozor, že do konfiguračného súboru domény bude potrebné pridať pre správnu funkciu:


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ávame do nginx konfigurácie:

  • Meníme koreňovú lokalitu, ktorá bude proxy-preposielať požiadavky na port 8000, na ktorom odpovedá Webogram.
  • Koreňovú lokalitu zabezpečujeme pomocou basic-auth. To je čisto symbolický krok, aby sme ochránili našu aplikáciu pred cudzími očami a robotmi. (Aby sme predišli problémom s blokovaním.)
  • Hromada lokalít s proxy_path na servery Telegram — to sú práve naše endpointy, cez ktoré budeme proxy-preposielať naše požiadavky.

Takisto vytvoríme súbor /etc/nginx/passwd.htpasswd;, aby mal nginx s čím porovnávať používateľské heslá.

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

Zvyšujeme svoj inštanciu Webogram s proxy cez nginx

Reštartujeme nginx:

sudo systemctl restart nginx

Teraz bude Webogram prístupný iba na adrese mywebogram.localhost/app/index.html po zadaní prihlasovacích údajov, ktoré ste určili pri vytváraní príkazu htpasswd.

Zostáva len málo: urobíme niekoľko drobných zmien v projekte.

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

A prispôsobte jeho začiatok nasledujúcemu tvaru:

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

Potom je potrebné osviežiť stránku aplikácie v prehliadači.

Otvorte konzolu prehliadača a sledujte sieťové požiadavky aplikácie. Ak všetko funguje a XHR požiadavky idú na váš server — znamená to, že je to správne, a Webogram je teraz proxy-preposielaný cez nginx.

Zvyšujeme svoj inštanciu Webogram s proxy cez nginx

Dúfam, že tento návod bude užitočný aj niekomu inému okrem mňa.

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

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

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster