Mēs paaugstinām savu Webogram instanci, izmantojot starpniekserveri, izmantojot nginx

Čau Habr!

Nesen es nokļuvu situācijā, kad bija jāstrādā korporatÄ«vajā tÄ«klā ar nepilnÄ«gu piekļuvi internetam, un, kā jÅ«s varat nojaust no nosaukuma, Telegram tajā tika bloķēta. Esmu pārliecināts, ka Ŕī situācija daudziem ir pazÄ«stama.

Es varu iztikt bez tÅ«lÄ«tējiem kurjeriem, bet tā bija Telegram, kas man bija vajadzÄ«ga darbam. Klientu nebija iespējams instalēt darba maŔīnā, kā arÄ« nebija iespējams izmantot personÄ«go portatÄ«vo datoru. Å Ä·iet, ka vēl viens risinājums ir to izmantot oficiālā tÄ«mekļa versija, bet, kā jau nojauÅ”at, arÄ« tas nebija pieejams. Es uzreiz izsvÄ«troju iespēju meklēt neoficiālu spoguli (ceru, ka acÄ«mredzamu iemeslu dēļ).

Par laimi Webogram ir atvērtā pirmkoda projekts, kura pirmkods ir pieejams GitHub tā autors (Par ko viņam liels paldies!)
Pati instalÄ“Å”ana un palaiÅ”ana nav grÅ«ta, tomēr darbÄ«bas apstākļos tÄ«klā ar bloķētu piekļuvi Telegram serveriem, visticamāk, bÅ«siet vÄ«luÅ”ies nekā veiksmÄ«gi, jo tÄ«mekļa versija no lietotāja maŔīnas nosÅ«ta pieprasÄ«jumus Telegram serveriem.

Par laimi, tas ir diezgan vienkārÅ”s (bet ne ļoti acÄ«mredzams) labojums. Es vēlos jÅ«s brÄ«dināt, ka es neesmu Ŕī risinājuma autors. Man izdevās to atrast filiāle, kurā tika apspriesta manai lÄ«dzÄ«ga problēma. Github lietotāja ieteiktais risinājums tecknojock, tas man ļoti palÄ«dzēja, tomēr esmu pārliecināts, ka tas var palÄ«dzēt kādam citam, tāpēc nolēmu uzrakstÄ«t Å”o pamācÄ«bu.

Zem izgriezuma jūs atradīsiet soli pa solim Webogram spoguļa iestatīŔanu un tā pieprasījumu starpniekservera iestatīŔanu Telegram serveriem, izmantojot nginx.

Kā piemēru es izvēlējos tikko instalētu un atjauninātu Ubuntu Server 18.04.3.

BrÄ«dinājums: Å ajā apmācÄ«bā nav ietverti norādÄ«jumi par domēna iestatÄ«Å”anu programmā nginx. Jums tas jādara paÅ”am. ApmācÄ«ba pieņem, ka jÅ«s jau esat konfigurējis domēnu ar ssl un ka serverim, kurā plānojat to konfigurēt, ir piekļuve Telegram serveriem (jebkādā veidā, kā vēlaties).

Pieņemsim, ka Ŕī servera IP ir 10.23.0.3 un domēna nosaukums ir mywebogram.localhost

Pamatojoties uz Ŕīm konvencijām, es sniegÅ”u konfigurāciju piemērus. Neaizmirstiet mainÄ«t vērtÄ«bas uz savām.

Tāpēc sāciet darbu:

Lai palaistu Webogram, mums ir nepiecieÅ”ami mezgli. Pēc noklusējuma, ja mēs to instalējam no Ubuntu krātuvēm, mēs iegÅ«sim nodejs versiju 8.x. Mums ir nepiecieÅ”ams 12.x:

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

Mēs izvēlamies vietu, kur atradīsies mūsu Webogramma.

Piemēram, ievietosim to mājas direktorijas saknē. Lai to izdarītu, klonējiet oficiālo repozitoriju uz mūsu serveri:

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

Nākamais solis ir instalēt visas lietojumprogrammas palaiÅ”anai nepiecieÅ”amās atkarÄ«bas:

cd webogram && npm install

Mēģināsim veikt testa braucienu. Palaidiet komandu:

npm start

Pēc tam mēs mēģinām to atvērt pārlūkprogrammā

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

