Hello, Habr!
For nylig befandt jeg mig i en situation, hvor jeg skulle arbejde inden for et virksomhedsintranet med begrænset adgang til internettet, og som du kan gætte ud fra overskriften — Telegram var blokeret. Jeg er sikker på, at mange kender til denne situation.
Jeg kan sagtens klare mig uden messengers, men det var netop Telegram, jeg havde brug for til mit arbejde. At installere klienten på min arbejdsstation var ikke muligt, og at bruge min personlige laptop var heller ikke en mulighed. En anden løsning kunne være at bruge dens , men som du kan gætte — den var ligeledes utilgængelig. Jeg udelukker straks muligheden for at finde et uofficielt spejl (for åbenlyse grunde).
Heldigvis er Webogram et open source-projekt, hvis kildekode er tilgængelig på dets forfatter (Stor tak til ham!)
Selve installationen og opstarten er ikke svært, men under forhold med blokering af adgang til Telegram-serverne vil du sandsynligvis blive skuffet snarere end få succes, da webversionen sender anmodninger til Telegram-serverne fra brugerens maskine.
Heldigvis er det ret simpelt (men ikke særlig indlysende) at rette op på. Jeg vil advare om, at jeg ikke er ophavsmændene til denne løsning. Jeg fandt den i , hvor problemet, der mindede om mit, blev diskuteret. Løsningen, som brugeren github , foreslog, hjalp mig meget, men jeg er sikker på, at den også kan hjælpe andre, derfor besluttede jeg mig for at skrive denne tutorial.
Under overskriften venter der dig en trin-for-trin opsætning af dit eget Webogram-spejl og opsætning af proxyrouting for dets anmodninger til Telegram-serverne ved hjælp af nginx.
Som eksempel har jeg valgt en nyinstalleret og opdateret Ubuntu Server 18.04.3.
Opmærksomhed: Denne tutorial indeholder ikke instruktioner til opsætning af domænet i nginx. Dette skal gøres selvstændigt. Tutorialen forudsætter, at du allerede har opsat et domæne med ssl, og at selve serveren, hvor opsætningen skal finde sted, har adgang til Telegram-serverne (på hvilken som helst måde, du ønsker)
Lad os antage, at ip-adressen for denne server er 10.23.0.3, og domænenavnet er mywebogram.localhost.
Baseret på disse forudsætninger vil jeg give eksempler på konfigurationer. Glem ikke at ændre værdierne til dine egne.
Lad os komme i gang:
For running Webogram, we need nodejs. By default, if we install it from the Ubuntu repositories, we will get nodejs version 8.x. We need 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsWe choose a location where our Webogram will be based.
As an example, let's place it in the root of the home directory. To do this, we clone the official repository to our server:
cd ~ && git clone https://github.com/zhukov/webogram.gitThe next step is to install all dependencies required to run the application:
cd webogram && npm installLet's try to perform a test run. Execute the command:
npm startAfter which, we try to open it in the browser.
http://10.23.0.3:8000/app/index.htmlIf you have done everything correctly until this point, you will see the Webogram authorization page.
Now we need to configure the application to run as a service. To do this, we create a file
sudo touch /lib/systemd/system/webogram.serviceopen it in any editor and set the following content (insert your path to 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
After that, we execute the following commands:
Apply the changes
sudo systemctl daemon-reloadEnable auto-start:
sudo systemctl enable webogram.serviceStart the service:
sudo systemctl start webogram.serviceAfter these actions, Webogram will continue to be available on port 8000.
Since we will configure access to our Webogram through nginx, we will close port 8000 for external requests.
We use the udf utility (or any method convenient for you) for this:
sudo ufw deny 8000In case you decided to use udf but it is turned off on the server, we add some rules (so that everything doesn’t fail) and enable udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableNext, we will modify the nginx configuration.
As I warned above, it is assumed that your server already has a domain set up with ssl. I would just like to point out that you will need to add to the domain configuration file for proper operation:
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;
}
}
Hvad vi tilføjer i nginx-konfigurationen:
- Vi ændrer den primære location, som vil proxyanmode på port 8000, som Webogram svarer på.
- Vi beskytter den primære location med basic-auth. Dette er blot et symbolsk skridt for at beskytte vores applikation mod uvedkommende og bots. (Og også for at undgå problemer med blokeringer)
- Mange location med proxy_path til Telegram-serverne – dette er vores endpoints, som vi vil proxyanmode vores anmodninger igennem.
Vi opretter også en fil /etc/nginx/passwd.htpasswd;, så nginx har noget at sammenligne brugernes adgangskoder med.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Vi genstarter nginx:
sudo systemctl restart nginxNu vil Webogram kun være tilgængelig på adressen efter at have indtastet brugernavn og adgangskode, som du angav ved oprettelse af htpasswd-kommandoen.
Der er ikke meget tilbage: vi skal lave nogle små ændringer i selve projektet.
Åbn filen i en editor ~/webogram/app/js/lib/mtproto.js
Og ændr starten til følgende 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
}
...
Derefter skal du opdatere siden med applikationen i browseren.
Åbn browserens konsol og se netværksanmodningerne fra applikationen. Hvis alt fungerer, og XHR-anmodningerne går til din server - så er alt korrekt, og Webogram er nu proxyanmodet gennem nginx.

Jeg håber, denne tutorial vil være nyttig for andre end mig.
Mange tak til alle, der læste til ende.
Hvis nogen har problemer, eller hvis jeg har lavet nogle unøjagtigheder — vil jeg gerne svare og prøve at hjælpe jer i kommentarfeltet eller i direkte besked.
Kilde: habr.com
