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

يا هبر!

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

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

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

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

ستجد أسفل المقطع إعدادًا خطوة بخطوة لمرآة Webogram الخاصة بك وإعداد وكيل طلباتها إلى خوادم Telegram باستخدام nginx.

على سبيل المثال، اخترت خادم Ubuntu Server 18.04.3 المثبت حديثًا والمحدث.

ملاحظة: لن يتضمن هذا البرنامج التعليمي تعليمات حول إعداد مجال في nginx. عليك أن تفعل هذا بنفسك. يفترض البرنامج التعليمي أنك قمت بالفعل بتكوين مجال باستخدام SSL، وأن الخادم نفسه الذي تخطط لتكوينه عليه لديه حق الوصول إلى خوادم Telegram (بأي طريقة تريدها)

لنفترض أن عنوان IP لهذا الخادم هو 10.23.0.3، واسم المجال هو mywebogram.localhost

وبناء على هذه الاتفاقيات، سأقدم أمثلة على التكوينات. لا تنس تغيير القيم الخاصة بك.

اذا هيا بنا نبدأ:

لتشغيل Webgram، نحتاج إلى ملف nodejs. افتراضيًا، إذا قمنا بتثبيته من مستودعات Ubuntu، فسنحصل على الإصدار 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

بعد إكمال الخطوات، سيظل Webgram متاحًا على المنفذ 8000.

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

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

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

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

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

المصدر: www.habr.com

إضافة تعليق