ترقية يدوية خالية من المتاعب من داخل الصين
الخطوات
- إنشاء وكيل SOCKS5 خارج الصين
- إعداد وتكوين اتصال الوكيل على الخادم الصيني
- إنشاء قالب لتسهيل التحرير
- إضافة إعدادات وكيل Git إلى القالب
- تضمين القالب في
app.yml
- إعادة بناء التطبيق
1 - وكيل SOCKS5 عن بُعد
للسهولة في الاستخدام (ولأسعارهم الودية)، أنصح بإعداد خادم Digital Ocean في مكان مثل سنغافورة. استخدم خادم Ubuntu قياسي، واكمل جميع إعدادات الأمان الأساسية (مفاتيح SSH، UFW، وما إلى ذلك)، ثم قم بتثبيت Shadowsocks:
على الخادم البعيد
$ sudo apt install shadowsocks-libev
قم بتكوين إعدادات الوكيل:
$ cd /etc/shadowsocks-libev
# أحب الاحتفاظ بالملفات الأصلية
$ sudo cp config.json orig.config.json
$ sudo nano config.json
انتبه جيدًا لمعاملات المهلة (timeout) وطريقة التشفير (method):
{
"server":"123.123.123.123", # عنوان IP للخادم البعيد
"server_port":8400, # حسب رغبتك
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= ضروري!
"method":"chacha20-ietf-poly1305"
}
تأكد من مراجعة جميع الإعدادات في تكوين systemd (/lib/systemd/system/shadowsocks-libev-local@.service). فعّل خدمة shadowsocks-libev-local@.service، أعد تشغيل الجهاز، وتحقق من تشغيل الخدمة.
2 - إعداد اتصال الوكيل على الخادم الصيني
على جهاز Discourse
$ sudo apt install shadowsocks-libev
إذا كنت تستخدم Aliyun، ابحث عن إعدادات الجدار الناري في لوحة التحكم الخاصة بهم، وتحقق من إعدادات المنفذ (port) المناسبة.
لا داعي للعبث بإعدادات systemd على جهاز العميل، ولكن احتفظ بملفات تكوين منفصلة لاستخدام Docker والاستخدام العادي، حيث قد ترغب في استخدام وكيل SOCKS5 خارج سياق Docker، وبالتالي ستحتاج إلى استخدام 127.0.0.1 بدلاً من عناوين الشبكة القابلة للوصول من Docker.
$ cd /etc/shadowsocks-libev
$ sudo cp config.json local.json
$ sudo cp config.json docker.json
عدّل التكوين ليكون مشابهًا لهذا:
$ sudo nano local.json
{
"server":["123.123.123.123"], # عنوان IP للجهاز البعيد
"mode":"tcp_and_udp", # هذا التعليق يختلف بسبب إصدارات shadowsocks-libev المختلفة في إعداداتي
"server_port":8400,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= تأكد من ذلك
"method":"chacha20-ietf-poly1305"
}
للسهولة، دعنا نضيف اختصارًا (alias) إلى ملف .bashrc:
$ nano ~/.bashrc
# الصق
alias dockershadow='ss-local -c /etc/shadowsocks-libev/local.json'
عدّل التكوين الآخر للسماح لـ Docker بالمرور عبر شبكة الجهاز المضيف:
$ sudo nano docker.json
{
"server":["123.123.123.123"],
"mode":"tcp_and_udp",
"server_port":8400,
"local_address":"172.17.0.1",
"local_port":1080,
"password":"Swordfish",
"timeout":600,
"method":"chacha20-ietf-poly1305"
}
اضبط الاختصار لاستخدام تكوين Docker المحدد:
alias dockershadow='ss-local -c /etc/shadowsocks-libev/docker.json'
3 و 4 - إنشاء قالب للحفاظ على تنظيم ملف app.yml
هذا اختياري تمامًا ويعتمد على ذوقك؛ أنا أفضل إبقاء app.yml مقروءًا وقصيرًا، والحفاظ على المكونات في مكان آخر. أعطِ القالب أي اسم يناسب ذوقك، اخترتُ web.git.template.yml.
$ nano templates/web.git.template.yml
# الصق:
hooks:
before_code:
- exec:
cmd:
- git config --global http.proxy socks5://172.17.0.1:1080
- git config --global https.proxy socks5://172.17.0.1:1080
- git config --global https.sslVerify = false
# اختياري
after_code:
- exec:
cmd:
- git config --global --unset http.proxy
- git config --global --unset https.proxy
- git config --global --unset https.sslVerify
لقد جربته مع الخطاف after_web، لكنه لم ينجح.
5 - تعديل ملف app.yml
استدعِ القالب في ملف app.yml:
$ cd /<discourse dir>
$ sudo nano containers/app.yml
templates:
- "templates/web.template.yml"
- "templates/web.china.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.socketed.template.yml"
- "templates/web.git.template.yml"
من المرجح أن يكون قسم القوالب لديك مختلفًا، فقط تأكد من تضمين web.china و web.git-blabla (أو ما سميته أنت) من القوالب.
لا تعرض المنفذ 1080:1080 في ملف app.yml!
6 - إعادة البناء
قبل إعادة البناء، تأكد من أن إعدادات الوكيل تعمل بشكل صحيح عند النسخ باستخدام git.
$ git config --global http.proxy socks5://172.17.0.1:1080
$ git config --global https.proxy socks5://172.17.0.1:1080
$ git config --global https.sslVerify = false
هذا بالطبع يضيف أعلام الوكيل إلى ملف .gitconfig الخاص بالمستخدم في الدليل الرئيسي، لذا انتبه لإزالتها بعد الاختبار.
اختر مستودعًا كبيرًا عشوائيًا على Github يحتوي على عدد كبير من الملفات، وتحقق من سرعة النسخ. إذا كانت إعداداتك صحيحة، يجب أن تتمكن من النسخ بسرعة تقارب 12-15 ميجابايت/ثانية، اعتمادًا على إعدادات Aliyun لديك. إذا كانت سرعة اتصالك تتصاعد ببطء من 200 كيلوبايت/ثانية إلى حوالي 10 ميجابايت/ثانية، فإن جهودك لم تنجح.
أخيرًا، أعد البناء:
$ cd /<discourse directory>
# شغل الوكيل باستخدام الاختصار الذي ضبطناه سابقًا
$ dockershadow
$ ./launcher rebuild app
ستفشل عملية إعادة البناء في كثير من الأحيان، لذا تحتاج إلى الصبر (وربما مشروب Baijiu). كلما قل عدد الإضافات (plugins) المحددة في ملف app.yml، زادت احتمالية نجاح إعادة البناء.
7 - ملاحظات
ما زلت أعتبر هذا حلاً مؤقتًا وليس إجراءً جاهزًا للإنتاج، لذا ربما يكون لدى شخص ما فكرة حول كيفية عكس (mirror) مستودع GitHub في الصين، لجعل هذه العملية أقل إيلامًا. وكما نعلم جميعًا، تتغير آليات GFW غير الشفافة باستمرار.
بالطبع، وكيل SOCKS5 هو مجرد واحد من العديد من الخيارات، لكنني أحب وجود حلول متعددة الاستخدامات تحت تصرفي.
إذا كان لدى أي شخص فكرة حول كيفية جعل هذا الحل المؤقت جاهزًا للإنتاج، فسأقدر مساهمتك. إن Discourse برنامج رائع، لكنني أفترض أن أحد أسباب عدم استخدامه على نطاق واسع في الصين هو عمليات التثبيت والصيانة المزعجة. لقد أعطتني محاولة الترقية عبر واجهة المستخدم الرسومية (GUI) نسبة فشل 100% خلال العام الماضي، بغض النظر عن إعدادات المهلة التي قمت بتكوينها في وكيل العكس (reverse proxy) الخاص بـ nGinx.
سيتم تقديم الترجمة الصينية قريبًا