Augmentez votre instance de Webogram avec proxy via nginx

Bonjour, Habr!

Je me suis récemment retrouvé dans une situation dans laquelle il était nécessaire de travailler à l'intérieur d'un réseau d'entreprise avec un accès incomplet à Internet et, comme vous pouvez le deviner d'après le titre, Telegram y était bloqué. Je suis sûr que cette situation est familière à beaucoup.

Je peux me passer de messagers, cependant, c'est le télégramme dont j'avais besoin pour travailler. Il n'a pas été possible d'installer le client sur une machine en état de marche, ni d'utiliser un ordinateur portable personnel. Une autre solution semble être d'utiliser sa version Web officielle , mais comme vous pouvez le deviner, elle n'était pas non plus disponible. Je supprime immédiatement l'option avec la recherche d'un miroir non officiel (j'espère pour des raisons évidentes).

Heureusement, Webogram est un projet open source dont le code source est disponible sur githubson auteur (Pour qui merci
beaucoup à lui!) L'installation et le lancement lui-même ne sont pas un gros problème, cependant, dans le cas d'un fonctionnement à l'intérieur du réseau avec un accès bloqué aux serveurs Telegram, vous serez plus probablement déçu que réussi, car la version Web envoie des demandes de Serveurs de télégramme de la machine de l'utilisateur.

Heureusement, c'est assez simple (mais pas très évident) à corriger. Je tiens à vous avertir que je ne suis pas l'auteur de cette solution. J'ai réussi à le trouver dans un fil qui parlait d'un problème similaire au mien. La solution suggérée par l'utilisateur github tecknojock m'a beaucoup aidé, cependant, je suis sûr qu'elle peut aider quelqu'un d'autre, j'ai donc décidé d'écrire ce tutoriel.

Sous le chat, vous trouverez une configuration étape par étape de votre miroir Webogram et les paramètres proxy de ses demandes aux serveurs Telegram utilisant nginx.

Par exemple, j'ai sélectionné le serveur Ubuntu 18.04.3 qui vient d'être installé et mis à jour.

Remarque: Dans ce didacticiel, il n'y aura pas d'instructions pour configurer un domaine dans nginx. Cela doit être fait indépendamment. Le didacticiel suppose que vous avez déjà configuré un domaine avec ssl, ainsi que le serveur sur lequel vous prévoyez de configurer, a accès aux serveurs Telegram (comme vous le souhaitez)

Supposons que l'IP de ce serveur est 10.23.0.3 et que le nom de domaine est mywebogram. localhost

Sur la base de ces conventions, je vais donner des exemples de configurations. N'oubliez pas de modifier les valeurs en fonction des vôtres.

Alors

c'est parti : Pour exécuter Webogram, nous avons besoin de nodejs. Par défaut, si vous l'installez à partir des référentiels Ubuntu, nous obtenons la version 8.x de nodejs. Nous avons besoin de 12.x:

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

Nous choisissons l'endroit où notre Webogram sera basé.

Pour un exemple - nous le placerons à la racine d'un répertoire personnel. Pour ce faire, nous clonons le référentiel officiel sur notre serveur:

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

L'étape suivante consiste à installer toutes les dépendances nécessaires pour exécuter l'application:

cd webogram && npm install

Essayons d'exécuter un test. Exécutez la commande:

npm start

Après quoi, nous essayons d'ouvrir dans le navigateur

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

Si jusqu'à présent vous avez tout fait correctement, votre page d'autorisation Webogram s'ouvrira.

Nous devons maintenant configurer le lancement de l'application en tant que service. Pour ce faire, créez un fichier

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

ouvrez-le dans n'importe quel éditeur et donnez le look suivant (entrez votre chemin vers 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

Ensuite, nous exécutons les commandes suivantes:

Appliquer les modifications

sudo systemctl daemon-reload

Activer le démarrage automatique:

sudo systemctl enable webogram.service

Nous commençons le service:

sudo systemctl start webogram.service

Une fois les étapes franchies, Webogram continuera d'être disponible sur le port 8000.

Comme nous allons configurer l'accès à notre Webogram via nginx, nous fermerons le port 8000 pour les demandes provenant de l'extérieur.

Pour cela, nous utilisons l'utilitaire udf (ou toute méthode qui vous convient):

sudo ufw deny 8000

Dans le cas où vous décidez toujours d'utiliser udf, mais il est désactivé sur le serveur - ajoutez plus de règles (pour que tout ne s'effondre pas) et activez udf:

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

Ensuite, changeons la configuration de nginx.

Comme je l'ai averti ci-dessus - il est supposé qu'un domaine avec SSL est déjà configuré sur votre serveur. Je n'attirerai votre attention que sur le fait qu'il faudra ajouter au fichier de configuration du domaine pour un fonctionnement correct:


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

Ce que nous ajoutons à la configuration nginx:

  • Nous changeons l'emplacement racine, qui procurera des requêtes par proxy au port 8000, auquel Webogram répond
  • Fermez l'emplacement racine avec basic-auth. Il s'agit d'une étape purement symbolique pour fermer notre application des regards indiscrets et des robots. (Et aussi qu'il n'y avait aucun problème avec les serrures)
  • Le tas d'emplacement avec proxy_path sur le serveur Telegram n'est que nos points de terminaison à travers lesquels nous allons proxy nos demandes

Créez également un fichier /etc/nginx/passwd.htpasswd;pour que nginx puisse comparer les mots de passe des utilisateurs.

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

image

Redémarrez nginx:

sudo systemctl restart nginx

Désormais, Webogram sera disponible uniquement sur mywebogram.localhost / app / index.html après avoir entré le login et le mot de passe que vous avez définis lors de la création de la commande htpasswd.

Il ne reste plus grand chose: apportez de petites modifications au projet lui-même.

Ouvrez le fichier dans l'éditeur ~/webogram/app/js/lib/mtproto.js

et amenez son début sous la forme suivante:

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

Après cela, vous devez actualiser la page avec l'application dans le navigateur.

Ouvrez la console du navigateur et consultez les requêtes réseau de l'application. Si tout fonctionne et que les demandes XHR sont envoyées à votre serveur, tout se fait correctement et Webogram est désormais mandaté via nginx.



J'espère que ce tutoriel sera utile à quelqu'un d'autre que moi.

Un grand merci à tous ceux qui ont lu jusqu'à la fin.

Si quelqu'un a des difficultés ou que j'ai fait des inexactitudes - je serai heureux de répondre et d'essayer de vous aider dans les commentaires ou PM.

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


All Articles