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 ett 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 vi installerar det från Ubuntu-förråden, får vi 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 <[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
      }
...
 

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

Lägg en kommentar