Pozdravljeni, Habr!
Pred kratkim sem se znašel v situaciji, ko je bilo treba delati znotraj korporativnega omrežja z nepopolnim dostopom do interneta in, kot lahko uganete iz naslova, je bil Telegram v njem blokiran. Prepričan sem, da je ta situacija mnogim znana.
Lahko brez hitrih sporočil, vendar sem za delo potreboval Telegram. Odjemalca ni bilo mogoče namestiti na delovni stroj, prav tako ni bilo mogoče uporabiti osebnega prenosnika. Druga rešitev se zdi, da ga uporabite
Na srečo je Webogram odprtokodni projekt, katerega izvorna koda je na voljo v
Sama namestitev in zagon nista težavna, vendar boste v pogojih delovanja v omrežju z blokiranim dostopom do strežnikov Telegram prej razočarani kot uspešni, saj spletna različica pošilja zahteve strežnikom Telegram z uporabnikovega računalnika.
Na srečo je to dokaj preprosta (vendar ne zelo očitna) rešitev. Rad bi vas opozoril, da nisem avtor te rešitve. Uspelo mi je najti v
Pod rezom boste našli korak za korakom nastavitev ogledala Webogram in nastavitev proxyja njegovih zahtev do strežnikov Telegram z uporabo nginx.
Kot primer sem izbral sveže nameščen in posodobljen Ubuntu Server 18.04.3.
Opozorilo: Ta vadnica ne bo vsebovala navodil za nastavitev domene v nginx. To morate narediti sami. Vadnica predpostavlja, da ste že konfigurirali domeno s ssl in da ima sam strežnik, na katerem ga nameravate konfigurirati, dostop do strežnikov Telegram (na kakršen koli način)
Predpostavimo, da je ip tega strežnika 10.23.0.3 in ime domene mywebogram.localhost
Na podlagi teh konvencij bom podal primere konfiguracij. Ne pozabite spremeniti vrednosti na svoje.
Torej, začnimo:
Za zagon Webograma potrebujemo nodejs. Privzeto, če ga namestimo iz repozitorijev Ubuntu, bomo dobili različico nodejs 8.x. Potrebujemo 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejs
Izberemo kraj, kjer bo sedež našega Webograma.
Na primer, postavimo ga v koren domačega imenika. Če želite to narediti, klonirajte uradno skladišče v naš strežnik:
cd ~ && git clone https://github.com/zhukov/webogram.git
Naslednji korak je namestitev vseh odvisnosti, potrebnih za zagon aplikacije:
cd webogram && npm install
Poskusimo poskusno vožnjo. Izvedite ukaz:
npm start
Po tem ga poskušamo odpreti v brskalniku
http://10.23.0.3:8000/app/index.html
Če ste do te točke naredili vse pravilno, se odpre avtorizacijska stran Webogram.
Zdaj moramo aplikacijo konfigurirati za delovanje kot storitev. Če želite to narediti, ustvarimo datoteko
sudo touch /lib/systemd/system/webogram.service
odprite ga v katerem koli urejevalniku in mu dajte naslednji videz (vnesite svojo pot do 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
Nato zaženemo naslednje ukaze:
Uporaba sprememb
sudo systemctl daemon-reload
Omogoči samodejni zagon:
sudo systemctl enable webogram.service
Začnimo s storitvijo:
sudo systemctl start webogram.service
Po zaključku korakov bo Webogram še naprej na voljo na vratih 8000.
Ker bomo vzpostavili dostop do našega Webograma prek nginxa, bomo zaprli vrata 8000 za zahteve od zunaj.
Za to uporabljamo pripomoček udf (ali katero koli metodo, ki vam ustreza):
sudo ufw deny 8000
V primeru, da se vseeno odločite za uporabo udf-a, vendar je na strežniku onemogočen, dodajte še pravila (da ne bo vse skupaj razpadlo) in omogočite udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
Nato začnimo spreminjati konfiguracijo nginx.
Kot sem opozoril zgoraj, se predpostavlja, da je domena s ssl že konfigurirana na vašem strežniku. Opozoril vas bom le na to, kaj bo treba dodati konfiguracijski datoteki domene, da bo pravilno delovala:
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;
}
}
Kaj dodamo konfiguraciji nginx:
- Spremenimo korensko lokacijo, ki bo proxy zahtevala na vrata 8000, na katera Webogram odgovori
- Korensko lokacijo zapremo z uporabo osnovne avtorizacije. To je čisto simboličen korak, da našo aplikacijo zapremo pred radovednimi očmi in roboti. (In tudi, da se izognete težavam z blokiranjem)
- Kup lokacij s proxy_path na strežniku Telegram so ravno naše končne točke, prek katerih bomo posredovali svoje zahteve
Prav tako ustvarimo datoteko /etc/nginx/passwd.htpasswd;
tako da ima nginx nekaj za preverjanje uporabniških gesel.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg
Znova zaženite nginx:
sudo systemctl restart nginx
Zdaj bo Webogram na voljo samo na
Malo je ostalo: naredili bomo majhne spremembe v samem projektu.
Odprite datoteko v urejevalniku ~/webogram/app/js/lib/mtproto.js
In njegov začetek prinesite v naslednjo obliko:
/*!
* 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
}
...
Po tem morate osvežiti stran aplikacije v brskalniku.
Odprite konzolo brskalnika in si oglejte omrežne zahteve aplikacije. Če vse deluje in gredo zahteve XHR na vaš strežnik, je vse opravljeno pravilno in Webogram je zdaj proksiran prek nginx.
Upam, da bo ta lekcija koristila še komu poleg mene.
Najlepša hvala vsem, ki ste prebrali do konca.
Če ima kdo kakršne koli težave ali sem naredil kakšno netočnost, bom z veseljem odgovoril in vam poskušal pomagati v komentarjih ali v PM.
Vir: www.habr.com