Vi höjer vÄr Webogram-instans med proxy via nginx

Hej Habr!

Nyligen befann jag mig i en situation dÀr det var nödvÀndigt att arbeta i ett företagsnÀtverk med ofullstÀndig tillgÄng till Internet och, som du kan gissa frÄn titeln, blockerades Telegram i det. Jag Àr sÀker pÄ att denna situation Àr bekant för mÄnga.

Jag klarar mig utan instant messengers, men det var Telegram som jag behövde för jobbet. Det gick inte att installera klienten pÄ en arbetsmaskin och det var inte heller möjligt att anvÀnda en personlig bÀrbar dator. En annan lösning verkar vara att anvÀnda den officiella webbversion, men som du kan gissa var den inte heller tillgÀnglig. Jag stryker omedelbart över alternativet att söka efter en inofficiell spegel (hoppas jag av förklarliga skÀl).

Lyckligtvis Àr Webogram ett projekt med öppen kÀllkod vars kÀllkod Àr tillgÀnglig i github dess författare (som stort tack till honom!)
Installationen och lanseringen i sig Àr inte svÄr, men under driftförhÄllanden i ett nÀtverk med blockerad Ätkomst till Telegram-servrar Àr det mer sannolikt att du blir besviken Àn framgÄngsrik, eftersom webbversionen skickar förfrÄgningar till Telegram-servrar frÄn anvÀndarens maskin.

Lyckligtvis Àr detta en ganska enkel (men inte sÀrskilt uppenbar) fix. Jag skulle vilja varna dig för att jag inte Àr författaren till denna lösning. Jag lyckades hitta den gren, som diskuterade ett problem som liknar mitt. Lösning föreslagen av github-anvÀndare tecknojock, det hjÀlpte mig mycket, men jag Àr sÀker pÄ att det kan hjÀlpa nÄgon annan, sÄ jag bestÀmde mig för att skriva den hÀr handledningen.

Nedanför klippet hittar du steg-för-steg-instÀllning av din Webogram-spegel och instÀllning av proxysÀndning av dess förfrÄgningar till Telegram-servrar med nginx.

Som exempel valde jag en nyinstallerad och uppdaterad Ubuntu Server 18.04.3.

Varning: Denna handledning kommer inte att innehÄlla instruktioner om hur du konfigurerar en domÀn i nginx. Du mÄste göra detta sjÀlv. Handledningen förutsÀtter att du redan har konfigurerat en domÀn med ssl, och att sjÀlva servern som du planerar att konfigurera den pÄ har tillgÄng till Telegram-servrarna (pÄ vilket sÀtt du vill)

LÄt oss anta att denna servers ip Àr 10.23.0.3 och domÀnnamnet Àr mywebogram.localhost

UtifrÄn dessa konventioner kommer jag att ge exempel pÄ konfigurationer. Glöm inte att Àndra vÀrdena till dina egna.

SÄ lÄt oss komma igÄng:

För att köra Webogram behöver vi nodejs. Som standard, om du installerar det frĂ„n repositorierna Ubuntu — vi skaffar nodejs version 8.x. Vi behöver 12.x:

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

Vi vÀljer platsen dÀr vÄrt webogram ska vara baserat.

LÄt oss till exempel placera den i roten av hemkatalogen. För att göra detta, klona det officiella förvaret till vÄr server:

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

NÀsta steg Àr att installera alla beroenden som krÀvs för att köra programmet:

cd webogram && npm install

LÄt oss provköra. Kör kommandot:

npm start

Efter det försöker vi öppna den i webblÀsaren

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

Om du fram till denna punkt har gjort allt korrekt, öppnas Webogram-auktoriseringssidan.

Nu mÄste vi konfigurera applikationen för att köras som en tjÀnst. För att göra detta, lÄt oss skapa en fil

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

öppna den i valfri editor och ge den följande utseende (skriv in din sökvÀg till 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

Sedan kör vi följande kommandon:

TillÀmpar Àndringarna

sudo systemctl daemon-reload

Aktivera autorun:

sudo systemctl enable webogram.service

LÄt oss starta tjÀnsten:

sudo systemctl start webogram.service

Efter att ha slutfört stegen kommer Webogram att fortsÀtta att vara tillgÀngligt pÄ port 8000.

Eftersom vi kommer att konfigurera Ätkomst till vÄrt webogram via nginx kommer vi att stÀnga port 8000 för förfrÄgningar utifrÄn.

Vi anvÀnder utf-verktyget för detta (eller nÄgon metod som Àr bekvÀm för dig):

sudo ufw deny 8000

Om du fortfarande bestÀmmer dig för att anvÀnda udf, men det Àr inaktiverat pÄ servern, lÀgg till fler regler (sÄ att allt inte faller isÀr) och aktivera udf:

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

LÄt oss sedan börja Àndra nginx-konfigurationen.

Som jag varnade ovan antas det att en domÀn med ssl redan Àr konfigurerad pÄ din server. Jag kommer bara att uppmÀrksamma dig pÄ vad som mÄste lÀggas till i domÀnkonfigurationsfilen för att den ska fungera korrekt:


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

Vad vi lÀgger till i nginx-konfigurationen:

  • Vi Ă€ndrar rotplatsen, som kommer proxyförfrĂ„gningar till port 8000, som Webogram svarar pĂ„
  • Vi stĂ€nger rotplatsen med basic-auth. Detta Ă€r ett rent symboliskt steg för att stĂ€nga vĂ„r applikation frĂ„n nyfikna ögon och bots. (Och Ă€ven för att undvika problem med blockering)
  • Ett gĂ€ng platser med proxy_path pĂ„ Telegram-servern Ă€r exakt vĂ„ra slutpunkter genom vilka vi kommer att proxya vĂ„ra förfrĂ„gningar

LÄt oss ocksÄ skapa en fil /etc/nginx/passwd.htpasswd;sÄ att nginx har nÄgot att kontrollera anvÀndarlösenord med.

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

Vi höjer vÄr Webogram-instans med proxy via nginx

Starta om nginx:

sudo systemctl restart nginx

Nu kommer Webogram endast att finnas tillgÀngligt kl mywebogram.localhost/app/index.html efter att inloggningen och lösenordet som du definierade nÀr du skapade kommandot htpasswd har angetts.

Det Àr lite kvar: vi kommer att göra smÄ förÀndringar i sjÀlva projektet.

Öppna filen i en editor ~/webogram/app/js/lib/mtproto.js

Och föra dess början till följande form:

/*!
 * Webogram v0.7.0 - messaging web application for MTProto
 * https://github.com/zhukov/webogram
 * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>
 * 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
      }
...
 

Efter detta mÄste du uppdatera applikationssidan i webblÀsaren.

Öppna din webblĂ€sarkonsol och titta pĂ„ programmets nĂ€tverksbegĂ€randen. Om allt fungerar och XHR-förfrĂ„gningar gĂ„r till din server, sĂ„ Ă€r allt gjort korrekt, och Webogram proxias nu via nginx.

Vi höjer vÄr Webogram-instans med proxy via nginx

Jag hoppas att denna handledning kommer att vara anvÀndbar för nÄgon annan Àn mig.

Stort tack till alla som lÀst till slutet.

Om nÄgon har nÄgra svÄrigheter eller jag gjort nÄgra felaktigheter sÄ svarar jag gÀrna och försöker hjÀlpa dig i kommentarerna eller i PM.

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster