Webogram nümunəmizi nginx vasitəsilə proksi ilə qaldırırıq

Hey Habr!

Bu yaxınlarda özümü elə bir vəziyyətdə tapdım ki, İnternetə natamam çıxışı olan bir korporativ şəbəkədə işləmək lazım idi və başlıqdan təxmin edə bildiyiniz kimi, Telegram orada bloklandı. Əminəm ki, bu vəziyyət çoxlarına tanışdır.

Mən ani messencerlərsiz edə bilərəm, amma iş üçün lazım olan Telegram idi. Nə müştərini iş maşınına quraşdırmaq, nə də şəxsi noutbukdan istifadə etmək mümkün deyildi. Başqa bir həll yolu istifadə etməkdir rəsmi internet versiyası, lakin təxmin edə bildiyiniz kimi, o da mövcud deyildi. Mən dərhal qeyri-rəsmi güzgü axtarmaq seçimini kənara qoyuram (məlum səbəblərə ümid edirəm).

Xoşbəxtlikdən, Webogram mənbə kodu mövcud olan açıq mənbəli layihədir GitHub onun müəllifi (Bunun üçün ona çox təşəkkür edirəm!)
Quraşdırma və işə salma özü çətin deyil, lakin Telegram serverlərinə girişi bloklanmış bir şəbəkə daxilində işləmə şəraitində, müvəffəqiyyətdən daha çox məyus olacaqsınız, çünki veb versiyası istifadəçinin maşınından Telegram serverlərinə sorğular göndərir.

Xoşbəxtlikdən, bu kifayət qədər sadə (lakin çox açıq olmayan) bir düzəlişdir. Sizi xəbərdar etmək istərdim ki, bu həllin müəllifi mən deyiləm. içində tapmağı bacardım filial, mənim kimi bir problemi müzakirə edən. Github istifadəçisi tərəfindən təklif edilən həll tecknojock, bu mənə çox kömək etdi, lakin əminəm ki, başqasına kömək edə bilər, ona görə də bu təlimatı yazmaq qərarına gəldim.

Kəsimin altında siz Webogram güzgüünüzün addım-addım qurulmasını və nginx istifadə edərək Telegram serverlərinə sorğularının proksiləşdirilməsini tapa bilərsiniz.

Nümunə olaraq mən təzə quraşdırılmış və yenilənmiş Ubuntu Server 18.04.3 seçdim.

Diqqət: Bu təlimatda nginx-də domen qurmaq üzrə təlimatlar yer almayacaq. Bunu özünüz etməlisiniz. Dərslik, artıq ssl ilə bir domen konfiqurasiya etdiyinizi və onu konfiqurasiya etməyi planlaşdırdığınız serverin özünün Telegram serverlərinə (istədiyiniz şəkildə) girişi olduğunu güman edir.

Tutaq ki, bu serverin ip-si 10.23.0.3, domen adı isə mywebogram.localhost-dur.

Bu konvensiyalara əsaslanaraq, konfiqurasiya nümunələri verəcəyəm. Dəyərləri özünüzə dəyişdirməyi unutmayın.

Beləliklə, başlayaq:

Webogram-ı işə salmaq üçün bizə nodejs lazımdır. Varsayılan olaraq, onu Ubuntu repozitoriyalarından quraşdırsaq, nodejs 8.x versiyasını əldə edəcəyik. Bizə 12.x lazımdır:

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

Webogramımızın əsaslanacağı yeri biz seçirik.

Məsələn, onu ev kataloqunun kökünə yerləşdirək. Bunu etmək üçün rəsmi deponu serverimizə klonlayın:

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

Növbəti addım tətbiqi işə salmaq üçün lazım olan bütün asılılıqları quraşdırmaqdır:

cd webogram && npm install

Gəlin bir sınaq keçirməyə çalışaq. Komandanı işə salın:

npm start

Bundan sonra onu brauzerdə açmağa çalışırıq

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

Bu nöqtəyə qədər hər şeyi düzgün etmisinizsə, Webogram icazə səhifəsi açılacaq.

İndi proqramın xidmət kimi işləməsi üçün konfiqurasiya etməliyik. Bunun üçün bir fayl yaradaq

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

onu istənilən redaktorda açın və ona aşağıdakı görünüşü verin (WorkDirectory-ə yolunuzu daxil edin)

[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

Sonra aşağıdakı əmrləri icra edirik:

Dəyişikliklərin tətbiqi

sudo systemctl daemon-reload

Avtomatik işə salın:

sudo systemctl enable webogram.service

Xidmətə başlayaq:

sudo systemctl start webogram.service

Addımları tamamladıqdan sonra Webogram 8000 portunda mövcud olmağa davam edəcək.

Biz nginx vasitəsilə Webogramımıza girişi quracağımız üçün kənardan gələn sorğular üçün 8000 portunu bağlayacağıq.

Bunun üçün udf yardım proqramından istifadə edirik (və ya sizin üçün əlverişli olan hər hansı üsul):

sudo ufw deny 8000

Əgər siz hələ də udf-dən istifadə etmək qərarına gəlsəniz, lakin o, serverdə qeyri-aktivdirsə, daha çox qayda əlavə edin (hər şey dağılmaması üçün) və udf-ni aktivləşdirin:

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

Sonra, nginx konfiqurasiyasını dəyişdirməyə başlayaq.

Yuxarıda xəbərdar etdiyim kimi, ssl ilə domenin serverinizdə artıq konfiqurasiya edildiyi güman edilir. Diqqətinizi yalnız düzgün işləməsi üçün domen konfiqurasiya faylına nə əlavə etmək lazım olduğuna cəlb edəcəm:


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 konfiqurasiyasına nə əlavə edirik:

  • Biz Webogramın cavab verdiyi 8000 portuna proksi sorğular verəcək kök yerini dəyişirik
  • Basic-auth istifadə edərək kök yerini bağlayırıq. Bu, tətbiqimizi yad gözlərdən və botlardan bağlamaq üçün sırf simvolik bir addımdır. (Həmçinin bloklama ilə bağlı problemlərin qarşısını almaq üçün)
  • Telegram serverində proxy_path olan bir çox yer, sorğularımızı proksiləşdirəcəyimiz son nöqtələrimizdir.

Həmçinin, bir fayl yaradaq /etc/nginx/passwd.htpasswd;belə ki, nginx-də istifadəçi parollarını yoxlamaq üçün bir şey var.

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

Webogram nümunəmizi nginx vasitəsilə proksi ilə qaldırırıq

Nginx-i yenidən başladın:

sudo systemctl restart nginx

İndi Webogram yalnız burada mövcud olacaq mywebogram.localhost/app/index.html htpasswd əmrini yaratarkən təyin etdiyiniz login və parol daxil edildikdən sonra.

Çox az qalıb: layihənin özündə kiçik dəyişikliklər edəcəyik.

Faylı redaktorda açın ~/webogram/app/js/lib/mtproto.js

Və başlanğıcını aşağıdakı formaya gətirin:

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

Bundan sonra, brauzerdə tətbiq səhifəsini yeniləməlisiniz.

Brauzer konsolunuzu açın və tətbiqin şəbəkə sorğularına baxın. Hər şey işləyirsə və XHR sorğuları serverinizə gedirsə, hər şey düzgün aparılır və Webogram indi nginx vasitəsilə proksilənir.

Webogram nümunəmizi nginx vasitəsilə proksi ilə qaldırırıq

Ümid edirəm ki, bu dərslik məndən başqa kimsə üçün faydalı olacaq.

Sona qədər oxuyan hər kəsə çox sağ olun.

Kiminsə çətinliyi varsa və ya hər hansı bir qeyri-dəqiqlik etmişəmsə, şərhlərdə və ya PM-də məmnuniyyətlə cavablandıracam və sizə kömək etməyə çalışacağam.

Mənbə: www.habr.com

Добавить комментарий