Vi hæver vores Webogram-instans med proxying via nginx

Hej Habr!

For nylig befandt jeg mig i en situation, hvor det var nødvendigt at arbejde i et virksomhedsnetværk med ufuldstændig adgang til internettet, og som du kan gætte fra titlen, blev Telegram blokeret i det. Jeg er sikker på, at denne situation er kendt for mange.

Jeg kan undvære instant messengers, men det var Telegram, jeg havde brug for til arbejdet. Det var ikke muligt at installere klienten på en arbejdsmaskine, og det var heller ikke muligt at bruge en personlig bærbar computer. En anden løsning ser ud til at være at bruge den officiel webversion, men som du kan gætte, var den også utilgængelig. Jeg krydser straks muligheden for at søge efter et uofficielt spejl over (håber jeg af indlysende årsager).

Heldigvis er Webogram et open source-projekt, hvis kildekode er tilgængelig i github dens forfatter (hvilket mange tak til ham!)
Selve installationen og lanceringen er ikke vanskelig, men under driftsforhold inden for et netværk med blokeret adgang til Telegram-servere vil du være mere tilbøjelig til at blive skuffet end vellykket, da webversionen sender anmodninger til Telegram-servere fra brugerens maskine.

Heldigvis er dette en ret simpel (men ikke særlig indlysende) løsning. Jeg vil gerne advare dig om, at jeg ikke er forfatteren til denne løsning. Det lykkedes mig at finde den afdeling, som diskuterede et problem svarende til mit. Løsning foreslået af github-bruger tecknojock, det hjalp mig meget, men jeg er sikker på, at det kan hjælpe en anden, så jeg besluttede at skrive denne tutorial.

Under klippet finder du trin-for-trin opsætning af dit Webogram-spejl og opsætning af proxy-forespørgsler til Telegram-servere ved hjælp af nginx.

Som et eksempel valgte jeg en nyinstalleret og opdateret Ubuntu Server 18.04.3.

Advarsel: Denne vejledning indeholder ikke instruktioner om opsætning af et domæne i nginx. Du skal selv gøre dette. Selvstudiet forudsætter, at du allerede har konfigureret et domæne med ssl, og at selve serveren, som du planlægger at konfigurere den på, har adgang til Telegram-serverne (på hvilken som helst måde du vil)

Lad os antage, at denne servers ip er 10.23.0.3, og domænenavnet er mywebogram.localhost

Med udgangspunkt i disse konventioner vil jeg give eksempler på konfigurationer. Glem ikke at ændre værdierne til dine egne.

Så lad os komme i gang:

For at køre Webogram har vi brug for nodejs. Som standard, hvis vi installerer det fra Ubuntu-lagrene, får vi nodejs version 8.x. Vi skal bruge 12.x:

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

Vi vælger det sted, hvor vores webogram vil være baseret.

Lad os f.eks. placere det i roden af ​​hjemmemappen. For at gøre dette skal du klone det officielle lager til vores server:

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

Det næste trin er at installere alle de afhængigheder, der kræves for at køre programmet:

cd webogram && npm install

Lad os prøve en testkørsel. Kør kommandoen:

npm start

Derefter forsøger vi at åbne den i browseren

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

Hvis du indtil dette tidspunkt har gjort alt korrekt, åbnes Webogram-autorisationssiden.

Nu skal vi konfigurere applikationen til at køre som en tjeneste. For at gøre dette, lad os oprette en fil

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

åbn den i en hvilken som helst editor og giv den følgende udseende (indtast din sti til 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

Derefter kører vi følgende kommandoer:

Anvendelse af ændringerne

sudo systemctl daemon-reload

Aktiver autorun:

sudo systemctl enable webogram.service

Lad os starte tjenesten:

sudo systemctl start webogram.service

Efter at have gennemført trinene, vil Webogram fortsat være tilgængelig på port 8000.

Da vi vil konfigurere adgang til vores webogram via nginx, lukker vi port 8000 for anmodninger udefra.

Vi bruger udf-værktøjet til dette (eller en hvilken som helst metode, der er praktisk for dig):

sudo ufw deny 8000

Hvis du stadig beslutter dig for at bruge udf, men det er deaktiveret på serveren, skal du tilføje flere regler (så alt ikke falder fra hinanden) og aktivere udf:

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

Lad os derefter begynde at ændre nginx-konfigurationen.

Som jeg advarede ovenfor, antages det, at et domæne med ssl allerede er konfigureret på din server. Jeg vil kun henlede din opmærksomhed på, hvad der skal tilføjes til domænekonfigurationsfilen, for at den fungerer 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;
  }
}

Hvad vi tilføjer til nginx-konfigurationen:

  • Vi ændrer rodplaceringen, som vil proxy-anmodninger til port 8000, som Webogram svarer på
  • Vi lukker rodplaceringen ved hjælp af basic-auth. Dette er et rent symbolsk skridt til at lukke vores applikation fra nysgerrige øjne og bots. (Og også for at undgå problemer med blokering)
  • En masse lokationer med proxy_path på Telegram-serveren er præcis vores endepunkter, hvorigennem vi vil proxy for vores anmodninger

Lad os også oprette en fil /etc/nginx/passwd.htpasswd;så nginx har noget at tjekke brugeradgangskoder med.

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

Vi hæver vores Webogram-instans med proxying via nginx

Genstart nginx:

sudo systemctl restart nginx

Nu vil Webogram kun være tilgængeligt kl mywebogram.localhost/app/index.html efter login og adgangskode, som du definerede, da du oprettede kommandoen htpasswd, er indtastet.

Der er lidt tilbage: vi vil lave små ændringer i selve projektet.

Åbn filen i en editor ~/webogram/app/js/lib/mtproto.js

Og bring dens begyndelse til følgende 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
      }
...
 

Herefter skal du opdatere applikationssiden i browseren.

Åbn din browserkonsol og se på applikationens netværksanmodninger. Hvis alt fungerer, og XHR-anmodninger går til din server, så er alt gjort korrekt, og Webogram er nu proxy via nginx.

Vi hæver vores Webogram-instans med proxying via nginx

Jeg håber, at denne tutorial vil være nyttig for en anden end mig.

Tusind tak til alle, der læste til slutningen.

Hvis nogen har problemer, eller jeg har lavet nogle unøjagtigheder, vil jeg med glæde svare og forsøge at hjælpe dig i kommentarerne eller i PM.

Kilde: www.habr.com

Tilføj en kommentar