Ja lÄ«dz Å”im brÄ«dim esat visu izdarÄ«jis pareizi, tiks atvērta Webogram autorizācijas lapa.

Tagad mums ir jākonfigurē lietojumprogramma, lai tā darbotos kā pakalpojums. Lai to izdarītu, izveidosim failu

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

atveriet to jebkurā redaktorā un pieŔķiriet tam Ŕādu izskatu (ievadiet ceļu uz 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

Pēc tam mēs izpildām Ŕādas komandas:

Izmaiņu piemēroÅ”ana

sudo systemctl daemon-reload

Iespējot automātisko palaiÅ”anu:

sudo systemctl enable webogram.service

Sāksim pakalpojumu:

sudo systemctl start webogram.service

Pēc darbÄ«bu veikÅ”anas Webogram joprojām bÅ«s pieejama portā 8000.

Tā kā mēs iestatÄ«sim piekļuvi mÅ«su Webogrammai, izmantojot nginx, mēs slēgsim 8000. portu, lai saņemtu pieprasÄ«jumus no ārpuses.

Šim nolūkam mēs izmantojam udf utilītu (vai jebkuru jums ērtu metodi):

sudo ufw deny 8000

Ja joprojām nolemjat izmantot udf, bet tas ir atspējots serverī, pievienojiet papildu noteikumus (lai viss nesabruktu) un iespējojiet udf:

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

Tālāk sāksim mainīt nginx konfigurāciju.

Kā jau brÄ«dināju iepriekÅ”, tiek pieņemts, ka jÅ«su serverÄ« jau ir konfigurēts domēns ar ssl. Es pievērsÄ«Å”u jÅ«su uzmanÄ«bu tikai tam, kas bÅ«s jāpievieno domēna konfigurācijas failam, lai tas darbotos pareizi:


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

Ko mēs pievienojam nginx konfigurācijai:

  • Mēs mainām saknes atraÅ”anās vietu, kas nosÅ«tÄ«s starpniekservera pieprasÄ«jumus uz portu 8000, uz kuru Webogram atbild
  • Mēs aizveram saknes atraÅ”anās vietu, izmantojot pamata autentifikāciju. Å is ir tikai simbolisks solis, lai aizvērtu mÅ«su lietojumprogrammu no ziņkārÄ«go acÄ«m un robotprogrammatÅ«ras. (Un arÄ« lai izvairÄ«tos no problēmām ar bloÄ·Ä“Å”anu)
  • Virkne atraÅ”anās vietu ar starpniekservera_ceļu Telegram serverÄ« ir tieÅ”i mÅ«su galapunkti, caur kuriem mēs veicam savus pieprasÄ«jumus.

Tāpat izveidosim failu /etc/nginx/passwd.htpasswd;lai nginx būtu ar ko pārbaudīt lietotāju paroles.

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

Mēs paaugstinām savu Webogram instanci, izmantojot starpniekserveri, izmantojot nginx

Restartējiet nginx:

sudo systemctl restart nginx

Tagad Webogram bÅ«s pieejama tikai plkst mywebogram.localhost/app/index.html pēc pieteikÅ”anās vārda un paroles ievadÄ«Å”anas, ko definējāt, veidojot komandu htpasswd.

Palicis maz: veiksim nelielas izmaiņas paŔā projektā.

Atveriet failu redaktorā ~/webogram/app/js/lib/mtproto.js

Un izveidojiet tā sākumu Ŕādā formā:

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

Pēc tam pārlūkprogrammā ir jāatsvaidzina lietojumprogrammas lapa.

Atveriet pārlūkprogrammas konsoli un apskatiet lietojumprogrammas tīkla pieprasījumus. Ja viss darbojas un XHR pieprasījumi tiek nosūtīti uz jūsu serveri, tad viss tiek darīts pareizi, un Webogram tagad ir starpniekserveris, izmantojot nginx.

Mēs paaugstinām savu Webogram instanci, izmantojot starpniekserveri, izmantojot nginx

Ceru, ka Ŕī apmācÄ«ba noderēs vēl kādam, izņemot mani.

Liels paldies visiem, kas izlasīja līdz beigām.

Ja kādam ir kādas grÅ«tÄ«bas vai pieļāvu kādas neprecizitātes, labprāt atbildÄ“Å”u un mēģināŔu palÄ«dzēt komentāros vai PM.

Avots: www.habr.com

Pievieno komentāru