Wy ferheegje ús Webogram-eksimplaar mei proxying fia nginx

Hoi Habr!

Koartlyn fûn ik mysels yn in situaasje wêryn it nedich wie om te wurkjen yn in bedriuwsnetwurk mei ûnfolsleine tagong ta it ynternet en, lykas jo kinne riede út 'e titel, Telegram waard dêryn blokkearre. Ik bin der wis fan dat dizze situaasje is bekend foar in protte.

Ik kin sûnder instant messengers dwaan, mar it wie Telegram dat ik nedich wie foar wurk. It wie net mooglik om de kliïnt op in wurkmasine te ynstallearjen, en it wie ek net mooglik om in persoanlike laptop te brûken. In oare oplossing liket te wêzen om it te brûken offisjele webferzje, mar as jo kinne riede, it wie ek net beskikber. Ik streekje fuortendaliks de opsje fan it sykjen nei in net-offisjele spegel (ik hoopje om dúdlike redenen).

Gelokkich is Webogram in iepen boarne-projekt wêrfan de boarnekoade beskikber is yn GitHub har skriuwer (wêrfoar in protte tank oan him!)
De ynstallaasje en lansearring sels is net dreech, lykwols, yn betingsten fan operaasje binnen in netwurk mei blokkearre tagong ta Telegram-tsjinners, sille jo mear kâns wêze om teloarsteld te wêzen as suksesfol, om't de webferzje oanfragen stjoert nei Telegram-tsjinners fan 'e masine fan' e brûker.

Gelokkich is dit in frij ienfâldige (mar net heul dúdlik) fix. Ik wol jo warskôgje dat ik net de skriuwer bin fan dizze oplossing. Ik slagge it te finen yn tûke, dy't besprutsen in probleem fergelykber mei my. Oplossing foarsteld troch github brûker tecknojock, it hat my in protte holpen, lykwols, ik bin der wis fan dat it in oar kin helpe, dus ik besleat dizze tutorial te skriuwen.

Under de besuniging fine jo stap-foar-stap opset fan jo Webogram-spegel en opset fan proxying fan har fersiken nei Telegram-tsjinners mei nginx.

As foarbyld keas ik in nij ynstalleare en bywurke Ubuntu Server 18.04.3.

Warskôging: Dizze tutorial sil gjin ynstruksjes befetsje oer it ynstellen fan in domein yn nginx. Jo moatte dit sels dwaan. De tutorial giet derfan út dat jo al in domein konfigureare hawwe mei ssl, en dat de server sels wêrop jo fan plan binne it te konfigurearjen tagong hat ta de Telegram-tsjinners (op elke manier dy't jo wolle)

Litte wy oannimme dat de ip fan dizze tsjinner 10.23.0.3 is, en de domeinnamme is mywebogram.localhost

Op grûn fan dizze konvinsjes sil ik foarbylden fan konfiguraasjes jaan. Ferjit net de wearden te feroarjen nei jo eigen.

Dat litte wy begjinne:

Om Webogram út te fieren, hawwe wy nodejs nedich. Standert, as wy it ynstallearje fanút de Ubuntu-repositories, krije wy nodejs ferzje 8.x. Wy moatte 12.x:

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

Wy kieze it plak wêr't ús Webogram basearre sil wêze.

Litte wy it bygelyks yn 'e root fan' e thúsmap pleatse. Om dit te dwaan, klonje it offisjele repository nei ús server:

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

De folgjende stap is om alle ôfhinklikens te ynstallearjen dy't nedich binne om de applikaasje út te fieren:

cd webogram && npm install

Litte wy in proefrit besykje. Run it kommando:

npm start

Dêrnei besykje wy it te iepenjen yn 'e browser

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

As jo ​​oant dit punt alles goed dien hawwe, sil de webogram-autorisaasjeside iepenje.

No moatte wy de applikaasje konfigurearje om as tsjinst te rinnen. Om dit te dwaan, litte wy in bestân oanmeitsje

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

iepenje it yn elke bewurker en jou it it folgjende uterlik (fier jo paad yn nei 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

Dan rinne wy ​​de folgjende kommando's út:

It tapassen fan de feroarings

sudo systemctl daemon-reload

Autorun ynskeakelje:

sudo systemctl enable webogram.service

Litte wy de tsjinst begjinne:

sudo systemctl start webogram.service

Nei it foltôgjen fan de stappen sil Webogram fierder te krijen wêze op poarte 8000.

Om't wy tagong sille ynstelle foar ús Webogram fia nginx, sille wy poarte 8000 slute foar oanfragen fan bûten.

Wy brûke hjirfoar it udf-hulpprogramma (as elke metoade dy't jo handich is):

sudo ufw deny 8000

As jo ​​​​noch beslute om udf te brûken, mar it is útskeakele op 'e tsjinner, foegje mear regels ta (dat alles net útinoar falt) en aktivearje udf:

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

Litte wy dan de nginx-konfiguraasje begjinne te feroarjen.

Lykas ik hjirboppe warskôge, wurdt oannommen dat in domein mei ssl al konfigurearre is op jo tsjinner. Ik sil jo oandacht allinich lûke op wat jo moatte wurde tafoege oan it domeinkonfiguraasjebestân om it goed te wurkjen:


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

Wat wy tafoegje oan de nginx-konfiguraasje:

  • Wy feroarje de root-lokaasje, dy't proxy-fersiken sil nei poarte 8000, wêrop Webogram reagearret
  • Wy slute de root-lokaasje mei basic-auth. Dit is in suver symboalyske stap om ús applikaasje te sluten fan nijsgjirrige eagen en bots. (En ek om problemen mei blokkearjen te foarkommen)
  • In boskje lokaasjes mei proxy_path op 'e Telegram-tsjinner binne krekt ús einpunten wêrmei't wy ús oanfragen sille proxy

Litte wy ek in bestân oanmeitsje /etc/nginx/passwd.htpasswd;sadat nginx wat hat om brûkerswachtwurden te kontrolearjen.

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

Wy ferheegje ús Webogram-eksimplaar mei proxying fia nginx

nginx opnij starte:

sudo systemctl restart nginx

No sil Webogram allinich beskikber wêze by mywebogram.localhost/app/index.html neidat de oanmelding en wachtwurd dat jo definieare by it meitsjen fan it kommando htpasswd binne ynfierd.

Der bliuwt net folle oer: wy meitsje lytse feroarings yn it projekt sels.

Iepenje de triem yn in bewurker ~/webogram/app/js/lib/mtproto.js

En bring it begjin oan 'e folgjende foarm:

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

Hjirnei moatte jo de applikaasjeside yn 'e browser ferfarskje.

Iepenje jo blêderkonsole en besjoch de netwurkoanfragen fan 'e applikaasje. As alles wurket en XHR-oanfragen nei jo server gean, dan wurdt alles goed dien, en Webogram wurdt no proxied fia nginx.

Wy ferheegje ús Webogram-eksimplaar mei proxying fia nginx

Ik hoopje dat dizze tutorial nuttich sil wêze foar immen oars neist my.

Tige tank oan elkenien dy't lêzen oant it ein.

As immen swierrichheden hat of ik haw ûnkrektiviteiten makke, sil ik graach antwurdzje en besykje jo te helpen yn 'e opmerkingen of yn PM.

Boarne: www.habr.com

Add a comment