Ανεβάζουμε την παρουσία μας στο Webogram με διακομιστή μεσολάβησης μέσω nginx

Γεια σου Χαμπρ!

Πρόσφατα βρέθηκα σε μια κατάσταση στην οποία ήταν απαραίτητο να εργαστώ μέσα σε ένα εταιρικό δίκτυο με ελλιπή πρόσβαση στο Διαδίκτυο και, όπως μπορείτε να μαντέψετε από τον τίτλο, το Telegram είχε αποκλειστεί σε αυτό. Είμαι βέβαιος ότι αυτή η κατάσταση είναι γνωστή σε πολλούς.

Μπορώ να κάνω χωρίς instant messenger, αλλά ήταν το Telegram που χρειαζόμουν για τη δουλειά. Δεν ήταν δυνατή η εγκατάσταση του πελάτη σε μηχάνημα εργασίας, ούτε ήταν δυνατή η χρήση προσωπικού φορητού υπολογιστή. Μια άλλη λύση φαίνεται να είναι η χρήση του επίσημη διαδικτυακή έκδοση, αλλά όπως μπορείτε να μαντέψετε, δεν ήταν επίσης διαθέσιμο. Διαγράφω αμέσως την επιλογή αναζήτησης ανεπίσημου καθρέφτη (ελπίζω για ευνόητους λόγους).

Ευτυχώς, το Webogram είναι ένα έργο ανοιχτού κώδικα του οποίου ο πηγαίος κώδικας είναι διαθέσιμος GitHub ο συγγραφέας του (Για τον οποίο τον ευχαριστώ πολύ!)
Η εγκατάσταση και η εκκίνηση από μόνη της δεν είναι δύσκολη, ωστόσο, σε συνθήκες λειτουργίας σε ένα δίκτυο με αποκλεισμένη πρόσβαση σε διακομιστές Telegram, είναι πιο πιθανό να απογοητευτείτε παρά επιτυχημένη, καθώς η έκδοση web στέλνει αιτήματα στους διακομιστές Telegram από το μηχάνημα του χρήστη.

Ευτυχώς, αυτή είναι μια αρκετά απλή (αλλά όχι πολύ προφανής) λύση. Θα ήθελα να σας προειδοποιήσω ότι δεν είμαι ο συγγραφέας αυτής της λύσης. Κατάφερα να το βρω κλαδί, το οποίο συζήτησε ένα πρόβλημα παρόμοιο με το δικό μου. Λύση που προτείνει ο χρήστης του github tecknojock, με βοήθησε πολύ, ωστόσο, είμαι σίγουρος ότι μπορεί να βοηθήσει κάποιον άλλον, γι' αυτό αποφάσισα να γράψω αυτό το σεμινάριο.

Κάτω από την περικοπή θα βρείτε βήμα-βήμα τη ρύθμιση του καθρέφτη Webogram και τη ρύθμιση του proxy των αιτημάτων του σε διακομιστές Telegram χρησιμοποιώντας nginx.

Για παράδειγμα, επέλεξα έναν πρόσφατα εγκατεστημένο και ενημερωμένο διακομιστή Ubuntu 18.04.3.

Внимание: Αυτό το σεμινάριο δεν θα περιλαμβάνει οδηγίες για τη ρύθμιση ενός τομέα στο nginx. Πρέπει να το κάνετε μόνοι σας. Το σεμινάριο προϋποθέτει ότι έχετε ήδη διαμορφώσει έναν τομέα με ssl και ότι ο ίδιος ο διακομιστής στον οποίο σκοπεύετε να τον ρυθμίσετε έχει πρόσβαση στους διακομιστές του Telegram (με όποιον τρόπο θέλετε)

Ας υποθέσουμε ότι η ip αυτού του διακομιστή είναι 10.23.0.3 και το όνομα τομέα είναι mywebogram.localhost

Με βάση αυτές τις συμβάσεις, θα δώσω παραδείγματα διαμορφώσεων. Μην ξεχάσετε να αλλάξετε τις τιμές στις δικές σας.

Ας ξεκινήσουμε λοιπόν:

Για να τρέξουμε το Webogram, χρειαζόμαστε nodejs. Από προεπιλογή, αν το εγκαταστήσουμε από τα αποθετήρια του Ubuntu, θα λάβουμε nodejs έκδοση 8.x. Χρειαζόμαστε 12.x:

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

Επιλέγουμε το μέρος όπου θα βασίζεται το Webogram μας.

Για παράδειγμα, ας το τοποθετήσουμε στη ρίζα του αρχικού καταλόγου. Για να το κάνετε αυτό, κλωνοποιήστε το επίσημο αποθετήριο στον διακομιστή μας:

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

Το επόμενο βήμα είναι να εγκαταστήσετε όλες τις εξαρτήσεις που απαιτούνται για την εκτέλεση της εφαρμογής:

cd webogram && npm install

Ας δοκιμάσουμε μια δοκιμαστική διαδρομή. Εκτελέστε την εντολή:

npm start

Μετά από αυτό, προσπαθούμε να το ανοίξουμε στο πρόγραμμα περιήγησης

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

