Hej Habr!
Nedavno sam se našao u situaciji da je bilo potrebno raditi unutar korporativne mreže s nepotpunim pristupom internetu i, kao što možete pretpostaviti iz naslova, Telegram je u njoj bio blokiran. Siguran sam da je ova situacija mnogima poznata.
Mogu i bez instant messengera, ali Telegram mi je trebao za posao. Klijenta nije bilo moguće instalirati na radni stroj, niti je bilo moguće koristiti osobno prijenosno računalo. Čini se da je drugo rješenje koristiti ga
Srećom, Webogram je projekt otvorenog koda čiji je izvorni kod dostupan u
Sama instalacija i pokretanje nije teško, međutim, u uvjetima rada unutar mreže s blokiranim pristupom Telegram poslužiteljima, vjerojatnije je da ćete biti razočarani nego uspješni, budući da web verzija šalje zahtjeve Telegram poslužiteljima s korisnikovog stroja.
Srećom, ovo je prilično jednostavno (ali ne baš očito) rješenje. Upozoravam vas da ja nisam autor ovog rješenja. Uspio sam to pronaći
Ispod presjeka pronaći ćete korak po korak postavljanje vašeg Webogram mirrora i postavljanje proxyja njegovih zahtjeva Telegram poslužiteljima pomoću nginxa.
Kao primjer odabrao sam svježe instalirani i ažurirani Ubuntu Server 18.04.3.
Upozorenje: Ovaj vodič neće sadržavati upute o postavljanju domene u nginxu. Ovo morate učiniti sami. Udžbenik pretpostavlja da ste već konfigurirali domenu s ssl-om i da sam poslužitelj na kojem ga planirate konfigurirati ima pristup Telegramovim poslužiteljima (kako god želite)
Pretpostavimo da je ip ovog poslužitelja 10.23.0.3, a naziv domene mywebogram.localhost
Na temelju ovih konvencija, dat ću primjere konfiguracija. Ne zaboravite promijeniti vrijednosti na svoje.
Pa krenimo:
Za pokretanje Webograma potrebni su nam nodejs. Prema zadanim postavkama, ako ga instaliramo iz Ubuntu repozitorija, dobit ćemo nodejs verziju 8.x. Trebamo 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejs
Mi biramo mjesto gdje će se naš Webogram nalaziti.
Na primjer, smjestimo ga u korijen matičnog direktorija. Da biste to učinili, klonirajte službeni repozitorij na naš poslužitelj:
cd ~ && git clone https://github.com/zhukov/webogram.git
Sljedeći korak je instaliranje svih ovisnosti potrebnih za pokretanje aplikacije:
cd webogram && npm install
Pokušajmo s probnim radom. Pokrenite naredbu:
npm start
Nakon toga ga pokušavamo otvoriti u pregledniku
http://10.23.0.3:8000/app/index.html
Ako ste do ove točke sve učinili ispravno, otvorit će se stranica za autorizaciju Webograma.
Sada moramo konfigurirati aplikaciju da radi kao usluga. Da bismo to učinili, stvorimo datoteku
sudo touch /lib/systemd/system/webogram.service
otvorite ga u bilo kojem uređivaču i dajte mu sljedeći izgled (unesite svoju putanju do WorkDirectoryja)
[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
Zatim pokrećemo sljedeće naredbe:
Primjena promjena
sudo systemctl daemon-reload
Omogući automatsko pokretanje:
sudo systemctl enable webogram.service
Pokrenimo uslugu:
sudo systemctl start webogram.service
Nakon dovršetka koraka, Webogram će i dalje biti dostupan na priključku 8000.
Budući da ćemo pristup našem Webogramu postaviti putem nginxa, zatvorit ćemo port 8000 za zahtjeve izvana.
Za to koristimo uslužni program udf (ili bilo koji način koji vam odgovara):
sudo ufw deny 8000
U slučaju da ipak odlučite koristiti udf, ali je on onemogućen na serveru, dodajte još pravila (da se sve ne raspadne) i uključite udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
Zatim počnimo mijenjati konfiguraciju nginxa.
Kao što sam prethodno upozorio, pretpostavlja se da je domena sa ssl-om već konfigurirana na vašem poslužitelju. Samo ću vam skrenuti pozornost na ono što je potrebno dodati konfiguracijskoj datoteci domene da bi ispravno radila:
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;
}
}
Što dodajemo nginx konfiguraciji:
- Mijenjamo root lokaciju, koja će proxy zahtjeve uputiti na port 8000, na koji Webogram odgovara
- Zatvaramo korijensku lokaciju pomoću osnovne autentifikacije. Ovo je čisto simboličan korak za zatvaranje naše aplikacije od znatiželjnih očiju i botova. (I također kako bi izbjegli probleme s blokiranjem)
- Hrpa lokacija s proxy_path na Telegram serveru upravo su naše krajnje točke preko kojih ćemo proxy svoje zahtjeve
Također, kreirajmo datoteku /etc/nginx/passwd.htpasswd;
tako da nginx ima čime provjeravati korisničke lozinke.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg
Ponovno pokrenite nginx:
sudo systemctl restart nginx
Sada će Webogram biti dostupan samo na
Ostalo je još malo: napravit ćemo male izmjene u samom projektu.
Otvorite datoteku u editoru ~/webogram/app/js/lib/mtproto.js
I dovedite njegov početak u sljedeći oblik:
/*!
* 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
}
...
Nakon toga morate osvježiti stranicu aplikacije u pregledniku.
Otvorite konzolu preglednika i pogledajte mrežne zahtjeve aplikacije. Ako sve radi i XHR zahtjevi idu na vaš poslužitelj, onda je sve učinjeno ispravno, a Webogram je sada proksiran putem nginxa.
Nadam se da će ovaj tutorial biti koristan još nekome osim meni.
Veliko hvala svima koji su pročitali do kraja.
Ako netko ima bilo kakvih poteškoća ili sam napravio bilo kakve netočnosti, rado ću odgovoriti i pokušati vam pomoći u komentarima ili PM-u.
Izvor: www.habr.com