Біз Webogram данасын nginx арқылы прокси арқылы көтереміз

Эй Хабр!

Жақында мен Интернетке толық қол жетімділігі жоқ корпоративтік желіде жұмыс істеуге тура келетін жағдайға тап болдым және тақырыптан болжауға болатындай, онда Telegram бұғатталған. Бұл жағдай көпшілікке таныс екеніне сенімдімін.

Мен мессенджерлерсіз істей аламын, бірақ маған жұмыс үшін Telegram керек болды. Клиентті жұмыс машинасына орнату мүмкін болмады, жеке ноутбукты пайдалану мүмкін болмады. Басқа шешім оны пайдалану сияқты ресми веб-нұсқасы, бірақ сіз болжап отырғандай, ол да қолжетімсіз болды. Мен бейресми айнаны іздеу опциясын дереу сызып тастадым (анық себептерге үміттенемін).

Бақытымызға орай, Webogram - бастапқы коды қолжетімді ашық бастапқы жоба GitHub оның авторы (Оған көп рахмет!)
Орнату мен іске қосудың өзі қиын емес, бірақ Telegram серверлеріне кіруге тыйым салынған желіде жұмыс істеу жағдайында сіз сәтті емес, көңіліңізден шықпай қалуыңыз мүмкін, өйткені веб-нұсқа Telegram серверлеріне пайдаланушының машинасынан сұраулар жібереді.

Бақытымызға орай, бұл өте қарапайым (бірақ өте айқын емес) түзету. Мен бұл шешімнің авторы емес екенімді ескерткім келеді. Мен оны таба алдым филиал, ол менікіне ұқсас мәселені талқылады. Github пайдаланушысы ұсынған шешім текножок, бұл маған көп көмектесті, дегенмен оның басқа біреуге көмектесетініне сенімдімін, сондықтан мен осы оқулықты жазуды шештім.

Төменде сіз Webogram айнасының кезең-кезеңімен орнатуын және nginx арқылы Telegram серверлеріне оның сұрауларын прокси-серверді орнатуды таба аласыз.

Мысал ретінде мен жаңадан орнатылған және жаңартылған 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

Біз Webogram негізі болатын орынды таңдаймыз.

Мысалы, оны үй каталогының түбіріне орналастырайық. Ол үшін ресми репозиторийді серверге клондаңыз:

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 арқылы Webogram-ға кіруді орнататындықтан, сырттан келетін сұраулар үшін 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 конфигурациясына не қосамыз:

  • Біз түбірлік орынды өзгертеміз, ол Webogram жауап беретін 8000 портына прокси сұрауларын жібереді
  • Негізгі-auth арқылы түбірлік орынды жабамыз. Бұл біздің қолданбаны бейтаныс көздерден және боттардан жабуға арналған таза символдық қадам. (Сонымен қатар бұғаттау проблемаларын болдырмау үшін)
  • Telegram серверіндегі proxy_path бар көптеген орындар біздің сұрауларымызды прокси арқылы жіберетін соңғы нүктелеріміз болып табылады.

Сонымен қатар, файлды жасайық /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 <[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
      }
...
 

Осыдан кейін браузердегі қолданба бетін жаңарту керек.

Браузер консолін ашып, қолданбаның желілік сұрауларын қараңыз. Егер бәрі жұмыс істеп тұрса және XHR сұраулары сіздің серверіңізге өтсе, онда бәрі дұрыс орындалды және Webogram енді nginx арқылы проксиге қосылған.

Біз Webogram данасын nginx арқылы прокси арқылы көтереміз

Бұл оқу құралы менен басқа біреуге пайдалы болады деп үміттенемін.

Соңына дейін оқығандарға көп рахмет.

Егер біреуде қандай да бір қиындықтар болса немесе мен қандай да бір қателіктер жіберген болсам, мен сізге жауап беруге және түсініктемелерде немесе PM-де көмектесуге тырысамын.

Ақпарат көзі: www.habr.com

пікір қалдыру