Hello, Habr!
Nedavno sem se znašel v situaciji, kjer je bilo treba delati znotraj korporativne mreže z omejenim dostopom do interneta, in kot lahko uganite iz naslova — Telegram je bil v njej blokiran. Prepričan sem, da je ta situacija znana mnogim.
Zlahka se lahko znajdem brez sporočilnikov, vendar sem potreboval prav Telegram za delo. Namestitev odjemalca na delovno napravo ni bila mogoča, prav tako uporaba osebnega prenosnika. Druga možnost, ki se zdi izvedljiva, je uporaba njegove , vendar kot lahko uganite — tudi ta ni bila dostopna. Možnost iskanja neformalnega zrcala takoj izključujem (upam, da iz povsem očitnih razlogov).
Na srečo je Webogram odprtokodni projekt, katerega izvorna koda je dostopna na njegovi strani (velika hvala avtorju!)
Namestitev in zagon samega projekta nista zapletena, vendar boste v pogojih delovanja znotraj mreže z blokiranim dostopom do strežnikov Telegram verjetno doživeli razočaranje, kot pa uspeh, saj spletna različica pošilja zahteve na strežnike Telegram iz uporabniške naprave.
Na srečo je to dokaj preprosto (vendar ne zelo očitno) popraviti. Želim opozoriti, da nisem avtor tega rešenja. Uspelo mi je najti to v , kjer je bila obravnavana težava, podobna moji. Rešitev, ki jo je predlagal uporabnik github , mi je zelo pomagala, vendar sem prepričan, da bo v pomoč tudi drugim, zato sem se odločil napisati ta vodič.
Pod katom vas čaka korak-po-koraku nastavitev svojega zrcala Webogram in nastavitev posredovanja njegovih zahtev do strežnikov Telegram z uporabo nginx.
Kot primer sem izbral pravkar nameščen in posodobljen Ubuntu Server 18.04.3.
Attention: V tem vodiču ne bo navodil za nastavitev domene v nginx. To morate narediti sami. Vodič predpostavlja, da imate že nastavljeno domeno z ssl, pa tudi, da ima sam strežnik, na katerem se načrtuje nastavitev, dostop do strežnikov Telegram (na kakršenkoli način, ki vam ustreza)
Predpostavimo, da je ip tega strežnika 10.23.0.3, domensko ime mywebogram.localhost
Na podlagi teh predpostavk bom prinašal primere konfiguracij. Ne pozabite zamenjati vrednosti s svojimi.
Torej, začnimo:
Za zagon Webograma potrebujemo nodejs. Privzeto, če ga namestimo iz repozitorijev Ubuntu, bomo dobili nodejs različice 8.x. Potrebujemo 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsIzberemo mesto, kjer bo naš Webogram.
Kot primer — ga postavimo v koren domače mape. Zato kloniramo uradni repozitorij na naš strežnik:
cd ~ && git clone https://github.com/zhukov/webogram.gitNaslednji korak je namestitev vseh odvisnosti, potrebnih za zagon aplikacije:
cd webogram && npm installPoskusimo izvesti testni zagon. Izvedite ukaz:
npm startNato poskusite odpreti v brskalniku
http://10.23.0.3:8000/app/index.htmlČe ste do te točke vse izvajali pravilno, se vam bo odprla stran za prijavo v Webogram.
Zdaj moramo nastaviti zagon aplikacije kot storitev. Zato ustvarimo datoteko
sudo touch /lib/systemd/system/webogram.servicejo odprite v katerem koli urejevalniku in ji dajte naslednjo obliko (vpišite 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 izvedemo naslednje ukaze:
Prijavimo spremembe
sudo systemctl daemon-reloadOmogočimo samodejni zagon:
sudo systemctl enable webogram.serviceZaženite storitev:
sudo systemctl start webogram.servicePo izvedenih dejanjih bo Webogram še naprej dostopen na portu 8000.
Ker bomo nastavili dostop do našega Webograma preko nginx, bomo zaprli port 8000 za zunanje zahteve.
Za to uporabimo orodje udf (ali katero koli drugo primerno metodo):
sudo ufw deny 8000V primeru, da bi se vseeno odločili uporabiti udf, vendar je onemogočen na strežniku — dodamo še pravila (da se vse ne podre) in omogočimo udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableNato se lotimo spreminjanja konfiguracije nginx.
Kot sem opozoril zgoraj — domnevamo, da je na vašem strežniku že nastavljen domena s ssl. Opozarjam vas le na to, da bo treba dodati v konfiguracijsko datoteko domene za pravilno delovanje:
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 dodajamo v nginx konfiguracijo:
- Spremenimo osnovno lokacijo, ki bo posredovala zahtevke na port 8000, na katerem odgovarja Webogram.
- Osnovno lokacijo zaščitimo s basic-auth. To je povsem simbolni korak, da zaščitimo našo aplikacijo pred radovednimi očmi in botom. (Prav tako, da ne bi bilo težav z blokadami.)
- Množica lokacij s proxy_path do strežnikov Telegram je točno to, kar bomo uporabili za posredovanje naših zahtevkov.
Prav tako, ustvarimo datoteko /etc/nginx/passwd.htpasswd;, da bo imel nginx s čim preveriti uporabniške gesle.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Ponovno zaženemo nginx:
sudo systemctl restart nginxSedaj bo Webogram dostopen le na naslovu potem ko vnesete uporabniško ime in geslo, ki ste ga določili pri ustvarjanju ukaza htpasswd.
Zdaj je še malo: naredimo drobne spremembe v samem projektu.
Odprite v urejevalniku datoteko ~/webogram/app/js/lib/mtproto.js
In spremenite njen začetek v naslednji obliki:
/*!
* 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
}
...
Po tem je potrebno osvežiti stran z aplikacijo v brskalniku.
Odprite konzolo brskalnika in poglejte omrežne zahtevke aplikacije. Če vse deluje in XHR zahtevki gredo na vaš strežnik, potem je vse opravljeno pravilno in Webogram zdaj posreduje preko nginx.

Upam, da bo ta vodič koristen še nekomu, poleg mene.
Le hvala vsem, ki so to prebrali do konca.
Če ima kdo težave ali sem naredil kakšne napake — z veseljem bom odgovoril ter vam poskušal pomagati v komentarjih ali sporočilih.
Izvor: habr.com
