Rydym yn codi ein hesiampl Webogram gyda dirprwy trwy nginx

Hei Habr!

Yn ddiweddar cefais fy hun mewn sefyllfa lle roedd angen gweithio y tu mewn i rwydwaith corfforaethol gyda mynediad anghyflawn i'r Rhyngrwyd ac, fel y gallwch chi ddyfalu o'r teitl, roedd Telegram wedi'i rwystro ynddo. Yr wyf yn siΕ΅r bod y sefyllfa hon yn gyfarwydd i lawer.

Gallaf wneud heb negeswyr gwib, ond Telegram oedd ei angen arnaf ar gyfer gwaith. Nid oedd yn bosibl gosod y cleient ar beiriant gwaith, ac nid oedd yn bosibl defnyddio gliniadur personol. Ymddengys mai ateb arall yw ei ddefnyddio fersiwn we swyddogol, ond fel y gallwch ddyfalu, nid oedd ar gael ychwaith. Rwy'n croesi allan ar unwaith yr opsiwn o chwilio am ddrych answyddogol (gobeithiaf am resymau amlwg).

Yn ffodus, mae Webogram yn brosiect ffynhonnell agored y mae ei god ffynhonnell ar gael ynddo GitHub ei awdur (Am hynny diolch yn fawr iddo!)
Nid yw'r gosodiad a'r lansiad ei hun yn anodd, fodd bynnag, mewn amodau gweithredu o fewn rhwydwaith sydd Γ’ mynediad wedi'i rwystro i weinyddion Telegram, byddwch yn fwy tebygol o fod yn siomedig na llwyddiannus, gan fod y fersiwn we yn anfon ceisiadau at weinyddion Telegram o beiriant y defnyddiwr.

Yn ffodus, mae hwn yn ateb eithaf syml (ond nid yn amlwg iawn). Hoffwn eich rhybuddio nad fi yw awdur yr ateb hwn. Llwyddais i ddod o hyd iddo i mewn cangen, a drafododd broblem debyg i fy un i. Ateb a awgrymir gan ddefnyddiwr github tecknojock, fe helpodd fi lawer, fodd bynnag, rwy'n siΕ΅r y gall helpu rhywun arall, felly penderfynais ysgrifennu'r tiwtorial hwn.

O dan y toriad fe welwch setup cam wrth gam o'ch drych Webogram a setup o ddirprwyo ei geisiadau i weinyddion Telegram gan ddefnyddio nginx.

Fel enghraifft, dewisais Ubuntu Server 18.04.3 wedi'i osod a'i ddiweddaru'n ffres.

Rhybudd: Ni fydd y tiwtorial hwn yn cynnwys cyfarwyddiadau ar sefydlu parth yn nginx. Mae angen i chi wneud hyn eich hun. Mae'r tiwtorial yn tybio eich bod eisoes wedi ffurfweddu parth gyda ssl, a bod gan y gweinydd ei hun yr ydych yn bwriadu ei ffurfweddu arno fynediad i'r gweinyddwyr Telegram (mewn unrhyw ffordd y dymunwch)

Gadewch i ni dybio mai ip y gweinydd hwn yw 10.23.0.3, a'r enw parth yw mywebogram.localhost

Yn seiliedig ar y confensiynau hyn, rhoddaf enghreifftiau o ffurfweddiadau. Peidiwch ag anghofio newid y gwerthoedd i'ch rhai chi.

Felly gadewch i ni ddechrau:

I redeg Webogram, mae angen nodejs arnom. Yn ddiofyn, os byddwn yn ei osod o ystorfeydd Ubuntu, byddwn yn cael fersiwn nodejs 8.x. Mae angen 12.x:

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

Rydyn ni'n dewis y man lle bydd ein Webogram wedi'i seilio.

Er enghraifft, gadewch i ni ei roi yng ngwraidd y cyfeiriadur cartref. I wneud hyn, cloniwch yr ystorfa swyddogol i'n gweinydd:

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

Y cam nesaf yw gosod yr holl ddibyniaethau sydd eu hangen i redeg y cais:

cd webogram && npm install

Gadewch i ni roi cynnig ar redeg prawf. Rhedeg y gorchymyn:

npm start

Ar Γ΄l hynny, rydym yn ceisio ei agor yn y porwr

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

Os ydych wedi gwneud popeth yn gywir hyd at y pwynt hwn, bydd tudalen awdurdodi Webogram yn agor.

