Naikkan instance Webogram Anda dengan proxy melalui nginx

Halo, Habr!

Saya baru-baru ini masuk ke sebuah situasi di mana perlu untuk bekerja di dalam jaringan perusahaan dengan akses tidak lengkap ke Internet dan, seperti yang dapat Anda tebak dari berita utama, Telegram diblokir di dalamnya. Saya yakin bahwa situasi ini akrab bagi banyak orang.

Saya dapat melakukannya tanpa pengirim pesan, namun Telegram yang saya butuhkan untuk bekerja. Tidak mungkin menginstal klien pada mesin yang berfungsi, atau menggunakan laptop pribadi. Solusi lain tampaknya menggunakan versi web resminya , tetapi seperti yang dapat Anda duga, itu juga tidak tersedia. Saya segera menghapus opsi dengan mencari cermin tidak resmi (saya berharap untuk alasan yang jelas).

Untungnya, Webogram adalah proyek sumber terbuka, kode sumbernya tersedia di githubpenulisnya (Untuk yang
banyak terima kasih padanya!) Instalasi dan peluncuran itu sendiri bukan masalah besar, namun, dalam kondisi operasi di dalam jaringan dengan akses diblokir ke server Telegram, Anda kemungkinan besar akan kecewa daripada berhasil, karena versi web mengirimkan permintaan untuk Server Telegram dari mesin pengguna.

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

Di bawah kucing Anda akan menemukan konfigurasi langkah-demi-langkah dari cermin Webogram Anda dan pengaturan proxy permintaannya ke server Telegram menggunakan nginx.

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

Catatan: Dalam tutorial ini tidak akan ada instruksi untuk mengatur domain di nginx. Ini harus dilakukan secara mandiri. Tutorial mengasumsikan bahwa Anda telah mengkonfigurasi domain dengan ssl, serta server tempat Anda berencana untuk mengonfigurasi, memiliki akses ke server Telegram (dengan cara apa pun yang Anda suka)

Asumsikan bahwa ip server ini adalah 10.23.0.3, dan nama domain adalah mywebogram. localhost

Berdasarkan konvensi ini, saya akan memberikan contoh konfigurasi. Jangan lupa untuk mengubah nilainya sendiri.

Jadi di

sini kita mulai : Untuk menjalankan Webogram, kita perlu nodejs. Secara default, jika Anda menginstalnya dari repositori Ubuntu, kami 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 berbasis.

Sebagai contoh - kita akan meletakkannya di root direktori home. Untuk melakukan ini, kami mengkloning 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 menjalankan uji coba. Jalankan perintah:

npm start

Setelah itu, kami coba buka di browser

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

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

Sekarang kita perlu mengkonfigurasi peluncuran aplikasi sebagai layanan. Untuk melakukan ini, buat file

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

buka di editor apa saja 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 kami menjalankan perintah berikut:

Menerapkan perubahan

sudo systemctl daemon-reload

Aktifkan mulai otomatis:

sudo systemctl enable webogram.service

Kami memulai layanan:

sudo systemctl start webogram.service

Setelah langkah-langkah telah diambil, Webogram akan terus tersedia di port 8000.

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

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

sudo ufw deny 8000

Jika Anda masih memutuskan untuk menggunakan udf, tetapi dimatikan pada server - tambahkan lebih banyak aturan (sehingga semuanya tidak berantakan) dan nyalakan udf:

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

Selanjutnya, mari kita ubah konfigurasi nginx.

Seperti yang saya peringatkan di atas - diasumsikan bahwa domain dengan ssl sudah dikonfigurasi di server Anda. Saya akan menarik perhatian Anda hanya pada fakta bahwa perlu menambahkan file konfigurasi domain untuk operasi yang 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
  • Tutup lokasi root dengan autentik-dasar. Ini adalah langkah simbolis murni untuk menutup aplikasi kita dari mencongkel mata dan bot. (Dan juga bahwa tidak ada masalah dengan kunci)
  • Lokasi tumpukan dengan proxy_path di server Telegram hanyalah titik akhir kami di mana kami akan mem-proxy permintaan kami

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

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

gambar

Mulai ulang nginx:

sudo systemctl restart nginx

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

Hanya ada sedikit yang tersisa: buat perubahan kecil pada proyek itu sendiri.

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

dan bawa awal ke bentuk berikut:

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

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

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



Saya harap tutorial ini bermanfaat bagi orang lain selain saya.

Terima kasih banyak untuk semua orang yang membaca sampai akhir.

Jika seseorang memiliki kesulitan atau saya membuat beberapa ketidakakuratan - saya akan dengan senang hati menjawab dan mencoba membantu Anda dalam komentar atau PM.

Source: https://habr.com/ru/post/undefined/


All Articles