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
Nasib baik, Webogram ialah projek sumber terbuka yang kod sumbernya tersedia
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
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
Mulakan semula nginx:
sudo systemctl restart nginx
Kini Webogram hanya akan tersedia di
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.
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