Εάν μέχρι αυτό το σημείο τα έχετε κάνει όλα σωστά, θα ανοίξει η σελίδα εξουσιοδότησης Webogram.

Τώρα πρέπει να διαμορφώσουμε την εφαρμογή ώστε να εκτελείται ως υπηρεσία. Για να γίνει αυτό, ας δημιουργήσουμε ένα αρχείο

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

ανοίξτε το σε οποιοδήποτε πρόγραμμα επεξεργασίας και δώστε του την ακόλουθη εμφάνιση (εισαγάγετε τη διαδρομή σας στο 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

Στη συνέχεια εκτελούμε τις παρακάτω εντολές:

Εφαρμογή των αλλαγών

sudo systemctl daemon-reload

Ενεργοποίηση αυτόματης εκτέλεσης:

sudo systemctl enable webogram.service

Ας ξεκινήσουμε την υπηρεσία:

sudo systemctl start webogram.service

Μετά την ολοκλήρωση των βημάτων, το Webogram θα συνεχίσει να είναι διαθέσιμο στη θύρα 8000.

Δεδομένου ότι θα ρυθμίσουμε την πρόσβαση στο Webogram μας μέσω nginx, θα κλείσουμε τη θύρα 8000 για αιτήματα από το εξωτερικό.

Χρησιμοποιούμε το βοηθητικό πρόγραμμα udf για αυτό (ή οποιαδήποτε μέθοδο βολική για εσάς):

sudo ufw deny 8000

Σε περίπτωση που εξακολουθείτε να αποφασίσετε να χρησιμοποιήσετε το udf, αλλά είναι απενεργοποιημένο στον διακομιστή, προσθέστε περισσότερους κανόνες (ώστε να μην καταρρέουν όλα) και ενεργοποιήστε το udf:

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

Στη συνέχεια, ας αρχίσουμε να αλλάζουμε τη διαμόρφωση του nginx.

Όπως προειδοποίησα παραπάνω, θεωρείται ότι ένας τομέας με ssl έχει ήδη ρυθμιστεί στον διακομιστή σας. Θα επιστήσω την προσοχή σας μόνο στο τι θα πρέπει να προστεθεί στο αρχείο διαμόρφωσης τομέα για να λειτουργεί σωστά:


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

Τι προσθέτουμε στη διαμόρφωση nginx:

  • Αλλάζουμε τη θέση ρίζας, η οποία θα ζητήσει μεσολάβηση στη θύρα 8000, στην οποία απαντά το Webogram
  • Κλείνουμε τη θέση ρίζας χρησιμοποιώντας το basic-auth. Αυτό είναι ένα καθαρά συμβολικό βήμα για να κλείσουμε την εφαρμογή μας από αδιάκριτα βλέμματα και bots. (Και επίσης για να αποφύγετε προβλήματα με τον αποκλεισμό)
  • Ένα σωρό τοποθεσίες με proxy_path στον διακομιστή Telegram είναι ακριβώς τα τελικά μας σημεία μέσω των οποίων θα μεταφέρουμε τα αιτήματά μας με μεσολάβηση

Επίσης, ας δημιουργήσουμε ένα αρχείο /etc/nginx/passwd.htpasswd;έτσι ώστε το nginx να έχει κάτι για να ελέγξει τους κωδικούς πρόσβασης των χρηστών.

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

Ανεβάζουμε την παρουσία μας στο Webogram με διακομιστή μεσολάβησης μέσω nginx

Επανεκκινήστε το nginx:

sudo systemctl restart nginx

Τώρα το Webogram θα είναι διαθέσιμο μόνο στο mywebogram.localhost/app/index.html αφού εισαχθούν τα στοιχεία σύνδεσης και ο κωδικός πρόσβασης που ορίσατε κατά τη δημιουργία της εντολής htpasswd.

Λίγα μένουν: θα κάνουμε μικρές αλλαγές στο ίδιο το έργο.

Ανοίξτε το αρχείο σε ένα πρόγραμμα επεξεργασίας ~/webogram/app/js/lib/mtproto.js

Και φέρτε την αρχή του στην ακόλουθη μορφή:

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

Μετά από αυτό, πρέπει να ανανεώσετε τη σελίδα της εφαρμογής στο πρόγραμμα περιήγησης.

Ανοίξτε την κονσόλα του προγράμματος περιήγησής σας και δείτε τα αιτήματα δικτύου της εφαρμογής. Εάν όλα λειτουργούν και τα αιτήματα XHR πάνε στον διακομιστή σας, τότε όλα γίνονται σωστά και το Webogram είναι πλέον proxed μέσω nginx.

Ανεβάζουμε την παρουσία μας στο Webogram με διακομιστή μεσολάβησης μέσω nginx

Ελπίζω ότι αυτό το σεμινάριο θα είναι χρήσιμο σε κάποιον άλλο εκτός από εμένα.

Ευχαριστώ πολύ όλους όσους διάβασαν μέχρι το τέλος.

Αν κάποιος έχει κάποια δυσκολία ή έκανα ανακρίβειες, θα χαρώ να απαντήσω και να προσπαθήσω να σας βοηθήσω στα σχόλια ή στο PM.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο