Ciao, Habr!
Recentemente mi sono trovato in una situazione in cui era necessario lavorare all'interno di una rete aziendale con accesso limitato a Internet e come puoi intuire dal titolo, Telegram era bloccato. Sono sicuro che questa situazione sia familiare a molti.
Posso tranquillamente fare a meno dei messenger, tuttavia Telegram mi serviva per lavoro. Non era possibile installare il client sulla macchina di lavoro, né usare il laptop personale. Un'altra soluzione sarebbe stata utilizzare la sua , ma come puoi immaginare, non era accessibile. Escludo subito l'opzione di cercare uno specchio non ufficiale (sperando per ragioni abbastanza ovvie).
Per fortuna, Webogram è un progetto open source il cui codice sorgente è disponibile su il suo autore (a cui vanno enormi ringraziamenti!)
L'installazione e l'avvio non sono complessi, tuttavia, in una rete con accesso bloccato ai server di Telegram, la tua esperienza sarà probabilmente deludente piuttosto che positiva, poiché la versione web invia richieste ai server di Telegram dalla macchina dell'utente.
Fortunatamente, è abbastanza semplice (ma non molto ovvio) risolvere questo problema. Vorrei avvisarti che non sono l'autore di questa soluzione. Sono riuscito a trovarla in , nella quale era stato trattato un problema simile al mio. La soluzione proposta dall'utente github , mi ha aiutato molto, e sono sicuro che possa essere utile anche ad altri, quindi ho deciso di scrivere questo tutorial.
Di seguito troverai una guida passo passo per configurare il tuo specchio Webogram e impostare il proxy delle sue richieste verso i server di Telegram utilizzando nginx.
Come esempio, ho scelto un'installazione e un aggiornamento recenti di Ubuntu Server 18.04.3.
Attenzione: Questo tutorial non include istruzioni per la configurazione del dominio in nginx. Dovrai farlo autonomamente. Si presume che tu abbia già configurato un dominio con SSL, e che il server su cui stai per eseguire la configurazione abbia accesso ai server di Telegram (in qualsiasi modo tu preferisca)
Supponiamo che l'IP di questo server sia 10.23.0.3 e il nome di dominio sia mywebogram.localhost
Partendo da queste condizioni, fornirò esempi di configurazione. Ricorda di sostituire i valori con i tuoi.
Quindi, iniziamo:
Per avviare Webogram, abbiamo bisogno di nodejs. Per impostazione predefinita, se lo installiamo dai repository di Ubuntu, otterremo la versione 8.x di nodejs. 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 in cui basare il nostro Webogram.
Per esempio, lo posizioniamo nella radice della directory home. Per fare ciò, cloniamo il repository ufficiale sul nostro server:
cd ~ && git clone https://github.com/zhukov/webogram.gitIl passo successivo è installare tutte le dipendenze necessarie per avviare l'applicazione:
cd webogram && npm installProviamo a eseguire un avvio di prova. Esegui il comando:
npm startDopo di che, proviamo ad aprirlo nel browser
http://10.23.0.3:8000/app/index.htmlSe fino a questo punto hai fatto tutto correttamente, si aprirà la pagina di login di Webogram.
Ora dobbiamo configurare l'avvio dell'applicazione come servizio. Per fare ciò, creiamo un file
sudo touch /lib/systemd/system/webogram.serviceapriamolo in un qualsiasi editor e diamo il seguente aspetto (inseriamo il nostro percorso fino a 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
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 azioni, Webogram sarà disponibile sulla porta 8000.
Poiché configureremo l'accesso al nostro Webogram tramite nginx, chiuderemo la porta 8000 per le richieste esterne.
Utilizziamo l'utility udf (o qualsiasi altro metodo che ti è comodo):
sudo ufw deny 8000Nel caso in cui tu decida di utilizzare udf, ma sia spento sul server, aggiungiamo altre regole (per evitare problemi) e attiviamo udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableOra procediamo a modificare la configurazione di nginx.
Come ho già avvisato in precedenza, si presume che sul tuo server sia già configurato un dominio con ssl. Ti ricordo solo che dovrai aggiungere al file di configurazione del dominio per il 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 posizione principale, che gestirà le richieste sulla porta 8000, a cui risponde Webogram
- Chiudiamo la posizione principale con autenticazione di base. È un passo puramente simbolico per proteggere la nostra applicazione da occhi indiscreti e bot. (E anche per evitare problemi di blocco)
- Una serie di location con proxy_path verso i server Telegram rappresentano i nostri endpoint, attraverso i quali inoltreremo 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 definito durante la creazione del comando htpasswd.
Ci rimane poco: apportiamo alcune piccole modifiche al progetto stesso.
Apri il file ~/webogram/app/js/lib/mtproto.js
E modifica l'inizio nella seguente forma:
/*!
* 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 che, è necessario aggiornare la pagina con l'app nel browser.
Apri la console del browser e controlla le richieste di rete dell'app. Se tutto funziona e le richieste XHR vengono inviate al tuo server, significa che hai fatto tutto correttamente e che Webogram ora viene inoltrato tramite nginx.

Spero che questo tutorial possa essere utile anche ad altri oltre che a me.
Un grande grazie a tutti coloro che hanno letto fino in fondo.
Se qualcuno ha avuto difficoltà o ho commesso qualche imprecisione, risponderò volentieri e cercherò di aiutarvi nei commenti o in privato.
Fonte: habr.com
