We zetten onze Webogram-instantie op met proxy via nginx

Hallo, Habr!

Onlangs kwam ik in een situatie terecht waarin ik binnen een bedrijfsnetwerk moest werken met beperkte toegang tot internet en zoals je kunt raden uit de titel - Telegram was geblokkeerd. Ik ben er zeker van dat veel mensen met deze situatie vertrouwd zijn.

Ik kan zonder berichtenapps, maar juist Telegram had ik nodig voor mijn werk. De client op de werkcomputer installeren was niet mogelijk, en mijn persoonlijke laptop gebruiken ook niet. Een andere oplossing leek de officiƫle webversie, maar zoals je kunt raden - die was ook niet beschikbaar. De optie om een niet-officiƫle mirror te zoeken schrap ik meteen (hoop dat om nogal voor de hand liggende redenen).

Gelukkig is Webogram een open-source project, waarvan de broncode beschikbaar is in github zijn auteur (Daarvoor veel dank!)
De installatie en het opstarten zijn eenvoudig, maar in een omgeving met geblokkeerde toegang tot de Telegram-servers zul je waarschijnlijk teleurgesteld zijn eerder dan succesvol zijn, omdat de webversie verzoeken naar de Telegram-servers vanaf de gebruikersmachine verzendt.

Gelukkig is dit vrij eenvoudig (maar niet zo voor de hand liggend) te verhelpen. Ik wil je waarschuwen dat ik de auteur van deze oplossing niet ben. Ik vond het in de discussie, waar een probleem dat vergelijkbaar is met het mijne werd besproken. De oplossing die de gebruiker github tecknojock, voorstelde, hielp me enorm, maar ik ben er zeker van dat het ook anderen kan helpen, daarom besloot ik deze tutorial te schrijven.

Onder de kat wacht een stapsgewijze configuratie van je Webogram-mirror en het configureren van proxyverzoeken naar de Telegram-servers met behulp van nginx.

Als voorbeeld heb ik net een geconfigureerde en bijgewerkte Ubuntu Server 18.04.3 gekozen.

Let op: In deze tutorial worden er geen instructies gegeven over het configureren van een domein in nginx. Dit moet je zelf doen. De tutorial gaat ervan uit dat je al een domein met ssl hebt ingesteld, en dat de server waarvoor de configuratie is bedoeld toegang heeft tot de Telegram-servers (op welke manier dan ook die je verkiest).

Stel dat het IP van deze server 10.23.0.3 is, en de domeinnaam mywebogram.localhost.

Uitgaande van deze voorwaarden, zal ik voorbeelden van configuraties geven. Vergeet niet om waarden om je eigen te vervangen.

Laten we beginnen:

Om Webogram te starten, hebben we nodejs nodig. Standaard, als we het uit de Ubuntu-repositories installeren, krijgen we nodejs versie 8.x. We hebben 12.x nodig:

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

Kies een locatie waar onze Webogram zal worden gehost.

Bijvoorbeeld — laten we het in de hoofdmap van de home-directory plaatsen. Hiervoor klonen we de officiĆ«le repository naar onze server:

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

De volgende stap is om alle afhankelijkheden te installeren die nodig zijn om de applicatie te starten:

cd webogram && npm install

Laten we een teststart uitvoeren. Voer het volgende commando uit:

npm start

Daarna proberen we het in de browser te openen

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

Als je tot dit punt alles correct hebt gedaan, zou de inlogpagina van Webogram moeten openen.

Nu moeten we de applicatie configureren om als service te draaien. Hiervoor maken we een bestand aan

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

open het in een editor naar keuze en geef het de volgende structuur (vervang je eigen pad naar 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

Voer daarna de volgende commando's uit:

Pas de wijzigingen toe

sudo systemctl daemon-reload

Schakel de automatische opstart in:

sudo systemctl enable webogram.service

Start de service:

sudo systemctl start webogram.service

Na deze acties blijft Webogram beschikbaar op poort 8000.

Aangezien we toegang tot onze Webogram via nginx gaan instellen, sluiten we poort 8000 voor externe verzoeken.

Gebruik hiervoor het hulpprogramma udf (of een andere methode die voor jou handig is):

sudo ufw deny 8000

Voor het geval dat je toch besloten hebt om udf te gebruiken, maar het is uitgeschakeld op de server — voegen we nog enkele regels toe (zodat alles niet instort) en schakelen we udf in:

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

Laten we nu de configuratie van nginx aanpassen.

Zoals eerder vermeld — ik neem aan dat je domein al is ingesteld met ssl op je server. Ik wil je er alleen op wijzen dat je het configuratiebestand van het domein moet wijzigen voor een correcte werking:


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

Wat voegen we toe aan de nginx-configuratie:

  • We passen de hoofdlocatie aan die aanvragen naar poort 8000 zal proxy'en, waarop Webogram reageert.
  • We beveiligen de hoofdlocatie met basic-auth. Dit is een puur symbolische stap om onze applicatie te beschermen tegen nieuwsgierige ogen en bots. (En om problemen met blokkeringen te voorkomen.)
  • De vele locaties met proxy_path naar Telegram-servers zijn precies onze eindpunten, waarlangs we onze aanvragen zullen proxy'en.

Laten we ook een bestand aanmaken /etc/nginx/passwd.htpasswd;, zodat nginx een referentie heeft voor de gebruikerswachtwoorden.

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

We zetten onze Webogram-instantie op met proxy via nginx

We herstarten nginx:

sudo systemctl restart nginx

Nu is Webogram alleen toegankelijk via het adres mywebogram.localhost/app/index.html na het invoeren van de gebruikersnaam en het wachtwoord die je hebt ingesteld bij het maken van de htpasswd-opdracht.

Er is nog een beetje werk te doen: we zullen enkele kleine wijzigingen aan het project aanbrengen.

Open het bestand in een editor ~/webogram/app/js/lib/mtproto.js

En pas het begin aan naar het volgende formaat:

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

Daarna moet je de webpagina van de applicatie in de browser verversen.

Open de browserconsole en kijk naar de netwerkverzoeken van de applicatie. Als alles werkt en de XHR-verzoeken naar jouw server gaan, dan is alles correct gedaan en wordt Webogram nu door nginx geproxied.

We zetten onze Webogram-instantie op met proxy via nginx

Ik hoop dat deze tutorial ook nuttig zal zijn voor anderen naast mij.

Hartelijk dank aan iedereen die tot het einde heeft gelezen.

Als iemand problemen heeft of ik heb onnauwkeurigheden gemaakt, beantwoord ik graag jullie vragen en probeer ik te helpen in de reacties of via een privƩbericht.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster