Kami menaikkan contoh Webogram kami dengan proksi melalui nginx

Hai Habr!

Baru-baru ini saya mendapati diri saya berada dalam situasi di mana ia perlu bekerja di dalam rangkaian korporat dengan akses yang tidak lengkap ke Internet dan, seperti yang anda boleh meneka dari tajuknya, Telegram telah disekat di dalamnya. Saya pasti bahawa keadaan ini biasa kepada ramai.

Saya boleh melakukannya tanpa mesej segera, tetapi Telegram yang saya perlukan untuk bekerja. Ia tidak mungkin untuk memasang klien pada mesin kerja, dan tidak mungkin menggunakan komputer riba peribadi. Penyelesaian lain nampaknya adalah menggunakannya versi web rasmi, tetapi seperti yang anda boleh meneka, ia juga tidak tersedia. Saya segera memotong pilihan untuk mencari cermin tidak rasmi (saya harap atas sebab yang jelas).

Nasib baik, Webogram ialah projek sumber terbuka yang kod sumbernya tersedia github pengarangnya (yang mengucapkan ribuan terima kasih kepadanya!)
Pemasangan dan pelancaran itu sendiri tidak sukar, bagaimanapun, dalam keadaan operasi dalam rangkaian dengan akses yang disekat ke pelayan Telegram, anda akan lebih berkemungkinan kecewa daripada berjaya, kerana versi web menghantar permintaan ke pelayan Telegram dari mesin pengguna.

Nasib baik, ini adalah pembetulan yang agak mudah (tetapi tidak begitu jelas). Saya ingin memberi amaran kepada anda bahawa saya bukan pengarang penyelesaian ini. Saya berjaya menjumpainya cawangan, yang membincangkan masalah yang serupa dengan saya. Penyelesaian yang dicadangkan oleh pengguna github tecknojock, ia banyak membantu saya, namun, saya yakin ia boleh membantu orang lain, jadi saya memutuskan untuk menulis tutorial ini.

Di bawah potongan anda akan menemui persediaan langkah demi langkah cermin Webogram anda dan persediaan proksi permintaannya kepada pelayan Telegram menggunakan nginx.

Sebagai contoh, saya memilih Pelayan Ubuntu 18.04.3 yang baru dipasang dan dikemas kini.

Amaran: Tutorial ini tidak akan mengandungi arahan tentang menyediakan domain dalam nginx. Anda perlu melakukan ini sendiri. Tutorial mengandaikan bahawa anda telah mengkonfigurasi domain dengan ssl, dan pelayan itu sendiri yang anda bercadang untuk mengkonfigurasinya mempunyai akses kepada pelayan Telegram (dalam apa jua cara yang anda suka)

Mari kita andaikan bahawa ip pelayan ini ialah 10.23.0.3 dan nama domain ialah mywebogram.localhost

Berdasarkan konvensyen ini, saya akan memberikan contoh konfigurasi. Jangan lupa untuk menukar nilai kepada anda sendiri.

Jadi mari kita mulakan:

Untuk menjalankan Webogram, kita memerlukan nodejs. Secara lalai, jika kami memasangnya daripada repositori Ubuntu, kami akan mendapat nodejs versi 8.x. Kami memerlukan 12.x:

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

Kami memilih tempat di mana Webogram kami akan berasaskan.

Sebagai contoh, mari letakkannya dalam akar direktori rumah. Untuk melakukan ini, klon repositori rasmi ke pelayan kami:

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

Langkah seterusnya ialah memasang semua kebergantungan yang diperlukan untuk menjalankan aplikasi:

cd webogram && npm install

Mari cuba larian ujian. Jalankan arahan:

npm start

Selepas itu, kami cuba membukanya dalam penyemak imbas

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

Jika sehingga tahap ini anda telah melakukan semuanya dengan betul, halaman kebenaran Webogram akan dibuka.

Sekarang kita perlu mengkonfigurasi aplikasi untuk dijalankan sebagai perkhidmatan. Untuk melakukan ini, mari buat fail

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

bukanya dalam mana-mana editor dan berikan penampilan berikut (masukkan laluan anda ke 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

Kemudian kami menjalankan arahan berikut:

Mengaplikasikan perubahan

sudo systemctl daemon-reload

Dayakan autorun:

sudo systemctl enable webogram.service

Mari mulakan perkhidmatan:

sudo systemctl start webogram.service

Selepas melengkapkan langkah, Webogram akan terus tersedia pada port 8000.

Memandangkan kami akan menyediakan akses kepada Webogram kami melalui nginx, kami akan menutup port 8000 untuk permintaan dari luar.

Kami menggunakan utiliti udf untuk ini (atau mana-mana kaedah yang sesuai untuk anda):

sudo ufw deny 8000

Sekiranya anda masih memutuskan untuk menggunakan udf, tetapi ia dilumpuhkan pada pelayan, tambahkan lebih banyak peraturan (supaya semuanya tidak berantakan) dan dayakan udf:

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

Seterusnya, mari kita mula menukar konfigurasi nginx.

Seperti yang saya amaran di atas, diandaikan bahawa domain dengan ssl sudah dikonfigurasikan pada pelayan anda. Saya hanya akan menarik perhatian anda kepada perkara yang perlu ditambahkan pada fail konfigurasi domain agar ia berfungsi dengan betul:


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

Apa yang kami tambahkan pada konfigurasi nginx:

  • Kami menukar lokasi akar, yang akan meminta proksi ke port 8000, yang Webogram bertindak balas
  • Kami menutup lokasi akar menggunakan asas-auth. Ini adalah langkah simbolik semata-mata untuk menutup aplikasi kami daripada mengintip dan bot. (Dan juga untuk mengelakkan masalah dengan menyekat)
  • Sekumpulan lokasi dengan proxy_path pada pelayan Telegram adalah titik akhir kami yang melaluinya kami akan memproksi permintaan kami

Juga, mari buat fail /etc/nginx/passwd.htpasswd;supaya nginx mempunyai sesuatu untuk menyemak kata laluan pengguna.

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

Kami menaikkan contoh Webogram kami dengan proksi melalui nginx

Mulakan semula nginx:

sudo systemctl restart nginx

Kini Webogram hanya akan tersedia di mywebogram.localhost/app/index.html selepas log masuk dan kata laluan yang anda tentukan semasa membuat arahan htpasswd dimasukkan.

Terdapat sedikit yang tinggal: kami akan membuat perubahan kecil pada projek itu sendiri.

Buka fail dalam editor ~/webogram/app/js/lib/mtproto.js

Dan bawa permulaannya kepada bentuk berikut:

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

Selepas ini, anda perlu memuat semula halaman aplikasi dalam penyemak imbas.

Buka konsol penyemak imbas anda dan lihat permintaan rangkaian aplikasi. Jika semuanya berfungsi dan permintaan XHR pergi ke pelayan anda, maka semuanya dilakukan dengan betul, dan Webogram kini diproksikan melalui nginx.

Kami menaikkan contoh Webogram kami dengan proksi melalui nginx

Saya harap tutorial ini akan berguna kepada orang lain selain saya.

Jutaan terima kasih kepada semua yang membaca hingga habis.

Jika ada yang mengalami kesulitan atau saya membuat sebarang ketidaktepatan, saya dengan senang hati akan menjawab dan cuba membantu anda di komen atau di PM.

Sumber: www.habr.com

Tambah komen