Mes iškeliame savo Webogram egzempliorių su tarpiniu serveriu per nginx

Sveiki, Habr!

Neseniai atsidūriau situacijoje, kai reikėjo dirbti įmonės tinkle su nepilna prieiga prie interneto ir, kaip galite atspėti iš pavadinimo, jame buvo užblokuota „Telegram“. Esu tikras, kad ši situacija daugeliui pažįstama.

Galiu apsieiti be momentinių pasiuntinių, bet darbui man reikėjo „Telegram“. Nebuvo įmanoma įdiegti kliento darbo mašinoje, taip pat nebuvo galima naudoti asmeninio nešiojamojo kompiuterio. Atrodo, kad kitas sprendimas yra jį naudoti oficiali žiniatinklio versija, bet, kaip galite atspėti, jis taip pat buvo nepasiekiamas. Iš karto nubraukiu neoficialaus veidrodžio paieškos variantą (tikiuosi dėl suprantamų priežasčių).

Laimei, „Webogram“ yra atvirojo kodo projektas, kurio šaltinio kodas yra prieinamas GitHub jo autorius (už tai jam labai ačiū!)
Pats diegimas ir paleidimas nėra sudėtingas, tačiau veikiant tinkle su užblokuota prieiga prie „Telegram“ serverių, greičiausiai nusivilsite nei pasiseks, nes žiniatinklio versija siunčia užklausas „Telegram“ serveriams iš vartotojo įrenginio.

Laimei, tai gana paprastas (bet ne labai akivaizdus) sprendimas. Norėčiau perspėti, kad nesu šio sprendimo autorius. Man pavyko jį rasti šaka, kuriame buvo aptarta problema, panaši į mano. Github vartotojo pasiūlytas sprendimas tecknojock, man tai labai padėjo, tačiau esu tikras, kad gali padėti kam nors kitam, todėl nusprendžiau parašyti šią pamoką.

Po pjūviu rasite nuoseklią „Webogram“ veidrodžio sąranką ir tarpinio serverio užklausų „Telegram“ serveriams, naudojant „nginx“, sąranką.

Kaip pavyzdį pasirinkau ką tik įdiegtą ir atnaujintą Ubuntu Server 18.04.3.

Įspėjimas: Šioje pamokoje nebus instrukcijų, kaip nustatyti domeną nginx. Jūs turite tai padaryti patys. Mokymo priemonėje daroma prielaida, kad jau sukonfigūravote domeną naudodami ssl, o pats serveris, kuriame planuojate jį konfigūruoti, turi prieigą prie „Telegram“ serverių (bet kokiu būdu).

Tarkime, kad šio serverio IP yra 10.23.0.3, o domeno vardas yra mywebogram.localhost

Remdamasis šiomis sutartimis, pateiksiu konfigūracijų pavyzdžius. Nepamirškite pakeisti verčių į savo.

Taigi, pradėkime:

Norėdami paleisti „Webogram“, mums reikia mazgų. Pagal numatytuosius nustatymus, jei įdiegsime jį iš Ubuntu saugyklų, gausime nodejs 8.x versiją. Mums reikia 12.x:

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

Mes pasirenkame vietą, kurioje bus mūsų Webograma.

Pavyzdžiui, įdėkite jį į pagrindinio katalogo šaknį. Norėdami tai padaryti, klonuokite oficialią saugyklą į mūsų serverį:

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

Kitas veiksmas yra įdiegti visas priklausomybes, reikalingas programai paleisti:

cd webogram && npm install

Pabandykime bandomąjį važiavimą. Paleiskite komandą:

npm start

Po to bandome jį atidaryti naršyklėje

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

Jei iki šiol viską padarėte teisingai, atsidarys Webogram autorizacijos puslapis.

Dabar turime sukonfigūruoti programą, kad ji veiktų kaip paslauga. Norėdami tai padaryti, sukurkime failą

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

atidarykite jį bet kuriame redaktoriuje ir suteikite jam tokią išvaizdą (įveskite kelią į 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

Tada vykdome šias komandas:

Pakeitimų taikymas

sudo systemctl daemon-reload

Įgalinti automatinį paleidimą:

sudo systemctl enable webogram.service

Pradėkime paslaugą:

sudo systemctl start webogram.service

Atlikus veiksmus, Webogram ir toliau bus pasiekiama 8000 prievade.

Kadangi mes nustatysime prieigą prie savo Webogram per nginx, uždarysime 8000 prievadą užklausoms iš išorės.

Tam naudojame udf įrankį (arba bet kurį jums patogų metodą):

sudo ufw deny 8000

Jei vis tiek nuspręsite naudoti udf, bet jis išjungtas serveryje, pridėkite daugiau taisyklių (kad viskas nesugriūtų) ir įjunkite udf:

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

Tada pradėkime keisti nginx konfigūraciją.

Kaip perspėjau aukščiau, daroma prielaida, kad jūsų serveryje jau sukonfigūruotas domenas su ssl. Atkreipsiu jūsų dėmesį tik į tai, ką reikės pridėti prie domeno konfigūracijos failo, kad jis tinkamai veiktų:


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

Ką pridedame prie nginx konfigūracijos:

  • Keičiame šakninę vietą, kuri perduos tarpinio serverio užklausas į 8000 prievadą, į kurį atsako Webograma
  • Uždarome šakninę vietą naudodami pagrindinį autentifikavimą. Tai grynai simbolinis žingsnis siekiant uždaryti programą nuo smalsių akių ir robotų. (Ir taip pat norint išvengti blokavimo problemų)
  • Daugybė vietų su proxy_path Telegram serveryje yra būtent mūsų galutiniai taškai, per kuriuos vykdysime savo užklausas.

Be to, sukurkime failą /etc/nginx/passwd.htpasswd;kad nginx turėtų su kuo patikrinti vartotojų slaptažodžius.

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

Mes iškeliame savo Webogram egzempliorių su tarpiniu serveriu per nginx

Iš naujo paleiskite nginx:

sudo systemctl restart nginx

Dabar „Webogram“ bus pasiekiama tik adresu mywebogram.localhost/app/index.html po to, kai įvesite prisijungimo vardą ir slaptažodį, kuriuos nustatėte kurdami htpasswd komandą.

Liko nedaug: mažų pakeitimų darysime pačiame projekte.

Atidarykite failą redaktoriuje ~/webogram/app/js/lib/mtproto.js

Ir perkelkite jos pradžią į tokią 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
      }
...
 

Po to turite atnaujinti programos puslapį naršyklėje.

Atidarykite naršyklės konsolę ir peržiūrėkite programos tinklo užklausas. Jei viskas veikia ir XHR užklausos patenka į jūsų serverį, tada viskas daroma teisingai, o „Webogram“ dabar yra tarpinis serveris per nginx.

Mes iškeliame savo Webogram egzempliorių su tarpiniu serveriu per nginx

Tikiuosi, kad ši pamoka bus naudinga dar kam nors be manęs.

Labai ačiū visiems, kurie perskaitė iki galo.

Jeigu kam nors kils sunkumų ar padariau netikslumų, mielai atsakysiu ir pabandysiu padėti komentaruose arba PM.

Šaltinis: www.habr.com

Добавить комментарий