ما نمونه وب‌گرام خود را با پروکسی از طریق nginx بالا می‌بریم

هی هابر!

اخیراً در شرایطی قرار گرفتم که لازم بود در یک شبکه شرکتی با دسترسی ناقص به اینترنت کار کنم و همانطور که از عنوان آن حدس می زنید، تلگرام در آن مسدود شده بود. من مطمئن هستم که این وضعیت برای بسیاری آشنا است.

من می توانم بدون پیام رسان فوری کار کنم، اما این تلگرام بود که برای کار به آن نیاز داشتم. نه امکان نصب کلاینت بر روی دستگاه کار وجود داشت و نه امکان استفاده از لپ تاپ شخصی وجود داشت. به نظر می رسد راه حل دیگر استفاده از آن باشد نسخه رسمی وب، اما همانطور که می توانید حدس بزنید، آن نیز در دسترس نبود. من بلافاصله گزینه جستجوی یک آینه غیر رسمی را خط می زنم (امیدوارم به دلایل واضح).

خوشبختانه، Webogram یک پروژه منبع باز است که کد منبع آن در دسترس است گیتهاب نویسنده آن (که از او بسیار سپاسگزارم!)
نصب و راه اندازی به خودی خود دشوار نیست، با این حال، در شرایط عملکرد در یک شبکه با دسترسی مسدود شده به سرورهای تلگرام، احتمال ناامید شدن شما بیشتر از موفقیت خواهد بود، زیرا نسخه وب درخواست ها را از دستگاه کاربر به سرورهای تلگرام ارسال می کند.

خوشبختانه، این یک راه حل نسبتا ساده (اما نه خیلی واضح) است. من می خواهم به شما هشدار دهم که من نویسنده این راه حل نیستم. من موفق شدم آن را در آن پیدا کنم شاخه، که مشکلی مشابه من را مورد بحث قرار داد. راه حل پیشنهادی توسط کاربر github تکنوجوک، خیلی به من کمک کرد، با این حال، مطمئن هستم که می تواند به شخص دیگری کمک کند، بنابراین تصمیم گرفتم این آموزش را بنویسم.

در زیر برش، تنظیمات گام به گام آینه وب‌گرام و راه‌اندازی پروکسی درخواست‌های آن به سرورهای تلگرام با استفاده از nginx را خواهید دید.

به عنوان مثال، من یک سرور اوبونتو 18.04.3 تازه نصب شده و به روز شده را انتخاب کردم.

هشدار: این آموزش شامل دستورالعمل هایی در مورد راه اندازی دامنه در nginx نخواهد بود. باید خودتان این کار را انجام دهید. در این آموزش فرض می شود که شما قبلاً دامنه ای را با ssl پیکربندی کرده اید و خود سروری که قصد دارید آن را پیکربندی کنید به سرورهای تلگرام (به هر شکلی که دوست دارید) دسترسی دارد.

فرض کنید ip این سرور 10.23.0.3 و نام دامنه mywebogram.localhost است.

بر اساس این قراردادها، من نمونه هایی از پیکربندی ها را بیان می کنم. فراموش نکنید که مقادیر را به ارزش خود تغییر دهید.

بیایید شروع کنیم:

برای اجرای Webogram به nodej نیاز داریم. به طور پیش فرض، اگر آن را از مخازن اوبونتو نصب کنیم، نسخه 8.x nodejs را دریافت خواهیم کرد. ما به 12.x نیاز داریم:

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

ما مکانی را انتخاب می‌کنیم که وب‌گرام ما در آن مستقر شود.

به عنوان مثال، اجازه دهید آن را در ریشه فهرست اصلی قرار دهیم. برای انجام این کار، مخزن رسمی را در سرور ما کلون کنید:

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

فعال کردن autorun:

sudo systemctl enable webogram.service

بیایید سرویس را شروع کنیم:

sudo systemctl start webogram.service

پس از انجام مراحل، Webogram همچنان در پورت 8000 در دسترس خواهد بود.

از آنجایی که ما دسترسی به وب‌گرام خود را از طریق 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 می بندیم. این یک گام کاملا نمادین برای بستن برنامه ما از چشمان کنجکاو و ربات ها است. (و همچنین برای جلوگیری از مشکلات مسدود کردن)
  • مجموعه ای از مکان ها با proxy_path در سرور تلگرام دقیقاً نقاط پایانی ما هستند که از طریق آنها درخواست های خود را پراکسی می کنیم.

همچنین، اجازه دهید یک فایل ایجاد کنیم /etc/nginx/passwd.htpasswd;به طوری که nginx چیزی برای بررسی رمزهای عبور کاربر داشته باشد.

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

ما نمونه وب‌گرام خود را با پروکسی از طریق 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 پروکسی شده است.

ما نمونه وب‌گرام خود را با پروکسی از طریق nginx بالا می‌بریم

امیدوارم این آموزش برای شخص دیگری غیر از من مفید واقع شود.

با تشکر فراوان از همه کسانی که تا آخر خواندند.

اگر کسی مشکلی دارد یا من اشتباهی گفته ام خوشحال می شوم جواب بدهم و سعی می کنم در نظرات یا پی ام به شما کمک کنم.

منبع: www.habr.com

اضافه کردن نظر