Hej Habr!
Nyligen befann jag mig i en situation dÀr det var nödvÀndigt att arbeta i ett företagsnÀtverk med ofullstÀndig tillgÄng till Internet och, som du kan gissa frÄn titeln, blockerades Telegram i det. Jag Àr sÀker pÄ att denna situation Àr bekant för mÄnga.
Jag klarar mig utan instant messengers, men det var Telegram som jag behövde för jobbet. Det gick inte att installera klienten pÄ en arbetsmaskin och det var inte heller möjligt att anvÀnda en personlig bÀrbar dator. En annan lösning verkar vara att anvÀnda den , men som du kan gissa var den inte heller tillgÀnglig. Jag stryker omedelbart över alternativet att söka efter en inofficiell spegel (hoppas jag av förklarliga skÀl).
Lyckligtvis Àr Webogram ett projekt med öppen kÀllkod vars kÀllkod Àr tillgÀnglig i dess författare (som stort tack till honom!)
Installationen och lanseringen i sig Àr inte svÄr, men under driftförhÄllanden i ett nÀtverk med blockerad Ätkomst till Telegram-servrar Àr det mer sannolikt att du blir besviken Àn framgÄngsrik, eftersom webbversionen skickar förfrÄgningar till Telegram-servrar frÄn anvÀndarens maskin.
Lyckligtvis Àr detta en ganska enkel (men inte sÀrskilt uppenbar) fix. Jag skulle vilja varna dig för att jag inte Àr författaren till denna lösning. Jag lyckades hitta den , som diskuterade ett problem som liknar mitt. Lösning föreslagen av github-anvÀndare , det hjÀlpte mig mycket, men jag Àr sÀker pÄ att det kan hjÀlpa nÄgon annan, sÄ jag bestÀmde mig för att skriva den hÀr handledningen.
Nedanför klippet hittar du steg-för-steg-instÀllning av din Webogram-spegel och instÀllning av proxysÀndning av dess förfrÄgningar till Telegram-servrar med nginx.
Som exempel valde jag en nyinstallerad och uppdaterad Ubuntu Server 18.04.3.
Varning: Denna handledning kommer inte att innehÄlla instruktioner om hur du konfigurerar en domÀn i nginx. Du mÄste göra detta sjÀlv. Handledningen förutsÀtter att du redan har konfigurerat en domÀn med ssl, och att sjÀlva servern som du planerar att konfigurera den pÄ har tillgÄng till Telegram-servrarna (pÄ vilket sÀtt du vill)
LÄt oss anta att denna servers ip Àr 10.23.0.3 och domÀnnamnet Àr mywebogram.localhost
UtifrÄn dessa konventioner kommer jag att ge exempel pÄ konfigurationer. Glöm inte att Àndra vÀrdena till dina egna.
SÄ lÄt oss komma igÄng:
För att köra Webogram behöver vi nodejs. Som standard, om du installerar det frĂ„n repositorierna Ubuntu â vi skaffar nodejs version 8.x. Vi behöver 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsVi vÀljer platsen dÀr vÄrt webogram ska vara baserat.
LÄt oss till exempel placera den i roten av hemkatalogen. För att göra detta, klona det officiella förvaret till vÄr server:
cd ~ && git clone https://github.com/zhukov/webogram.gitNÀsta steg Àr att installera alla beroenden som krÀvs för att köra programmet:
cd webogram && npm installLÄt oss provköra. Kör kommandot:
npm startEfter det försöker vi öppna den i webblÀsaren
http://10.23.0.3:8000/app/index.htmlOm du fram till denna punkt har gjort allt korrekt, öppnas Webogram-auktoriseringssidan.
Nu mÄste vi konfigurera applikationen för att köras som en tjÀnst. För att göra detta, lÄt oss skapa en fil
sudo touch /lib/systemd/system/webogram.serviceöppna den i valfri editor och ge den följande utseende (skriv in din sökvÀg till 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
Sedan kör vi följande kommandon:
TillÀmpar Àndringarna
sudo systemctl daemon-reloadAktivera autorun:
sudo systemctl enable webogram.serviceLÄt oss starta tjÀnsten:
sudo systemctl start webogram.serviceEfter att ha slutfört stegen kommer Webogram att fortsÀtta att vara tillgÀngligt pÄ port 8000.
Eftersom vi kommer att konfigurera Ätkomst till vÄrt webogram via nginx kommer vi att stÀnga port 8000 för förfrÄgningar utifrÄn.
Vi anvÀnder utf-verktyget för detta (eller nÄgon metod som Àr bekvÀm för dig):
sudo ufw deny 8000Om du fortfarande bestÀmmer dig för att anvÀnda udf, men det Àr inaktiverat pÄ servern, lÀgg till fler regler (sÄ att allt inte faller isÀr) och aktivera udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableLÄt oss sedan börja Àndra nginx-konfigurationen.
Som jag varnade ovan antas det att en domÀn med ssl redan Àr konfigurerad pÄ din server. Jag kommer bara att uppmÀrksamma dig pÄ vad som mÄste lÀggas till i domÀnkonfigurationsfilen för att den ska fungera korrekt:
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;
}
}
Vad vi lÀgger till i nginx-konfigurationen:
- Vi Àndrar rotplatsen, som kommer proxyförfrÄgningar till port 8000, som Webogram svarar pÄ
- Vi stÀnger rotplatsen med basic-auth. Detta Àr ett rent symboliskt steg för att stÀnga vÄr applikation frÄn nyfikna ögon och bots. (Och Àven för att undvika problem med blockering)
- Ett gÀng platser med proxy_path pÄ Telegram-servern Àr exakt vÄra slutpunkter genom vilka vi kommer att proxya vÄra förfrÄgningar
LÄt oss ocksÄ skapa en fil /etc/nginx/passwd.htpasswd;sÄ att nginx har nÄgot att kontrollera anvÀndarlösenord med.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Starta om nginx:
sudo systemctl restart nginxNu kommer Webogram endast att finnas tillgÀngligt kl efter att inloggningen och lösenordet som du definierade nÀr du skapade kommandot htpasswd har angetts.
Det Àr lite kvar: vi kommer att göra smÄ förÀndringar i sjÀlva projektet.
Ăppna filen i en editor ~/webogram/app/js/lib/mtproto.js
Och föra dess början till följande 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
}
...
Efter detta mÄste du uppdatera applikationssidan i webblÀsaren.
Ăppna din webblĂ€sarkonsol och titta pĂ„ programmets nĂ€tverksbegĂ€randen. Om allt fungerar och XHR-förfrĂ„gningar gĂ„r till din server, sĂ„ Ă€r allt gjort korrekt, och Webogram proxias nu via nginx.

Jag hoppas att denna handledning kommer att vara anvÀndbar för nÄgon annan Àn mig.
Stort tack till alla som lÀst till slutet.
Om nÄgon har nÄgra svÄrigheter eller jag gjort nÄgra felaktigheter sÄ svarar jag gÀrna och försöker hjÀlpa dig i kommentarerna eller i PM.
KĂ€lla: will.com
