Nostamme Webogram-esiintymäämme välityspalvelimella nginxin kautta

Hei Habr!

Äskettäin jouduin tilanteeseen, jossa piti työskennellä yritysverkon sisällä, jossa oli epätäydellinen pääsy Internetiin ja kuten otsikosta voi arvata, Telegram oli estetty siinä. Olen varma, että tämä tilanne on monelle tuttu.

Tulen toimeen ilman pikaviestimiä, mutta se oli Telegram, jota tarvitsin töihin. Asiakasta ei voitu asentaa työkoneelle, eikä myöskään henkilökohtaisen kannettavan tietokoneen käyttäminen. Toinen ratkaisu näyttää olevan sen käyttö virallinen verkkoversio, mutta kuten arvata saattaa, sekään ei ollut saatavilla. Jätän heti pois mahdollisuuden etsiä epävirallista peiliä (toivottavasti ilmeisistä syistä).

Onneksi Webogram on avoimen lähdekoodin projekti, jonka lähdekoodi on saatavilla GitHub sen kirjoittaja (Mistä paljon kiitoksia hänelle!)
Itse asennus ja käynnistäminen ei ole vaikeaa, mutta käyttöolosuhteissa verkossa, jossa on estetty pääsy Telegram-palvelimiin, tulet todennäköisesti pettymään kuin onnistumaan, koska verkkoversio lähettää pyyntöjä Telegram-palvelimille käyttäjän koneelta.

Onneksi tämä on melko yksinkertainen (mutta ei kovin ilmeinen) korjaus. Haluaisin varoittaa, että en ole tämän ratkaisun kirjoittaja. Onnistuin löytämään sen sieltä haara, jossa käsiteltiin minun kaltaistani ongelmaa. Githubin käyttäjän ehdottama ratkaisu tecknojock, se auttoi minua paljon, mutta olen varma, että se voi auttaa jotakuta muuta, joten päätin kirjoittaa tämän opetusohjelman.

Leikkauksen alta löydät Webogram-peilin vaiheittaiset asetukset ja sen pyyntöjen välityspalvelimen asetukset Telegram-palvelimille nginxin avulla.

Esimerkkinä valitsin juuri asennetun ja päivitetyn Ubuntu Server 18.04.3:n.

Varoitus: Tämä opetusohjelma ei sisällä ohjeita verkkotunnuksen määrittämisestä nginxissä. Sinun on tehtävä tämä itse. Opetusohjelma olettaa, että olet jo määrittänyt verkkotunnuksen ssl:llä ja että palvelimella, jolle aiot määrittää sen, on pääsy Telegram-palvelimiin (millä tahansa tavalla).

Oletetaan, että tämän palvelimen IP-osoite on 10.23.0.3 ja verkkotunnuksen nimi on mywebogram.localhost

Näiden sopimusten perusteella annan esimerkkejä kokoonpanoista. Älä unohda muuttaa arvoja omiksi.

Joten aloitetaan:

Webogrammin suorittamiseksi tarvitsemme solmut. Oletuksena, jos asennamme sen Ubuntu-varastoista, saamme nodejs-version 8.x. Tarvitsemme 12.x:

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

Valitsemme paikan, jossa Webogrammemme sijaitsee.

Sijoitetaan se esimerkiksi kotihakemiston juureen. Tee tämä kloonaamalla virallinen arkisto palvelimellemme:

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

Seuraava vaihe on asentaa kaikki sovelluksen suorittamiseen tarvittavat riippuvuudet:

cd webogram && npm install

Kokeillaan koeajoa. Suorita komento:

npm start

Sen jälkeen yritämme avata sen selaimessa

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

Jos olet tähän mennessä tehnyt kaiken oikein, Webogram-valtuutussivu avautuu.

Nyt meidän on määritettävä sovellus toimimaan palveluna. Tätä varten luodaan tiedosto

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

avaa se missä tahansa editorissa ja anna sille seuraava ulkoasu (kirjoita polkusi WorkDirectoryyn)

[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

Sitten suoritamme seuraavat komennot:

Muutosten käyttöönotto

sudo systemctl daemon-reload

Ota automaattinen käynnistys käyttöön:

sudo systemctl enable webogram.service

Aloitetaan palvelu:

sudo systemctl start webogram.service

Kun vaiheet on suoritettu, Webogram on edelleen käytettävissä portissa 8000.

Koska määritämme pääsyn Webogrammiimme nginxin kautta, suljemme portin 8000 ulkopuolelta tulevilta pyynnöiltä.

Käytämme tähän udf-apuohjelmaa (tai mitä tahansa sinulle sopivaa menetelmää):

sudo ufw deny 8000

Jos päätät silti käyttää udf:ää, mutta se on poistettu käytöstä palvelimella, lisää sääntöjä (jotta kaikki ei hajoa) ja ota udf käyttöön:

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

Seuraavaksi aloitetaan nginx-kokoonpanon muuttaminen.

Kuten yllä varoitin, oletetaan, että ssl-verkkotunnus on jo määritetty palvelimellesi. Kiinnitän huomiosi vain siihen, mitä verkkotunnuksen määritystiedostoon on lisättävä, jotta se toimisi oikein:


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

Mitä lisäämme nginx-konfiguraatioon:

  • Muutamme juurisijaintia, joka välittää välityspalvelimen pyynnöt porttiin 8000, johon Webogram vastaa
  • Suljemme juurisijainnin käyttämällä perustodennusta. Tämä on puhtaasti symbolinen vaihe sulkeaksemme sovelluksemme uteliailta katseilta ja boteilta. (Ja myös estoongelmien välttämiseksi)
  • Joukko sijainteja, joissa on proxy_path Telegram-palvelimella, ovat täsmälleen päätepisteemme, joiden kautta välitämme pyyntömme

Luodaan myös tiedosto /etc/nginx/passwd.htpasswd;jotta nginxillä on jotain millä tarkistaa käyttäjien salasanat.

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

Nostamme Webogram-esiintymäämme välityspalvelimella nginxin kautta

Käynnistä nginx uudelleen:

sudo systemctl restart nginx

Nyt Webogram on saatavilla vain osoitteessa mywebogram.localhost/app/index.html sen jälkeen, kun htpasswd-komentoa luotaessa määrittämäsi käyttäjätunnus ja salasana on syötetty.

Jäljellä on vähän: teemme pieniä muutoksia itse projektiin.

Avaa tiedosto editorissa ~/webogram/app/js/lib/mtproto.js

Ja tuo sen alku seuraavaan muotoon:

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

Tämän jälkeen sinun on päivitettävä sovellussivu selaimessa.

Avaa selainkonsoli ja katso sovelluksen verkkopyyntöjä. Jos kaikki toimii ja XHR-pyynnöt menevät palvelimellesi, kaikki tehdään oikein ja Webogram on nyt välitetty nginxin kautta.

Nostamme Webogram-esiintymäämme välityspalvelimella nginxin kautta

Toivon, että tästä opetusohjelmasta on hyötyä jollekin muulle kuin minulle.

Suuri kiitos kaikille loppuun asti lukeneille.

Jos jollain on vaikeuksia tai tein epätarkkuuksia, vastaan ​​mielelläni ja yritän auttaa kommenteissa tai PM:ssä.

Lähde: will.com

Lisää kommentti