Nous élevons notre instance Webogram avec un proxy via nginx

Hé Habr !

Récemment, je me suis retrouvé dans une situation dans laquelle il était nécessaire de travailler au sein 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 des messageries instantanées, mais c'était Telegram dont j'avais besoin pour travailler. Il n'était pas possible d'installer le client sur une machine de travail, ni d'utiliser un ordinateur portable personnel. Une autre solution semble être de l'utiliser version Web officielle, mais comme vous pouvez le deviner, il n’était pas non plus disponible. Je biffe immédiatement l'option de 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 en github son auteur (Pour lequel un grand merci à lui !)
L'installation et le lancement lui-même ne sont pas difficiles, cependant, dans des conditions de fonctionnement au sein d'un réseau avec accès bloqué aux serveurs Telegram, vous serez plus susceptible d'être déçu que réussi, puisque la version web envoie des requêtes aux serveurs Telegram depuis la machine de l'utilisateur.

Heureusement, il s’agit d’une solution assez simple (mais pas très évidente). Je tiens à vous prévenir que je ne suis pas l'auteur de cette solution. J'ai réussi à le trouver dans branche, qui discutait d'un problème similaire au mien. Solution suggérée par l'utilisateur de github tecknojock, cela m'a beaucoup aidé, cependant, je suis sûr que cela peut aider quelqu'un d'autre, j'ai donc décidé d'écrire ce tutoriel.

Sous la coupe, vous trouverez la configuration étape par étape de votre miroir Webogram et la configuration du proxy de ses requêtes vers les serveurs Telegram à l'aide de nginx.

À titre d'exemple, j'ai choisi un serveur Ubuntu 18.04.3 fraîchement installé et mis à jour.

Attention: Ce didacticiel n'inclura pas d'instructions sur la configuration d'un domaine dans nginx. Vous devez le faire vous-même. Le tutoriel suppose que vous avez déjà configuré un domaine avec SSL et que le serveur lui-même sur lequel vous envisagez de le configurer a accès aux serveurs Telegram (de la manière que vous souhaitez)

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

Sur la base de ces conventions, je donnerai des exemples de configurations. N'oubliez pas de remplacer les valeurs par les vôtres.

Commençons donc:

Pour exécuter Webogram, nous avons besoin de nodejs. Par défaut, si nous l'installons à partir des référentiels Ubuntu, nous obtiendrons 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 le lieu où sera basé notre Webogram.

Par exemple, plaçons-le à la racine du répertoire personnel. Pour cela, clonez le dépôt officiel sur notre serveur :

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

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

cd webogram && npm install

Essayons un test. Exécutez la commande :

npm start

Après cela, nous essayons de l'ouvrir dans le navigateur

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

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

Nous devons maintenant configurer l'application pour qu'elle s'exécute en tant que service. Pour ce faire, créons un fichier

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

ouvrez-le dans n'importe quel éditeur et donnez-lui l'apparence suivante (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 l'exécution automatique :

sudo systemctl enable webogram.service

Commençons le service :

sudo systemctl start webogram.service

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

Puisque nous allons mettre en place l'accès à notre Webogram via nginx, nous fermerons le port 8000 pour les demandes extérieures.

Nous utilisons pour cela l'utilitaire udf (ou toute autre méthode qui vous convient) :

sudo ufw deny 8000

Si vous décidez toujours d'utiliser udf, mais qu'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, commençons à modifier la configuration de nginx.

Comme je l'ai prévenu plus haut, on suppose qu'un domaine avec SSL est déjà configuré sur votre serveur. J'attirerai seulement votre attention sur ce qui devra être ajouté au fichier de configuration du domaine pour qu'il fonctionne correctement :


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 modifions l'emplacement racine, ce qui transmettra les requêtes au port 8000, sur lequel Webogram répond
  • Nous fermons l'emplacement racine en utilisant basic-auth. Il s'agit d'une étape purement symbolique pour fermer notre application aux regards indiscrets et aux robots. (Et aussi pour éviter les problèmes de blocage)
  • Un certain nombre d'emplacements avec proxy_path sur le serveur Telegram sont exactement nos points de terminaison via lesquels nous transmettrons nos requêtes.

Créons également un fichier /etc/nginx/passwd.htpasswd;afin que nginx ait quelque chose pour vérifier les mots de passe des utilisateurs.

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

Nous élevons notre instance Webogram avec un proxy via nginx

Redémarrez nginx :

sudo systemctl restart nginx

Désormais, Webogram ne sera disponible que sur monwebogram.localhost/app/index.html après avoir saisi 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 : nous apporterons de petites modifications au projet lui-même.

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

Et ramenez 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 <[email protected]>
 * 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 de l'application dans le navigateur.

Ouvrez la console de votre navigateur et examinez les requêtes réseau de l'application. Si tout fonctionne et que les requêtes XHR arrivent sur votre serveur, alors tout est fait correctement et Webogram est désormais proxy via nginx.

Nous élevons notre instance Webogram avec un proxy 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'au bout.

Si quelqu'un a des difficultés ou si j'ai commis des inexactitudes, je me ferai un plaisir de répondre et d'essayer de vous aider dans les commentaires ou en MP.

Source: habr.com

Ajouter un commentaire