Naš primerek Webogram dvignemo s posredništvom prek nginx

Pozdravljeni, Habr!

Pred kratkim sem se znašel v situaciji, ko je bilo treba delati znotraj korporativnega omrežja z nepopolnim dostopom do interneta in, kot lahko uganete iz naslova, je bil Telegram v njem blokiran. Prepričan sem, da je ta situacija mnogim znana.

Lahko brez hitrih sporočil, vendar sem za delo potreboval Telegram. Odjemalca ni bilo mogoče namestiti na delovni stroj, prav tako ni bilo mogoče uporabiti osebnega prenosnika. Druga rešitev se zdi, da ga uporabite uradna spletna različica, a kot lahko ugibate, tudi ni bil na voljo. Takoj prečrtam možnost iskanja neuradnega ogledala (upam, da iz očitnih razlogov).

Na srečo je Webogram odprtokodni projekt, katerega izvorna koda je na voljo v github njen avtor (za kar se mu najlepše zahvaljujemo!)
Sama namestitev in zagon nista težavna, vendar boste v pogojih delovanja v omrežju z blokiranim dostopom do strežnikov Telegram prej razočarani kot uspešni, saj spletna različica pošilja zahteve strežnikom Telegram z uporabnikovega računalnika.

Na srečo je to dokaj preprosta (vendar ne zelo očitna) rešitev. Rad bi vas opozoril, da nisem avtor te rešitve. Uspelo mi je najti v podružnica, ki je obravnaval problem, podoben mojemu. Rešitev predlaga uporabnik github tecknojock, mi je zelo pomagalo, vendar sem prepričan, da lahko pomaga še komu drugemu, zato sem se odločil napisati to vadnico.

Pod rezom boste našli korak za korakom nastavitev ogledala Webogram in nastavitev proxyja njegovih zahtev do strežnikov Telegram z uporabo nginx.

Kot primer sem izbral sveže nameščen in posodobljen Ubuntu Server 18.04.3.

Opozorilo: Ta vadnica ne bo vsebovala navodil za nastavitev domene v nginx. To morate narediti sami. Vadnica predpostavlja, da ste že konfigurirali domeno s ssl in da ima sam strežnik, na katerem ga nameravate konfigurirati, dostop do strežnikov Telegram (na kakršen koli način)

Predpostavimo, da je ip tega strežnika 10.23.0.3 in ime domene mywebogram.localhost

Na podlagi teh konvencij bom podal primere konfiguracij. Ne pozabite spremeniti vrednosti na svoje.

Torej, začnimo:

Za zagon Webograma potrebujemo nodejs. Privzeto, če ga namestimo iz repozitorijev Ubuntu, bomo dobili različico nodejs 8.x. Potrebujemo 12.x:

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

Izberemo kraj, kjer bo sedež našega Webograma.

Na primer, postavimo ga v koren domačega imenika. Če želite to narediti, klonirajte uradno skladišče v naš strežnik:

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

Naslednji korak je namestitev vseh odvisnosti, potrebnih za zagon aplikacije:

cd webogram && npm install

Poskusimo poskusno vožnjo. Izvedite ukaz:

npm start

Po tem ga poskušamo odpreti v brskalniku

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

Če ste do te točke naredili vse pravilno, se odpre avtorizacijska stran Webogram.

Zdaj moramo aplikacijo konfigurirati za delovanje kot storitev. Če želite to narediti, ustvarimo datoteko

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

odprite ga v katerem koli urejevalniku in mu dajte naslednji videz (vnesite svojo pot do 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

Nato zaženemo naslednje ukaze:

Uporaba sprememb

sudo systemctl daemon-reload

Omogoči samodejni zagon:

sudo systemctl enable webogram.service

Začnimo s storitvijo:

sudo systemctl start webogram.service

Po zaključku korakov bo Webogram še naprej na voljo na vratih 8000.

Ker bomo vzpostavili dostop do našega Webograma prek nginxa, bomo zaprli vrata 8000 za zahteve od zunaj.

Za to uporabljamo pripomoček udf (ali katero koli metodo, ki vam ustreza):

sudo ufw deny 8000

V primeru, da se vseeno odločite za uporabo udf-a, vendar je na strežniku onemogočen, dodajte še pravila (da ne bo vse skupaj razpadlo) in omogočite udf:

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

Nato začnimo spreminjati konfiguracijo nginx.

Kot sem opozoril zgoraj, se predpostavlja, da je domena s ssl že konfigurirana na vašem strežniku. Opozoril vas bom le na to, kaj bo treba dodati konfiguracijski datoteki domene, da bo pravilno delovala:


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;
  }
}

Kaj dodamo konfiguraciji nginx:

  • Spremenimo korensko lokacijo, ki bo proxy zahtevala na vrata 8000, na katera Webogram odgovori
  • Korensko lokacijo zapremo z uporabo osnovne avtorizacije. To je čisto simboličen korak, da našo aplikacijo zapremo pred radovednimi očmi in roboti. (In tudi, da se izognete težavam z blokiranjem)
  • Kup lokacij s proxy_path na strežniku Telegram so ravno naše končne točke, prek katerih bomo posredovali svoje zahteve

Prav tako ustvarimo datoteko /etc/nginx/passwd.htpasswd;tako da ima nginx nekaj za preverjanje uporabniških gesel.

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

Naš primerek Webogram dvignemo s posredništvom prek nginx

Znova zaženite nginx:

sudo systemctl restart nginx

Zdaj bo Webogram na voljo samo na mywebogram.localhost/app/index.html po vnosu prijave in gesla, ki ste ju določili pri ustvarjanju ukaza htpasswd.

Malo je ostalo: naredili bomo majhne spremembe v samem projektu.

Odprite datoteko v urejevalniku ~/webogram/app/js/lib/mtproto.js

In njegov začetek prinesite v naslednjo obliko:

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

Po tem morate osvežiti stran aplikacije v brskalniku.

Odprite konzolo brskalnika in si oglejte omrežne zahteve aplikacije. Če vse deluje in gredo zahteve XHR na vaš strežnik, je vse opravljeno pravilno in Webogram je zdaj proksiran prek nginx.

Naš primerek Webogram dvignemo s posredništvom prek nginx

Upam, da bo ta lekcija koristila še komu poleg mene.

Najlepša hvala vsem, ki ste prebrali do konca.

Če ima kdo kakršne koli težave ali sem naredil kakšno netočnost, bom z veseljem odgovoril in vam poskušal pomagati v komentarjih ali v PM.

Vir: www.habr.com

Dodaj komentar