Kami meningkatkan instance Webogram kami dengan proxy melalui nginx

Hei Habr!

Baru-baru ini saya menemukan diri saya dalam situasi di mana saya harus bekerja di dalam jaringan perusahaan dengan akses Internet yang tidak lengkap dan, seperti yang dapat Anda tebak dari judulnya, Telegram diblokir di dalamnya. Saya yakin situasi ini sudah tidak asing lagi bagi banyak orang.

Saya dapat melakukannya tanpa pesan instan, tetapi Telegramlah yang saya perlukan untuk bekerja. Klien tidak dapat diinstal pada mesin kerja, juga tidak mungkin menggunakan laptop pribadi. Solusi lain tampaknya adalah dengan menggunakannya versi web resmi, tapi seperti yang bisa Anda tebak, itu juga tidak tersedia. Saya langsung mencoret opsi mencari mirror tidak resmi (saya harap karena alasan yang jelas).

Untungnya, Webogram adalah proyek sumber terbuka yang kode sumbernya tersedia github penulisnya (Terima kasih banyak padanya!)
Instalasi dan peluncurannya sendiri tidak sulit, namun, dalam kondisi pengoperasian dalam jaringan dengan akses diblokir ke server Telegram, kemungkinan besar Anda akan kecewa daripada berhasil, karena versi web mengirimkan permintaan ke server Telegram dari mesin pengguna.

Untungnya, ini adalah perbaikan yang cukup sederhana (tetapi tidak terlalu jelas). Saya ingin memperingatkan Anda bahwa saya bukan penulis solusi ini. Saya berhasil menemukannya cabang, yang membahas masalah serupa dengan masalah saya. Solusi yang disarankan oleh pengguna github tecknojock, ini banyak membantu saya, namun saya yakin ini dapat membantu orang lain, jadi saya memutuskan untuk menulis tutorial ini.

Di bawah potongan Anda akan menemukan pengaturan langkah demi langkah mirror Webogram Anda dan pengaturan proksi permintaannya ke server Telegram menggunakan nginx.

Sebagai contoh, saya memilih Ubuntu Server 18.04.3 yang baru diinstal dan diperbarui.

peringatan: Tutorial ini tidak akan menyertakan petunjuk cara menyiapkan domain di nginx. Anda perlu melakukan ini sendiri. Tutorial ini mengasumsikan bahwa Anda telah mengonfigurasi domain dengan ssl, dan server itu sendiri yang ingin Anda konfigurasikan memiliki akses ke server Telegram (dengan cara apa pun yang Anda suka)

Misalkan ip server ini adalah 10.23.0.3, dan nama domainnya adalah mywebogram.localhost

Berdasarkan konvensi tersebut, saya akan memberikan contoh konfigurasi. Jangan lupa untuk mengubah nilainya menjadi milik Anda sendiri.

Jadi mari kita mulai:

Untuk menjalankan Webogram, kita membutuhkan nodejs. Secara default, jika kita menginstalnya dari repositori Ubuntu, kita akan mendapatkan nodejs versi 8.x. Kami membutuhkan 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 didasarkan.

Misalnya, letakkan di root direktori home. Untuk melakukan ini, kloning repositori resmi ke server kami:

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

Langkah selanjutnya adalah menginstal semua dependensi yang diperlukan untuk menjalankan aplikasi:

cd webogram && npm install

Mari kita coba uji coba. Jalankan perintah:

npm start

Setelah itu kita coba buka di browser

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

Jika sampai saat ini Anda telah melakukan semuanya dengan benar, halaman otorisasi Webogram akan terbuka.

Sekarang kita perlu mengkonfigurasi aplikasi untuk dijalankan sebagai layanan. Untuk melakukan ini, mari buat file

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

buka di editor mana pun dan berikan tampilan berikut (masukkan jalur 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 kita jalankan perintah berikut:

Menerapkan perubahan

sudo systemctl daemon-reload

Aktifkan autorun:

sudo systemctl enable webogram.service

Mari kita mulai layanannya:

sudo systemctl start webogram.service

Setelah menyelesaikan langkah-langkah tersebut, Webogram akan terus tersedia di port 8000.

Karena kami akan mengatur akses ke Webogram kami melalui nginx, kami akan menutup port 8000 untuk permintaan dari luar.

Kami menggunakan utilitas udf untuk ini (atau metode apa pun yang nyaman bagi Anda):

sudo ufw deny 8000

Jika Anda masih memutuskan untuk menggunakan udf, tetapi dinonaktifkan di server, tambahkan lebih banyak aturan (agar semuanya tidak berantakan) dan aktifkan udf:

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

Selanjutnya mari kita mulai mengubah konfigurasi nginx.

Seperti yang saya peringatkan di atas, diasumsikan bahwa domain dengan SSL sudah dikonfigurasi di server Anda. Saya hanya akan menarik perhatian Anda pada apa yang perlu ditambahkan ke file konfigurasi domain agar berfungsi dengan benar:


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 ke konfigurasi nginx:

  • Kami mengubah lokasi root, yang akan mem-proxy permintaan ke port 8000, yang ditanggapi oleh Webogram
  • Kami menutup lokasi root menggunakan basic-auth. Ini murni langkah simbolis untuk menutup aplikasi kita dari pengintaian dan bot. (Dan juga untuk menghindari masalah pemblokiran)
  • Sekelompok lokasi dengan proxy_path di server Telegram adalah titik akhir kami yang akan kami gunakan untuk mem-proxy permintaan kami

Juga, mari buat file /etc/nginx/passwd.htpasswd;sehingga nginx memiliki sesuatu untuk memeriksa kata sandi pengguna.

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

Kami meningkatkan instance Webogram kami dengan proxy melalui nginx

Mulai ulang nginx:

sudo systemctl restart nginx

Sekarang Webogram hanya akan tersedia di mywebogram.localhost/app/index.html setelah login dan kata sandi yang Anda tentukan saat membuat perintah htpasswd dimasukkan.

Tinggal sedikit lagi: kami akan membuat perubahan kecil pada proyek itu sendiri.

Buka file di editor ~/webogram/app/js/lib/mtproto.js

Dan awal mulanya menjadi 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
      }
...
 

Setelah ini, Anda perlu me-refresh halaman aplikasi di browser.

Buka konsol browser Anda dan lihat permintaan jaringan aplikasi. Jika semuanya berfungsi dan permintaan XHR masuk ke server Anda, maka semuanya dilakukan dengan benar, dan Webogram sekarang diproksi melalui nginx.

Kami meningkatkan instance Webogram kami dengan proxy melalui nginx

Saya harap tutorial ini bermanfaat bagi orang lain selain saya.

Terima kasih banyak kepada semua orang yang membaca sampai akhir.

Jika ada yang mengalami kesulitan atau saya membuat kesalahan, saya akan dengan senang hati menjawab dan mencoba membantu Anda di komentar atau di PM.

Sumber: www.habr.com

Tambah komentar