Еј Хабр!
Неодамна се најдов во ситуација во која беше неопходно да се работи во корпоративна мрежа со нецелосен пристап до Интернет и, како што може да се погоди од насловот, Телеграма беше блокирана во неа. Сигурен сум дека оваа ситуација им е позната на многумина.
Можам без инстант-месинџери, но Telegram беше она што ми требаше за работа. Не беше можно да се инсталира клиентот на работна машина, ниту пак да се користи личен лаптоп. Се чини дека друго решение е да го користите , но како што можете да претпоставите и тој беше недостапен. Веднаш ја пречкртам опцијата за барање неофицијално огледало (се надевам од очигледни причини).
За среќа, Webogram е проект со отворен код чиј изворен код е достапен во неговиот автор (За што му благодарам многу!)
Самата инсталација и лансирање не е тешко, меѓутоа, во услови на работа во мрежа со блокиран пристап до серверите на Telegram, поголема е веројатноста да бидете разочарани отколку успешно, бидејќи веб-верзијата испраќа барања до серверите на Telegram од машината на корисникот.
За среќа, ова е прилично едноставна (но не многу очигледна) поправка. Би сакал да ве предупредам дека не сум јас авторот на ова решение. Успеав да го најдам во , кој разговараше за проблем сличен на мојот. Решението предложено од корисникот на github , многу ми помогна, сепак, сигурен сум дека може да помогне и на некој друг, па решив да го напишам овој туторијал.
Под сечењето ќе најдете чекор-по-чекор поставување на вашиот огледало на Webogram и поставување на прокси на неговите барања до серверите на Telegram користејќи nginx.
Како пример, избрав новоинсталиран и ажуриран Ubuntu Сервер 18.04.3.
Предупредување: Овој туторијал нема да вклучува инструкции за поставување домен во nginx. Треба да го направите ова сами. Упатството претпоставува дека веќе сте конфигурирале домен со ssl и дека самиот сервер на кој планирате да го конфигурирате има пристап до серверите на Telegram (на кој било начин што сакате)
Да претпоставиме дека IP адресата на овој сервер е 10.23.0.3, а името на доменот е mywebogram.localhost
Врз основа на овие конвенции, ќе дадам примери на конфигурации. Не заборавајте да ги промените вредностите на свои.
Значи, да започнеме:
За да го стартуваме 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Ние го избираме местото каде што ќе се базира нашиот Вебограм.
На пример, да го поставиме во коренот на домашниот директориум. За да го направите ова, клонирајте го официјалното складиште на нашиот сервер:
cd ~ && git clone https://github.com/zhukov/webogram.gitСледниот чекор е да ги инсталирате сите зависности потребни за извршување на апликацијата:
cd webogram && npm installАјде да пробаме тест. Извршете ја командата:
npm startПосле тоа, се обидуваме да го отвориме во прелистувачот
http://10.23.0.3:8000/app/index.htmlАко до овој момент сте направиле сè правилно, ќе се отвори страницата за авторизација на Webogram.
Сега треба да ја конфигурираме апликацијата да работи како услуга. За да го направите ова, ајде да создадеме датотека
sudo touch /lib/systemd/system/webogram.serviceотворете го во кој било уредник и дајте му го следниот изглед (внесете ја вашата патека до 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
Потоа ги извршуваме следните команди:
Примена на промените
sudo systemctl daemon-reloadОвозможи автоматско вклучување:
sudo systemctl enable webogram.serviceДа ја започнеме услугата:
sudo systemctl start webogram.serviceПо завршувањето на чекорите, Webogram ќе продолжи да биде достапен на портата 8000.
Бидејќи ќе поставуваме пристап до нашиот вебограм преку nginx, ќе ја затвориме портата 8000 за барања однадвор.
Ние ја користиме алатката 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:
- Ја менуваме локацијата на root, која ќе ги пренасочува барањата до портата 8000, на која Вебограм одговара
- Ја затвораме локацијата на root со користење на basic-auth. Ова е чисто симболичен чекор за затворање на нашата апликација од љубопитните очи и ботови. (И, исто така, за да се избегнат проблеми со блокирање)
- Еден куп локации со proxy_path на серверот Telegram се токму нашите крајни точки преку кои ќе ги застапуваме нашите барања
Исто така, ајде да создадеме датотека /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 сега е проксиран преку nginx.

Се надевам дека ова упатство ќе биде корисно за некој друг освен мене.
Голема благодарност до сите што прочитаа до крај.
Доколку некој има некакви потешкотии или сум направил некакви неточности, со задоволство ќе одговорам и ќе се обидам да ви помогнам во коментари или во PM.
Извор: www.habr.com
