Ние го подигаме нашиот пример на Webogram со прокси преку nginx

Еј Хабр!

Неодамна се најдов во ситуација во која беше неопходно да се работи во корпоративна мрежа со нецелосен пристап до Интернет и, како што може да се погоди од насловот, Телеграма беше блокирана во неа. Сигурен сум дека оваа ситуација им е позната на многумина.

Можам без инстант-месинџери, но Telegram беше она што ми требаше за работа. Не беше можно да се инсталира клиентот на работна машина, ниту пак да се користи личен лаптоп. Се чини дека друго решение е да го користите официјална веб верзија, но како што можете да претпоставите и тој беше недостапен. Веднаш ја пречкртам опцијата за барање неофицијално огледало (се надевам од очигледни причини).

За среќа, Webogram е проект со отворен код чиј изворен код е достапен во github неговиот автор (За што му благодарам многу!)
Самата инсталација и лансирање не е тешко, меѓутоа, во услови на работа во мрежа со блокиран пристап до серверите на Telegram, поголема е веројатноста да бидете разочарани отколку успешно, бидејќи веб-верзијата испраќа барања до серверите на Telegram од машината на корисникот.

За среќа, ова е прилично едноставна (но не многу очигледна) поправка. Би сакал да ве предупредам дека не сум јас авторот на ова решение. Успеав да го најдам во гранка, кој разговараше за проблем сличен на мојот. Решението предложено од корисникот на github текноџок, многу ми помогна, сепак, сигурен сум дека може да помогне и на некој друг, па решив да го напишам овој туторијал.

Под сечењето ќе најдете чекор-по-чекор поставување на вашиот огледало на Webogram и поставување на прокси на неговите барања до серверите на Telegram користејќи nginx.

Како пример, избрав новоинсталиран и ажуриран Ubuntu Сервер 18.04.3.

Предупредување: Овој туторијал нема да вклучува инструкции за поставување домен во nginx. Треба да го направите ова сами. Упатството претпоставува дека веќе сте конфигурирале домен со ssl и дека самиот сервер на кој планирате да го конфигурирате има пристап до серверите на Telegram (на кој било начин што сакате)

Да претпоставиме дека IP адресата на овој сервер е 10.23.0.3, а името на доменот е mywebogram.localhost

Врз основа на овие конвенции, ќе дадам примери на конфигурации. Не заборавајте да ги промените вредностите на свои.

Значи, да започнеме:

За да го стартуваме Webogram, ни треба nodejs. Стандардно, ако го инсталирате од репозиториумите Ubuntu — ќе го добиеме nodejs верзија 8.x. Ни треба 12.x:

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

Ние го избираме местото каде што ќе се базира нашиот Вебограм.

На пример, да го поставиме во коренот на домашниот директориум. За да го направите ова, клонирајте го официјалното складиште на нашиот сервер:

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

Следниот чекор е да ги инсталирате сите зависности потребни за извршување на апликацијата:

cd webogram && npm install

Ајде да пробаме тест. Извршете ја командата:

npm start

После тоа, се обидуваме да го отвориме во прелистувачот

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

Ако до овој момент сте направиле сè правилно, ќе се отвори страницата за авторизација на Webogram.

Сега треба да ја конфигурираме апликацијата да работи како услуга. За да го направите ова, ајде да создадеме датотека

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

отворете го во кој било уредник и дајте му го следниот изглед (внесете ја вашата патека до 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

Потоа ги извршуваме следните команди:

Примена на промените

sudo systemctl daemon-reload

Овозможи автоматско вклучување:

sudo systemctl enable webogram.service

Да ја започнеме услугата:

sudo systemctl start webogram.service

По завршувањето на чекорите, Webogram ќе продолжи да биде достапен на портата 8000.

Бидејќи ќе поставуваме пристап до нашиот вебограм преку nginx, ќе ја затвориме портата 8000 за барања однадвор.

Ние ја користиме алатката udf за ова (или кој било метод погоден за вас):

sudo ufw deny 8000

Во случај да одлучите да користите udf, но тој е оневозможен на серверот, додадете повеќе правила (за да не се распадне сè) и овозможете udf:

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

Следно, да почнеме да ја менуваме конфигурацијата на nginx.

Како што предупредив погоре, се претпоставува дека доменот со ssl е веќе конфигуриран на вашиот сервер. Ќе ви го свртам вниманието само на она што ќе треба да се додаде во датотеката за конфигурација на доменот за таа да работи правилно:


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

Што додаваме во конфигурацијата nginx:

  • Ја менуваме локацијата на root, која ќе ги пренасочува барањата до портата 8000, на која Вебограм одговара
  • Ја затвораме локацијата на root со користење на basic-auth. Ова е чисто симболичен чекор за затворање на нашата апликација од љубопитните очи и ботови. (И, исто така, за да се избегнат проблеми со блокирање)
  • Еден куп локации со proxy_path на серверот Telegram се токму нашите крајни точки преку кои ќе ги застапуваме нашите барања

Исто така, ајде да создадеме датотека /etc/nginx/passwd.htpasswd;така што nginx има со што да ги проверува корисничките лозинки.

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

Ние го подигаме нашиот пример на Webogram со прокси преку nginx

Рестартирајте го nginx:

sudo systemctl restart nginx

Сега Webogram ќе биде достапен само на mywebogram.localhost/app/index.html откако ќе се внесат најавувањето и лозинката што сте ги дефинирале при креирањето на командата htpasswd.

Останува малку: ќе направиме мали измени на самиот проект.

Отворете ја датотеката во уредувач ~/webogram/app/js/lib/mtproto.js

И доведете го неговиот почеток во следната форма:

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

По ова, треба да ја освежите страницата на апликацијата во прелистувачот.

Отворете ја конзолата на прелистувачот и погледнете ги мрежните барања на апликацијата. Ако сè работи и барањата за XHR одат на вашиот сервер, тогаш сè е направено правилно, а Webogram сега е проксиран преку nginx.

Ние го подигаме нашиот пример на Webogram со прокси преку nginx

Се надевам дека ова упатство ќе биде корисно за некој друг освен мене.

Голема благодарност до сите што прочитаа до крај.

Доколку некој има некакви потешкотии или сум направил некакви неточности, со задоволство ќе одговорам и ќе се обидам да ви помогнам во коментари или во PM.

Извор: www.habr.com

Купете доверлив хостинг за сајтови со DDoS заштита, VPS VDS сервери 🔥 Купете сигурен веб-хостинг со DDoS заштита, VPS VDS сервери | ProHoster