Ciao, Habr!
Di recente mi sono trovato in una situazione in cui dovevo lavorare all'interno di una rete aziendale con accesso limitato a Internet e come potete indovinare dal titolo — Telegram era bloccato. Sono sicuro che questa situazione sia familiare a molti.
Posso tranquillamente fare a meno dei messenger, ma proprio Telegram mi serviva per lavoro. Non era possibile installare il client sulla macchina di lavoro e nemmeno utilizzare il mio laptop personale. Un'altra soluzione sembrava essere utilizzare la sua , ma come potete immaginare — anche questa era inaccessibile. Escludo immediatamente l'opzione di cercare un mirror non ufficiale (spero per motivi piuttosto evidenti).
Fortunatamente, Webogram è un progetto open source, il cui codice sorgente è disponibile in il suo autore (A cui va un enorme grazie!)
L'installazione e l'avvio non presentano alcuna difficoltà, tuttavia, in condizioni di utilizzo all'interno di una rete con accesso bloccato ai server di Telegram, è più probabile che subiate una delusione piuttosto che un successo, poiché la versione web invia richieste ai server di Telegram dalla macchina dell'utente.
Fortunatamente, è piuttosto semplice (anche se non molto ovvio) da sistemare. Vorrei avvertire che non sono l'autore di questa soluzione. Sono riuscito a trovarla in , in cui si discuteva di un problema simile al mio. La soluzione proposta dall'utente github , mi è stata molto utile, ma sono certo che possa aiutare anche qualcun altro, quindi ho deciso di scrivere questo tutorial.
Sotto il tag, troverete una guida passo-passo per configurare il vostro mirror di Webogram e impostare il proxy delle sue richieste ai server di Telegram usando nginx.
Come esempio ho scelto un'installazione fresca e aggiornata di Ubuntu Server 18.04.3.
Attenzione: In questo tutorial non ci saranno istruzioni su come configurare il dominio in nginx. Questo deve essere fatto autonomamente. Il tutorial presuppone che abbiate già configurato un dominio con SSL e che il server su cui si intende effettuare la configurazione abbia accesso ai server di Telegram (in qualsiasi modo preferiate)
Supponiamo che l'IP di questo server sia 10.23.0.3 e che il nome di dominio sia mywebogram.localhost.
Basandomi su queste convenzioni, fornirò esempi di configurazione. Non dimenticate di modificare i valori con i vostri.
Quindi, iniziamo:
Per eseguire Webogram, abbiamo bisogno di nodejs. Di default, se lo installiamo dai repository di Ubuntu, otterremo nodejs versione 8.x. Abbiamo bisogno della 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsScegliamo un luogo dove sarà basato il nostro Webogram.
Per esempio, lo posizioniamo nella cartella principale della directory home. A tal fine, cloniamo il repository ufficiale sul nostro server:
cd ~ && git clone https://github.com/zhukov/webogram.gitIl passaggio successivo è installare tutte le dipendenze necessarie per eseguire l'applicazione:
cd webogram && npm installProviamo a eseguire un avvio di prova. Esegui il seguente comando:
npm startDopo di che, proviamo ad aprirlo nel browser
http://10.23.0.3:8000/app/index.htmlSe fino a questo momento hai fatto tutto correttamente, si aprirà la pagina di accesso di Webogram.
Ora è necessario configurare l'avvio dell'applicazione come servizio. Per questo, creiamo un file
sudo touch /lib/systemd/system/webogram.serviceapriamolo in un qualsiasi editor e diamo il seguente aspetto (inserisci il tuo percorso fino a WorkDirectory)
[Unit]
Description=Mirror di 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
Dopo di che eseguiamo i seguenti comandi:
Applichiamo le modifiche
sudo systemctl daemon-reloadAttiviamo l'avvio automatico:
sudo systemctl enable webogram.serviceAvviamo il servizio:
sudo systemctl start webogram.serviceDopo aver eseguito queste operazioni, Webogram continuerà ad essere disponibile sulla porta 8000.
Poiché configureremo l'accesso a Webogram tramite nginx, chiuderemo la porta 8000 alle richieste esterne.
Utilizziamo per questo l'utility udf (o qualsiasi modo che preferite):
sudo ufw deny 8000Nel caso decidiate di utilizzare udf, ma sia disattivato sul server, aggiungiamo altre regole (per non far crollare tutto) e attiviamo udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableOra, procediamo con la modifica della configurazione di nginx.
Come ho avvisato sopra, si presume che sul vostro server sia già stato configurato un dominio con ssl. Vi ricordo solo che sarà necessario aggiungere nel file di configurazione del dominio per un corretto funzionamento:
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;
}
}
Cosa aggiungiamo alla configurazione di nginx:
- Modifichiamo la location principale che proxierà le richieste sulla porta 8000, a cui risponde Webogram
- La location principale è protetta da basic-auth. Questo è un passaggio puramente simbolico per proteggere la nostra applicazione dagli sguardi indiscreti e dai bot. (E anche per evitare problemi di blocco)
- Una serie di location con proxy_path sui server di Telegram rappresentano i nostri endpoint, attraverso i quali invieremo le nostre richieste
Inoltre, creeremo un file /etc/nginx/passwd.htpasswd;, in modo che nginx abbia qualcosa con cui confrontare le password degli utenti.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Riavviamo nginx:
sudo systemctl restart nginxOra Webogram sarà accessibile solo all'indirizzo dopo aver inserito il nome utente e la password che hai impostato al momento della creazione del comando htpasswd.
Restano solo alcune modifiche da apportare al progetto stesso.
Apri nel tuo editor il file ~/webogram/app/js/lib/mtproto.js
E modifica l'inizio in questo modo:
/*!
* 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
}
...
Dopo di ciò, aggiorna la pagina dell'app nel browser.
Apri la console del browser e controlla le richieste di rete dell'applicazione. Se tutto funziona e le richieste XHR vanno sul tuo server, significa che tutto è stato fatto correttamente e Webogram ora è proxizzato tramite nginx.

Spero che questo tutorial possa essere utile a qualcun altro oltre che a me.
Un grande grazie a tutti coloro che sono arrivati fino alla fine.
Se qualcuno ha avuto difficoltà o se ho commesso degli errori, risponderò volentieri e cercherò di aiutarvi nei commenti o in privato.
Fonte: habr.com
