Salam, Habr!
Son dövrlərdə tam internetə çıxışı olmayan bir korporativ şəbəkədə işləməyə məcbur oldum və başlıqdan da anlayacağınız kimi - Telegram burada bloklanmışdı. Bu vəziyyətin bir çoxuna tanış olduğunu düşünürəm.
Mən tamamilə mesajlaşma tətbiqlərindən uzaq qala bilərəm, amma iş üçün Telegram-a ehtiyacım var idi. İş yerində müştəri quraşdırmaq mümkün deyildi, şəxsi noutbukdan istifadə də olmazdı. Başqa bir çözüm olaraq bunu istifadə etməyi düşündüm , amma bildiyiniz kimi - o da əlçatmaz idi. Qeyri-rəsmi bir ayna tapmaq variantını dərhal istisna etdim (baxmayaraq ki, bunun səbəbləri aydındır).
Şükürlər olsun ki, Webogram - açıq mənbə proyektidir, onun mənbə kodu onun müəllifindədir (buna görə ona böyük təşəkkürlər)
Quraşdırma və işə salma özü mürəkkəb deyil, amma Telegram serverlərinə girişin bloklandığı bir şəbəkədə istifadə edərkən, uğurdan daha çox məyus olacaqsınız, çünki web versiya istifadəçinin maşınından Telegram serverlərinə sorğular göndərir.
Neyse ki, bunu düzəltmək olduqca asandır (amma çox aydın deyil). Xatırlatmaq istəyirəm ki, mən bu həllin müəllifi deyiləm. Bu həlli bir başlıqda tapdım, burada mənim problemimlə oxşar bir problem müzakirə olunurdu. Github istifadəçisi tərəfindən təklif olunan həll mənə çox kömək etdi, amma əminəm ki, bu başqalarına da kömək edə bilər, ona görə də bu təlimatı yazmağa qərar verdim.
Aşağıda sizə Webogram aynanızı yaratmağı və nginx istifadə edərək onun Telegram serverlərinə göndərilən sorğularını proxylamağı addım-addım göstərəcəm.
Nümunə olaraq, yeni quraşdırılmış və yenilənmiş Ubuntu Server 18.04.3-ü seçdim.
Diqqət: Bu təlimat daxilində nginx-də domeni quraşdırmaq barədə göstərişlər olmayacaq. Bunu özünüz etməlisiniz. Təlimat, artıq SSL ilə quraşdırılmış bir domeninizin olduğunu və serverin Telegram serverlərinə (istədiyiniz şəkildə) çıxışı olduğunu gözləyir.
Deyək ki, bu serverin IP-si 10.23.0.3, domen adı isə mywebogram.localhost-dur
Bu şərtlərə əsaslanaraq, konfiqurasiya nümunələrini təqdim edəcəyəm. Dəyərləri özünüzə uyğun olaraq dəyişdirməyi unutmayın.
Beləliklə, başlayırıq:
Webogram-ı başlatmaq üçün, nodejs-ə ehtiyacımız var. Ubuntu-nun reposlarından qurduqda, standart olaraq 8.x versiyasını alacağıq. 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 nodejsWebogram-ımızın yerləşəcəyi yeri seçirik.
Nümunə üçün - onu ev direktoryasında yerləşdirəcəyik. Bunun üçün rəsmi repozitoriyanı serverimizə klonlayırıq:
cd ~ && git clone https://github.com/zhukov/webogram.gitNövbəti addım, tətbiqi işə salmaq üçün lazım olan bütün asılılıqları qurmaqdır:
cd webogram && npm installGəlin test işini həyata keçirək. Aşağıdakı əmri icra edin:
npm startBundan sonra brauzerdə açmağa çalışırıq.
http://10.23.0.3:8000/app/index.htmlBu vaxta qədər hər şeyi düzgün etmişsinizsə — Webogram giriş səhifəniz açılacaq.
İndi tətbiqin xidmət olaraq işə salınmasını qurmalıyıq. Bunun üçün bir fayl yaradaq:
sudo touch /lib/systemd/system/webogram.serviceHər hansı bir redaktorda açırıq və aşağıdakı kimi görünməsini təmin edirik (WorkDirectory-yə öz 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
Bundan sonra aşağıdakı əmrləri icra edirik:
Dəyişiklikləri tətbiq edirik.
sudo systemctl daemon-reloadAvtomatik işə salmağı aktiv edirik:
sudo systemctl enable webogram.serviceXidməti işə salırıq:
sudo systemctl start webogram.serviceİcra edilmiş əmrlərdən sonra Webogram 8000 portunda mövcud olacaq.
Webogram-a nginx vasitəsilə girişləri quracağıq — buna görə 8000 portunu xarici sorğular üçün bağlayacağıq.
Bunun üçün udf alətindən (və ya sizə uyğun olan hər hansı bir üsuldan) istifadə edirik:
sudo ufw deny 8000Udf istifadə etməyə qərar vermişsinizsə, amma serverdə deaktivdirsə — əlavə qaydalar əlavə edirik (həmişə tüklənməsinin qarşısını almaq üçün) və udf-nı aktiv edirik:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableİndi nginx konfiqurasiyasını dəyişdirək.
Yuxarıda da qeyd etdiyim kimi — serverinizdə artıq ssl ilə domenin qurulduğu güman edilir. Sizə yalnız xəbərdarlıq etmək istərdim ki, düzgün işləməsi üçün domen konfiqurasiya faylına əlavə etməli olacaqsınız:
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 konfiqurasiya faylında əlavə etdiyimiz şey:
- Webogram-a cavab verən 8000 portuna sorğuları yönləndirəcək kök location-i dəyişdiririk.
- Root location is protected with basic-auth. This is merely a symbolic step to shield our application from prying eyes and bots. (And to avoid issues with blocks as well)
- Many locations with proxy_path to Telegram servers are precisely our endpoints through which we will proxy our requests
Additionally, we will create a file /etc/nginx/passwd.htpasswd;, so that nginx has something to verify user passwords against.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
We restart nginx:
sudo systemctl restart nginxNow Webogram will be accessible only at the address after entering the username and password that you set when creating the htpasswd command.
Just a bit left: let’s make a few adjustments to the project itself.
Open the file in an editor ~/webogram/app/js/lib/mtproto.js
And adjust its beginning to the following format:
/*!
* 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
}
...
After that, you need to refresh the application page in your browser.
Open the browser console and check the network requests of the application. If everything works, and XHR requests are going to your server — it means everything has been set up correctly, and Webogram is now being proxied through nginx.

I hope this tutorial will be helpful to someone besides me.
Thank you very much to everyone who read to the end.
If anyone has difficulties or if I made any inaccuracies — I will gladly answer and try to help you in the comments or via direct message.
Mənbə: habr.com
