Salut, Habr!
Recent am ajuns într-o situație în care a fost necesar să lucrez în rețeaua corporativă cu acces limitat la internet și, așa cum puteți ghici din titlu, Telegram a fost blocat. Sunt sigur că această situație este cunoscută multora.
Pot să mă descurc fără mesagerii, însă exact Telegram îmi era necesar pentru muncă. Instalarea clientului pe mașina de lucru nu era posibilă, iar utilizarea laptopului personal - de asemenea. O altă soluție ar fi să folosesc , dar, așa cum puteți bănui, aceasta a fost de asemenea inaccesibilă. Opțiunea de a căuta o oglindă neoficială o exclud imediat (sper că din motive evident întemeiate).
Din fericire, Webogram este un proiect open-source, codul sursă fiind disponibil în proiectul său (Îi mulțumesc foarte mult!).
Instalarea și lansarea nu sunt complicate, însă, în condiții de utilizare în interiorul unei rețele cu acces blocat la serverele Telegram, mai degrabă o să aveți parte de o dezamăgire decât de succes, deoarece versiunea web trimite cereri către serverele Telegram din mașina utilizatorului.
Din fericire, este destul de simplu (dar nu foarte evident) să corectezi acest lucru. Vreau să avertizez că nu sunt autorul acestei soluții. Am reușit să o găsesc în , în care s-a discutat o problemă asemănătoare cu a mea. Soluția propusă de utilizatorul github , m-a ajutat foarte mult, dar sunt convins că poate ajuta și pe altcineva, de aceea m-am decis să scriu acest tutorial.
Sub titlu veți găsi un ghid pas cu pas pentru configurarea propriei oglinzi Webogram și configurarea proxy-ului pentru cererile sale către serverele Telegram folosind nginx.
Ca exemplu, am ales Ubuntu Server 18.04.3, tocmai instalat și actualizat.
Atenție: Acest tutorial nu va conține instrucțiuni de configurare a domeniului în nginx. Aceasta trebuie să o faceți singuri. Tutorialul presupune că aveți deja un domeniu configurat cu ssl, iar serverul pe care doriți să faceți configurarea are acces la serverele Telegram (în orice mod preferat de dvs.)
Să presupunem că ip-ul acestui server este 10.23.0.3, iar numele domeniului mywebogram.localhost
Având în vedere aceste condiții, voi oferi exemple de configurații. Nu uitați să schimbați valorile cu cele corecte.
Așadar, să începem:
Pentru a rula Webogram, avem nevoie de nodejs. Implicit, dacă îl instalăm din repositoarele Ubuntu, vom obține versiunea 8.x a nodejs. Avem nevoie de versiunea 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsAlegem locul unde va fi bazat Webogramul nostru.
Ca exemplu, îl vom plasa în rădăcina directorului personal. Pentru aceasta, clonăm repository-ul oficial pe serverul nostru:
cd ~ && git clone https://github.com/zhukov/webogram.gitPasul următor este să instalăm toate dependențele necesare pentru a rula aplicația:
cd webogram && npm installVom încerca să facem un test de rulare. Executați comanda:
npm startDupă care, încercăm să deschidem în browser
http://10.23.0.3:8000/app/index.htmlDacă până acum ați făcut totul corect, ar trebui să vi se deschidă pagina de autentificare Webogram.
Acum trebuie să configurăm rularea aplicației ca serviciu. Pentru aceasta, vom crea un fișier
sudo touch /lib/systemd/system/webogram.serviceîl deschidem în orice editor și i-am dat următoarea formă (introduceți propriul drum până la 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
După aceea, executăm următoarele comenzi:
Aplicăm modificările
sudo systemctl daemon-reloadActivăm pornirea automată:
sudo systemctl enable webogram.servicePornim serviciul:
sudo systemctl start webogram.serviceDupă execuția acțiunilor, Webogram va continua să fie disponibil pe portul 8000.
Întrucât vom configura accesul la Webogramul nostru prin nginx, vom închide portul 8000 pentru cererile externe.
Folosim pentru aceasta utilitarul udf (sau orice modalitate convenabilă pentru dumneavoastră):
sudo ufw deny 8000În cazul în care ați decis totuși să folosiți udf, dar este oprit pe server, adăugați încă câteva reguli (pentru a nu se distruge totul) și activați udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableÎn continuare, ne vom ocupa de modificarea configurației nginx.
Așa cum am avertizat mai sus, se presupune că domeniul dvs. este deja configurat cu ssl pe server. Vreau să vă atrag atenția doar asupra faptului că va trebui să adăugați în fișierul de configurație al domeniului pentru o funcționare corectă:
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;
}
}
Ce adăugăm în configurația nginx:
- Modificăm locația principală, care va proxy-a cererile pe portul 8000, la care Webogram răspunde
- Încărcăm locația principală cu basic-auth. Este un pas pur simbolic, pentru a închide aplicația noastră de ochii curioșilor și bot-urilor. (Și pentru a evita problemele cu blocările)
- Mulțimea de locații cu proxy_pass către servere Telegram sunt de fapt endpoint-urile noastre prin care vom proxy-a cererile noastre
De asemenea, vom crea un fișier /etc/nginx/passwd.htpasswd;, pentru ca nginx să aibă cu ce să compare parolele utilizatorilor.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Repornim nginx:
sudo systemctl restart nginxAcum Webogram va fi disponibil doar la adresa după ce se introduc numele de utilizator și parola pe care le-ați definit când ați creat comanda htpasswd.
Mai este puțin: să facem câteva mici modificări în proiectul în sine.
Deschideți în editor fișierul ~/webogram/app/js/lib/mtproto.js
Și aduceți-l la următoarea formă:
/*!
* 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
}
...
După asta, trebuie să actualizați pagina aplicației în browser.
Deschideți consola browserului și observați cererile de rețea ale aplicației. Dacă totul funcționează și cererile XHR merg către serverul dumneavoastră, înseamnă că totul este corect realizat, iar Webogram acum este proxy-at prin nginx.

Sper că acest tutorial va fi util și altora, nu doar mie.
Vă mulțumesc foarte mult tuturor celor care au citit până la final.
Dacă cineva a întâmpinat dificultăți sau am făcut vreo eroare, vă răspund cu plăcere și voi încerca să vă ajut în comentarii sau în mesaje private.
Sursa: habr.com
