رفع مثيل Webogram الخاص بك عن طريق الوكيل عبر nginx

مرحبا يا هابر!

لقد دخلت مؤخرًا في وضع كان من الضروري فيه العمل داخل شبكة الشركة مع وصول غير كامل إلى الإنترنت ، وكما يمكنك التخمين من العنوان الرئيسي ، تم حظر Telegram فيه. أنا متأكد من أن هذا الوضع مألوف للكثيرين.

يمكنني الاستغناء عن الرسل ، ومع ذلك ، فقد كنت بحاجة إلى Telegram للعمل. لم يكن من الممكن تثبيت العميل على جهاز يعمل ، ولا استخدام كمبيوتر محمول شخصي. يبدو أن هناك حلًا آخر يتمثل في استخدام إصدار الويب الرسمي الخاص بها ، ولكن كما يمكنك تخمينه ، فإنه لم يكن متاحًا أيضًا. أحذف الخيار على الفور بالبحث عن مرآة غير رسمية (آمل لأسباب واضحة).

لحسن الحظ ، يعد Webogram مشروعًا مفتوح المصدر ، يتوفر كود المصدر الخاص به على githubمؤلفها (الذي يشكره
كثيرًا !) التثبيت والتشغيل في حد ذاته ليس أمرًا مهمًا ، ومع ذلك ، في حالة التشغيل داخل الشبكة مع حظر الوصول إلى خوادم Telegram ، فمن المرجح أن تشعر بخيبة أمل من النجاح ، نظرًا لأن إصدار الويب يرسل طلبات لـ خوادم برقية من جهاز المستخدم.

لحسن الحظ ، هذا الأمر بسيط جدًا (ولكن ليس واضحًا جدًا) لإصلاحه. أريد أن أحذرك من أنني لست مؤلف هذا الحل. تمكنت من العثور عليها في موضوع ناقش مشكلة مشابهة لمشكلتي. ساعدني الحل الذي اقترحه المستخدم github tecknojock كثيرًا ، ومع ذلك ، أنا متأكد من أنه يمكن أن يساعد شخصًا آخر ، لذلك قررت كتابة هذا البرنامج التعليمي.

ستجد تحت القطة تكوينًا خطوة بخطوة لمرآة Webogram وإعدادات الوكيل الخاصة بطلباتها إلى خوادم 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 للطلبات من الخارج.

نحن نستخدم أداة UUD (أو أي طريقة مناسبة لك) لهذا الغرض:

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
  • أغلق موقع الجذر باستخدام المصادقة الأساسية. هذه خطوة رمزية بحتة لإغلاق تطبيقنا من أعين المتطفلين والبوتات. (وأيضاً أنه لم تكن هناك مشاكل مع الأقفال)
  • كومة الموقع مع proxy_path على خادم Telegram ليست سوى نقاط النهاية التي سنقوم من خلالها ببرمجة طلباتنا

أيضًا ، قم بإنشاء ملف /etc/nginx/passwd.htpasswd;بحيث يحتوي nginx على شيء للمقارنة بين كلمات مرور المستخدم.

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

صورة

إعادة تشغيل 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 <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
      }
...
 

بعد ذلك ، تحتاج إلى تحديث الصفحة بالتطبيق في المتصفح.

افتح وحدة تحكم المستعرض وشاهد طلبات الشبكة للتطبيق. إذا كان كل شيء يعمل ، وطلبات XHR تذهب إلى الخادم الخاص بك ، فإن كل شيء يتم بشكل صحيح ، ويتم الآن تشغيل Webogram عبر nginx.



آمل أن يكون هذا البرنامج التعليمي مفيدًا لشخص آخر غيري.

شكرا جزيلا لكل من قرأ حتى النهاية.

إذا واجه شخص ما أي صعوبات أو قمت ببعض عدم الدقة - سأكون سعيدًا للإجابة ومحاولة مساعدتك في التعليقات أو PM.

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


All Articles