Ni levas nian Webogram-instancon kun prokurado per nginx

Hej Habr!

Lastatempe mi trovis min en situacio, en kiu necesis labori ene de kompania reto kun nekompleta aliro al Interreto kaj, kiel vi povas supozi el la titolo, Telegramo estis blokita en ĝi. Mi certas, ke ĉi tiu situacio estas konata al multaj.

Mi povas malhavi tujmesaĝilojn, sed estis Telegramo, kiun mi bezonis por laboro. Ne eblis instali la klienton sur labormaŝino, nek eblis uzi personan tekkomputilon. Alia solvo ŝajnas esti uzi ĝin oficiala retejo-versio, sed kiel vi povas diveni, ĝi ankaŭ estis neatingebla. Mi tuj forstrekas la eblon serĉi neoficialan spegulon (mi esperas pro evidentaj kialoj).

Feliĉe, Webogram estas malfermfonta projekto, kies fontkodo disponeblas en GitHub ĝia aŭtoro (Pro kio multe dankas al li!)
La instalado kaj lanĉo mem ne estas malfacilaj, tamen, en kondiĉoj de funkciado ene de reto kun blokita aliro al Telegram-serviloj, vi pli verŝajne estos seniluziigita ol sukcesa, ĉar la retejo-versio sendas petojn al Telegram-serviloj de la maŝino de la uzanto.

Feliĉe, ĉi tio estas sufiĉe simpla (sed ne tre evidenta) solvo. Mi ŝatus averti vin, ke mi ne estas la aŭtoro de ĉi tiu solvo. Mi sukcesis trovi ĝin en branĉo, kiu diskutis problemon similan al la mia. Solvo proponita de github-uzanto teknojock, ĝi multe helpis min, tamen mi certas, ke ĝi povas helpi al iu alia, do mi decidis skribi ĉi tiun lernilon.

Sub la tranĉo vi trovos paŝon post paŝo agordon de via Webogram-spegulo kaj aranĝon de prokurado de ĝiaj petoj al Telegram-serviloj per nginx.

Ekzemple, mi elektis ĵus instalitan kaj ĝisdatigitan Ubuntu-Servilon 18.04.3.

Averto: Ĉi tiu lernilo ne inkluzivos instrukciojn pri agordo de domajno en nginx. Vi devas fari tion mem. La lernilo supozas, ke vi jam agordis domajnon kun ssl, kaj ke la servilo mem, sur kiu vi planas agordi ĝin, havas aliron al la Telegram-serviloj (kiel vi ŝatas)

Ni supozu, ke la ip de ĉi tiu servilo estas 10.23.0.3, kaj la domajna nomo estas mywebogram.localhost

Surbaze de ĉi tiuj konvencioj, mi donos ekzemplojn de agordoj. Ne forgesu ŝanĝi la valorojn al viaj propraj.

Do ni komencu:

Por ruli Webogram, ni bezonas nodejs. Defaŭlte, se ni instalas ĝin de la Ubuntu-deponejoj, ni ricevos nodejs-version 8.x. Ni bezonas 12.x:

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

Ni elektas la lokon kie nia Webogramo estos bazita.

Ekzemple, ni metu ĝin en la radikon de la hejma dosierujo. Por fari tion, klonu la oficialan deponejon al nia servilo:

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

La sekva paŝo estas instali ĉiujn dependecojn necesajn por ruli la aplikaĵon:

cd webogram && npm install

Ni provu provon. Rulu la komandon:

npm start

Post tio, ni provas malfermi ĝin en la retumilo

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

Se ĝis ĉi tiu punkto vi faris ĉion ĝuste, la paĝo de rajtigo de Webogram malfermos.

Nun ni devas agordi la aplikaĵon por funkcii kiel servo. Por fari tion, ni kreu dosieron

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

malfermu ĝin en iu ajn redaktilo kaj donu al ĝi la sekvan aspekton (enigu vian vojon al 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

Poste ni rulas la jenajn komandojn:

Aplikante la ŝanĝojn

sudo systemctl daemon-reload

Ebligu aŭtomatan ruliĝon:

sudo systemctl enable webogram.service

Ni komencas la servon:

sudo systemctl start webogram.service

Post plenumi la paŝojn, Webogram daŭre estos disponebla en la haveno 8000.

Ĉar ni starigos aliron al nia Webogram per nginx, ni fermos la havenon 8000 por petoj de ekstere.

Ni uzas la udf-ilaĵon por ĉi tio (aŭ ajna metodo oportuna por vi):

sudo ufw deny 8000

Se vi ankoraŭ decidas uzi udf, sed ĝi estas malŝaltita en la servilo, aldonu pliajn regulojn (por ke ĉio ne disfalu) kaj ebligu udf:

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

Poste, ni komencu ŝanĝi la agordon de nginx.

Kiel mi avertis supre, oni supozas, ke domajno kun ssl jam estas agordita en via servilo. Mi nur atentigos vian atenton pri tio, kio devos esti aldonita al la domajna agorda dosiero por ke ĝi funkciu ĝuste:


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

Kion ni aldonas al la agordo nginx:

  • Ni ŝanĝas la radikan lokon, kiu prokurigos petojn al haveno 8000, pri kiu Webogram respondas
  • Ni fermas la radikan lokon uzante basic-auth. Ĉi tio estas pure simbola paŝo por fermi nian aplikaĵon de scivolaj okuloj kaj robotoj. (Kaj ankaŭ por eviti problemojn pri blokado)
  • Aro da lokoj kun proxy_path sur la Telegram-servilo estas ĝuste niaj finpunktoj per kiuj ni prokuros niajn petojn.

Ankaŭ, ni kreu dosieron /etc/nginx/passwd.htpasswd;tiel ke nginx havas ion por kontroli uzantpasvortojn per.

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

Ni levas nian Webogram-instancon kun prokurado per nginx

Rekomencu nginx:

sudo systemctl restart nginx

Nun Webogram estos disponebla nur ĉe mywebogram.localhost/app/index.html post la ensaluto kaj pasvorto, kiujn vi difinis dum kreado de la komando htpasswd, estas enigitaj.

Restas malmulte: ni faros malgrandajn ŝanĝojn al la projekto mem.

Malfermu la dosieron en redaktilo ~/webogram/app/js/lib/mtproto.js

Kaj alportu ĝian komencon al la sekva formo:

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

Post ĉi tio, vi devas refreŝigi la aplikan paĝon en la retumilo.

Malfermu vian retumilon-konzolon kaj rigardu la retajn petojn de la aplikaĵo. Se ĉio funkcias kaj XHR-petoj iras al via servilo, tiam ĉio estas farita ĝuste, kaj Webogram nun estas proksigita per nginx.

Ni levas nian Webogram-instancon kun prokurado per nginx

Mi esperas, ke ĉi tiu lernilo estos utila al iu alia krom mi.

Koran dankon al ĉiuj, kiuj legis ĝis la fino.

Se iu havas malfacilaĵojn aŭ mi faris ajnajn erarojn, mi volonte respondos kaj provos helpi vin en la komentoj aŭ en PM.

fonto: www.habr.com

Aldoni komenton