Nawr mae angen i ni ffurfweddu'r rhaglen i redeg fel gwasanaeth. I wneud hyn, gadewch i ni greu ffeil

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

agorwch ef mewn unrhyw olygydd a rhowch yr ymddangosiad canlynol iddo (nodwch eich llwybr i 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

Yna rydym yn rhedeg y gorchmynion canlynol:

Cymhwyso'r newidiadau

sudo systemctl daemon-reload

Galluogi autorun:

sudo systemctl enable webogram.service

Rydyn ni'n dechrau'r gwasanaeth:

sudo systemctl start webogram.service

Ar Γ΄l cwblhau'r camau, bydd Webogram yn parhau i fod ar gael ar borthladd 8000.

Gan y byddwn yn sefydlu mynediad i'n Webogram trwy nginx, byddwn yn cau porthladd 8000 ar gyfer ceisiadau o'r tu allan.

Rydym yn defnyddio cyfleustodau udf ar gyfer hyn (neu unrhyw ddull sy'n gyfleus i chi):

sudo ufw deny 8000

Rhag ofn eich bod yn dal i benderfynu defnyddio udf, ond ei fod wedi'i analluogi ar y gweinydd, ychwanegwch fwy o reolau (fel nad yw popeth yn disgyn yn ddarnau) a galluogi udf:

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

Nesaf, gadewch i ni ddechrau newid y ffurfwedd nginx.

Fel y rhybuddiais uchod, tybir bod parth gyda ssl eisoes wedi'i ffurfweddu ar eich gweinydd. Ni fyddaf ond yn tynnu eich sylw at yr hyn y bydd angen ei ychwanegu at y ffeil ffurfweddu parth er mwyn iddo weithio'n gywir:


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

Yr hyn rydyn ni'n ei ychwanegu at y ffurfwedd nginx:

  • Rydym yn newid lleoliad y gwraidd, a fydd yn gwneud ceisiadau dirprwy i borthladd 8000, y mae Webogram yn ymateb iddo
  • Rydym yn cau'r lleoliad gwraidd gan ddefnyddio basic-auth. Mae hwn yn gam symbolaidd yn unig i gau ein cais rhag llygaid busneslyd a bots. (A hefyd i osgoi problemau gyda blocio)
  • Mae criw o leoliadau gyda proxy_path ar y gweinydd Telegram yn union ein pwyntiau terfyn y byddwn yn dirprwyo ein ceisiadau trwyddynt

Hefyd, gadewch i ni greu ffeil /etc/nginx/passwd.htpasswd;fel bod gan nginx rywbeth i wirio cyfrineiriau defnyddwyr ag ef.

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

Rydym yn codi ein hesiampl Webogram gyda dirprwy trwy nginx

Ailgychwyn nginx:

sudo systemctl restart nginx

Nawr bydd Webogram ond ar gael yn mywebogram.localhost/app/index.html ar Γ΄l i'r mewngofnodi a'r cyfrinair a ddiffiniwyd gennych wrth greu'r gorchymyn htpasswd gael eu nodi.

Nid oes llawer ar Γ΄l: byddwn yn gwneud newidiadau bach i'r prosiect ei hun.

Agorwch y ffeil mewn golygydd ~/webogram/app/js/lib/mtproto.js

A dod Γ’'i ddechrau i'r ffurf ganlynol:

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

Ar Γ΄l hyn, mae angen i chi adnewyddu'r dudalen cais yn y porwr.

Agorwch eich consol porwr ac edrychwch ar geisiadau rhwydwaith y rhaglen. Os yw popeth yn gweithio a bod ceisiadau XHR yn mynd i'ch gweinydd, yna mae popeth yn cael ei wneud yn gywir, ac mae Webogram bellach yn cael ei ddirprwyo trwy nginx.

Rydym yn codi ein hesiampl Webogram gyda dirprwy trwy nginx

Rwy'n gobeithio y bydd y tiwtorial hwn yn ddefnyddiol i rywun arall ar wahΓ’n i mi.

Diolch yn fawr i bawb a ddarllenodd hyd y diwedd.

Os oes gan unrhyw un unrhyw anawsterau neu os gwnes unrhyw anghywirdebau, byddaf yn hapus i ateb a cheisio eich helpu yn y sylwadau neu yn PM.

Ffynhonnell: hab.com

Ychwanegu sylw