Բարև, Хабр!
Մի ժամանակ ես գտա ինձ իրավիճակերում, որտեղ անհրաժեշտ էր աշխատել ընկերության ցանցում՝ անբավարար ինտերնետային հասանելիությամբ, ինչպես կարող են ենթադրել վերնագրից, Telegram-ում արգելաված էր: Կրկին վստահ եմ, որ այս իրավիճակը շատերին հայտնի է։
Ես կարող եմ առանց մեսենջերների, բայց հենց Telegram-ն էր ինձ անհրաժեշտ աշխատելու համար: Ծրագրի հաճախորդը տեղադրել աշխատանքային մեքենայի վրա հնարավոր չէր, անձնական նոթբուքը նույնպես չի կարելի օգտագործել: Մյուս լուծումը կարող է լինել օգտվել նրա , բայց ինչպես կարող եք ենթադրել՝ այն նույնպես հասանելի չէր: ոչ պաշտոնական հայելի որոնելը անմիջապես բացառվում է (հուսով եմ՝ բավականին ակնհայտ պատճառներով):
Fortunately, Webogram is an open-source project, the source code of which is available at its author (Thanks a lot to him!)
The installation and launch are not complicated at all, however, in conditions of operation within a network with blocked access to Telegram servers, you will more likely face disappointment than success, as the web version sends requests to Telegram servers from the user machine.
Fortunately, this is quite easy (but not very obvious) to fix. I want to warn that I am not the author of this solution. I managed to find it in , where a problem similar to mine was discussed. The solution proposed by the user github , helped me a lot, but I am sure it can help someone else, so I decided to write this tutorial.
Below, you will find a step-by-step setup of your Webogram mirror and the configuration of proxying its requests to Telegram servers using nginx.
As an example, I chose a newly installed and updated Ubuntu Server 18.04.3.
Ուշադրություն: Այս ուսումնական ուղեցույցում չի լինի nginx-ի մեջ տիրույթի կարգավորելու հրահանգներ: Դա պետք է անել ինքնուրույն: Ուղեցույցը предполагает, что у вас уже настроен домен с ssl, а также сам сервер, на котором планируется настройка, имеет доступ к серверам Telegram (любым на ваш вкус способом)
Բավական է, որ այս սերվերի IP-ն 10.23.0.3, իսկ տիրույթի անվանումը mywebogram.localhost
Այս պայմաններից ելնելով, ես կընդհանուրեմ configuratios: Не забудьте изменить значения на свои.
Ինչպես սկսել:
Webogram-ի մեկնարկի համար մեզ պետք է nodejs: Ցանկալի կերպով, եթե տեղադրում ենք այն Ubuntu-ի գրության ձախողներից, մենք կստանանք nodejs 8.x տարբերակը: Հրաժարվենք 12.x.-ից:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsԸնտրեք տեղ, որտեղ կանցնի մեր Webogram-ը:
Օրինակ՝ տեղադրենք մուտքի տնային կատեգորիայի մեջ: Այդ ժամանակ, պաշտոնական գրախոսությունը կադրեք ձեր սերվերին:
cd ~ && git clone https://github.com/zhukov/webogram.gitՀաջորդ քայլը՝ տեղադրեք բոլոր կախյալությունները, որոնք անհրաժեշտ են ծրագրի մեկնարկի համար:
cd webogram && npm installՎարենք փորձնական գործարկում։ Գործադրեք հրամանը՝
npm startԱյնուհետև փորձեք բացել բրաուզերում
http://10.23.0.3:8000/app/index.htmlԵթե մինչ այս պահը alles է եղել ճիշտ — դուք կտեսնեք Webogram-ի մուտքի էջը։
Այժմ մենք պետք է կարգավորենք հավելվածի գործարկումը որպես ծառայություն։ Для этого создадим файл
sudo touch /lib/systemd/system/webogram.serviceբացենք այն ցանկացած խմբագրիչում և տանք հետևյալ տեսքը (լուսանկարենք մեր ճանապարհը WorkDirectory-ի համար)
[Unit]
Description=Webogram հայելային
[Service]
WorkingDirectory=/home/tg/webogram
ExecStart=/usr/bin/npm start
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Այնուհետև մեզ անհրաժեշտ են հետևյալ հրամանները՝
Կիրառեք փոփոխությունները
sudo systemctl daemon-reloadՄիացրեք ավտո-գործարկում՝
sudo systemctl enable webogram.serviceԸնդունեք ծառայությունը՝
sudo systemctl start webogram.serviceԵրբ գործողությունները կատարվում են, Webogram-ը շարունակելու է հասանելի լինել 8000-port-ում։
Քանի որ մենք անելու ենք մուտք կատարելու մեր Webogram-ին nginx-ի միջոցով — փակենք 8000-port-ը արտերկրային հարցումների համար։
Սրա համար օգտագործում ենք udf ծրագիրը (կամ ցանկացած ձեզ հարմար եղանակ)`
sudo ufw deny 8000Եթե դուք դեռևս որոշել եք օգտագործել udf, բայց այն выключено է ալ որպես սերվերի — ավելացնում ենք ևս կանոններ (ինչպես վանագրելու չէր լինի) և ակտիվացնում ենք udf-ը՝
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableՀետո, անցնենք nginx-ի կոնֆիգուրացիայի փոփոխմանը։
Ինչպես ես նախազգուշացրել էի վերևում — ենթադրվում է, որ ձեր սերվերում արդեն կազմաձեւված է մոդեմ SSL-ով։ Բարևում եմ ձեզ միայն այն, որ անհրաժեշտ է ավելացնել նոմենալ կոնֆիգուրացիոն ֆայլ՝ ճիշտ աշխատանքի համար։
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;
}
}
Այդպիսով, մենք ավելացնում ենք nginx-ի կոնֆիգին մեջ՝
- Փոփոխել ենք արմատային location-ը, որը պետք է վերզի հարցումները մինչև 8000-port, որտեղ Webogram-ը պատասխանող է։
- Մենք արմատական location-ը կփակենք basic-auth-ի միջոցով: Դա պարզապես ստանալու ճանապարհ է, որպեսզի փակենք մեր ծրագրումը այլ մարդկանց և ռոբոտների աչքերից։ (Ենթակա խնդիրներից խուսափելու համար)
- Telegram-ի սերվերների proxy_path-ով շատ location-ներ ունենք, որոնք մեր endpoint-ներն են, որոնց միջոցով կիրականացնենք մեր հարցումները
Այժմ մենք կստեղծենք ֆայլ /etc/nginx/passwd.htpasswd;, որպեսզի nginx-ը ունենա, ինչի հետ համեմատելու օգտվողների գաղտնաբառերը:
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Նորից սկսենք nginx-ը:
sudo systemctl restart nginxԱյժմ Webogram-ը հասանելի կլինի միայն հասցեով հետո, երբ մուտք եք գործել գաղտնաբառը և օգտագործողի անունը, որը դուք սահմանեցիք htpasswd հրամանով:
Մնացել է մի փոքր՝ կատարենք փոքր փոփոխություն հենց նախագծում:
Բացեք խմբագրիչում ֆայլը ~/webogram/app/js/lib/mtproto.js
և բերեք դրա սկիզբն այսպիսի տեսք:
/*!
* 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
}
...
Այնուհետև անհրաժեշտ է թարմացնել էջը՝ բացված ծրագրում:
Բացեք ձեր բրաուզերի կոնսոլը և դիտեք ծրագրի ցանցային հարցումները: Եթե ամենը աշխատում է, և XHR հարցումները գնում են ձեր սերվերին, դա նշանակում է, որ ամեն ինչ ճիշտ է արվել, և Webogram-ը հիմա proxy է իրականացվում nginx-ի միջոցով:

Հույս ունեմ, որ այս դասընթացը օգտակար կլինի ոչ միայն ինձ համար:
Մեծ շնորհակալություն բոլոր այն մարդկանց, ովքեր կարդացել են վերջի:
Եթե որևէ մեկի համար դժվարություններ են առաջացել, կամ ես սխալ մոտեցումներ եմ ունեցել՝ հաճույքով կպատասխանեմ և փորձեմ օգնել մեկնաբանությունների կամ ուղիղ հաղորդագրությունների միջոցով:
Ընտանիք: habr.com
