Avviamo la nostra istanza di Webogram con il proxy tramite nginx

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 versione web ufficiale, 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 github 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 un thread, in cui si discuteva di un problema simile al mio. La soluzione proposta dall'utente github tecknojock, 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 nodejs

Scegliamo 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.git

Il passaggio successivo è installare tutte le dipendenze necessarie per eseguire l'applicazione:

cd webogram && npm install

Proviamo a eseguire un avvio di prova. Esegui il seguente comando:

npm start

Dopo di che, proviamo ad aprirlo nel browser

 http://10.23.0.3:8000/app/index.html

Se 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.service

apriamolo 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-reload

Attiviamo l'avvio automatico:

sudo systemctl enable webogram.service

Avviamo il servizio:

sudo systemctl start webogram.service

Dopo 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 8000

Nel 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 enable

Ora, 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

Avviamo la nostra istanza di Webogram con il proxy tramite nginx

Riavviamo nginx:

sudo systemctl restart nginx

Ora Webogram sarà accessibile solo all'indirizzo mywebogram.localhost/app/index.html 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.

Avviamo la nostra istanza di Webogram con il proxy 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

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster