Aumente su instancia de Webogram con proxy a través de nginx

Hola Habr!

Recientemente me metí en una situación en la que era necesario trabajar dentro de una red corporativa con acceso incompleto a Internet y, como se puede adivinar en el titular, Telegram estaba bloqueado. Estoy seguro de que esta situación es familiar para muchos.

Puedo prescindir de mensajeros, sin embargo, era Telegram lo que necesitaba para trabajar. No fue posible instalar el cliente en una máquina que funciona, ni utilizar una computadora portátil personal. Parece que otra solución es usar su versión web oficial , pero como puedes adivinar, tampoco estaba disponible. Inmediatamente borro la opción con la búsqueda de un espejo no oficial (espero por razones obvias).

Afortunadamente, Webogram es un proyecto de código abierto, cuyo código fuente está disponible en githubsu autor (¡por lo que
muchas gracias a él!) La instalación y el lanzamiento en sí no son un gran problema, sin embargo, en el caso de la operación dentro de la red con acceso bloqueado a los servidores de Telegram, es más probable que se sienta decepcionado que exitoso, ya que la versión web envía solicitudes para Servidores de Telegram desde la máquina del usuario.

Afortunadamente, esto es bastante simple (pero no muy obvio) de solucionar. Quiero advertirle que no soy el autor de esta solución. Logré encontrarlo en un hilo que discutía un problema similar al mío. La solución sugerida por el usuario github tecknojock me ayudó mucho, sin embargo, estoy seguro de que puede ayudar a alguien más, así que decidí escribir este tutorial.

Debajo del gato, encontrará una configuración paso a paso de su espejo Webogram y la configuración del proxy de sus solicitudes a los servidores de Telegram utilizando nginx.

Como ejemplo, seleccioné el Ubuntu Server 18.04.3 recién instalado y actualizado.

Nota: en este tutorial no habrá instrucciones para configurar un dominio en nginx. Esto debe hacerse de forma independiente. El tutorial asume que ya ha configurado un dominio con ssl, y que el servidor en el que planea configurar tiene acceso a los servidores de Telegram (de la forma que desee).

Suponga que la IP de este servidor es 10.23.0.3 y el nombre de dominio es mywebogram. localhost

Basado en estas convenciones, daré ejemplos de configuraciones. No olvides cambiar los valores a los tuyos.

Así que

aquí vamos : para ejecutar Webogram, necesitamos nodejs. Por defecto, si lo instala desde los repositorios de Ubuntu, obtenemos la versión 8.x de nodejs. Necesitamos 12.x:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - 
sudo apt update && sudo apt -y install nodejs

Elegimos el lugar donde se basará nuestro Webogram.

Por ejemplo, lo colocaremos en la raíz de un directorio de inicio. Para hacer esto, clonamos el repositorio oficial en nuestro servidor:

cd ~ && git clone https://github.com/zhukov/webogram.git

El siguiente paso es instalar todas las dependencias necesarias para ejecutar la aplicación:

cd webogram && npm install

Intentemos ejecutar una prueba de funcionamiento. Ejecute el comando:

npm start

Después de lo cual, intentamos abrir en el navegador

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

Si hasta este punto hiciste todo correctamente, se abrirá tu página de autorización de Webogram.

Ahora necesitamos configurar el lanzamiento de la aplicación como un servicio. Para hacer esto, cree un archivo

sudo touch /lib/systemd/system/webogram.service

ábralo en cualquier editor y dé el siguiente aspecto (ingrese su ruta 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

Luego ejecutamos los siguientes comandos:

aplicar los cambios

sudo systemctl daemon-reload

Active el inicio automático:

sudo systemctl enable webogram.service

Iniciamos el servicio:

sudo systemctl start webogram.service

Después de completar los pasos, el Webogram continuará estando disponible en el puerto 8000.

Dado que configuraremos el acceso a nuestro Webogram a través de nginx, cerraremos el puerto 8000 para solicitudes desde el exterior.

Para esto utilizamos la utilidad udf (o cualquier método conveniente para usted):

sudo ufw deny 8000

En caso de que todavía decida usar udf, pero está apagado en el servidor, agregue más reglas (para que no todo se desmorone) y encienda udf:

sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

A continuación, cambiemos la configuración de nginx.

Como advertí anteriormente, se supone que un dominio con SSL ya está configurado en su servidor. Llamaré su atención solo al hecho de que será necesario agregar al archivo de configuración del dominio para la operación correcta:


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;
  }
}

Lo que agregamos a la configuración de nginx:

  • Cambiamos la ubicación raíz, que enviará las solicitudes al puerto 8000, al que Webogram responde
  • Cierre la ubicación raíz con basic-auth. Este es un paso puramente simbólico para cerrar nuestra aplicación de miradas indiscretas y bots. (Y también que no hubo problemas con las cerraduras)
  • El montón de ubicación con proxy_path en el servidor de Telegram son solo nuestros puntos finales a través de los cuales enviaremos un proxy a nuestras solicitudes

Además, cree un archivo /etc/nginx/passwd.htpasswd;para que nginx tenga algo con lo que comparar las contraseñas de los usuarios.

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg

imagen

Reinicie nginx:

sudo systemctl restart nginx

Ahora Webogram estará disponible solo en mywebogram.localhost / app / index.html después de ingresar el nombre de usuario y la contraseña que definió al crear el comando htpasswd.

Queda poco: hacer pequeños cambios en el proyecto en sí.

Abra el archivo en el editor ~/webogram/app/js/lib/mtproto.js

y lleve su comienzo al siguiente formulario:

/*!
 * 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
      }
...
 

Después de eso, debe actualizar la página con la aplicación en el navegador.

Abra la consola del navegador y vea las solicitudes de red de la aplicación. Si todo funciona y las solicitudes XHR van a su servidor, entonces todo se hace correctamente y Webogram ahora se representa a través de nginx.



Espero que este tutorial sea útil para otra persona además de mí.

Muchas gracias a todos los que leyeron hasta el final.

Si alguien tiene dificultades o hice algunas imprecisiones, estaré encantado de responder y tratar de ayudarlo en los comentarios o PM.

Source: https://habr.com/ru/post/undefined/


All Articles