يا هبر!
لقد وجدت نفسي مؤخرًا في موقف كان من الضروري فيه العمل داخل شبكة شركة مع وصول غير كامل إلى الإنترنت، وكما يمكنك تخمينه من العنوان، تم حظر Telegram فيه. أنا متأكد من أن هذا الوضع مألوف لدى الكثيرين.
يمكنني الاستغناء عن برامج المراسلة الفورية، لكن Telegram هو ما أحتاجه للعمل. لم يكن من الممكن تثبيت العميل على جهاز العمل، كما لم يكن من الممكن استخدام جهاز كمبيوتر محمول شخصي. يبدو أن الحل الآخر هو استخدامه
لحسن الحظ، Webogram هو مشروع مفتوح المصدر يتوفر كود المصدر فيه
التثبيت والتشغيل بحد ذاته ليس بالأمر الصعب، ولكن في ظروف التشغيل داخل شبكة ذات وصول محظور إلى خوادم Telegram، من المرجح أن تصاب بخيبة أمل أكثر من النجاح، لأن إصدار الويب يرسل طلبات إلى خوادم Telegram من جهاز المستخدم.
لحسن الحظ، يعد هذا حلًا بسيطًا إلى حد ما (لكنه ليس واضحًا جدًا). أود أن أحذرك أنني لست مؤلف هذا الحل. تمكنت من العثور عليه في
ستجد أسفل المقطع إعدادًا خطوة بخطوة لمرآة 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
إعادة تشغيل nginx:
sudo systemctl restart nginx
الآن سيكون Webogram متاحًا فقط على
لم يتبق سوى القليل: سنقوم بإجراء تغييرات صغيرة على المشروع نفسه.
افتح الملف في المحرر ~/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.
آمل أن يكون هذا البرنامج التعليمي مفيدًا لشخص آخر غيري.
شكرا جزيلا لكل من قرأ حتى النهاية.
إذا واجه أي شخص أي صعوبات أو قمت بأي أخطاء، سأكون سعيدًا بالإجابة ومحاولة مساعدتك في التعليقات أو في PM.
المصدر: www.habr.com