كيف أقوم بإعادة بناء app باستخدام host network بدلاً من docker network؟

مرحبًا،

في بعض الأحيان، عند إجراء ترقيات عبر واجهة المستخدم الويب، يخبرني Discourse بتشغيل:

cd /var/discourse
git pull
./launcher rebuild app

بما أن عملية rebuild تتصل بـ GitHub عدة مرات، وGitHub محجوز جزئيًا في الصين حيث يستضيف خادمي، يجب عليّ إعداد وكيل HTTP/HTTPS للوصول إلى GitHub بشكل أفضل. إليك مقارنة بين زيارة YouTube بدون وكيل وبه:

root@iosre:/var/discourse# wget https://youtube.com
--2021-06-10 23:55:05--  https://youtube.com/
Resolving youtube.com (youtube.com)... 66.220.152.17, 2001::3d6f:fadc
Connecting to youtube.com (youtube.com)|66.220.152.17|:443... ^C
root@iosre:/var/discourse# export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
root@iosre:/var/discourse# wget https://youtube.com
--2021-06-10 23:56:12--  https://youtube.com/
Connecting to 127.0.0.1:7890... connected.
Proxy request sent, awaiting response... 301 Moved Permanently
Location: https://www.youtube.com/ [following]
--2021-06-10 23:56:13--  https://www.youtube.com/
Connecting to 127.0.0.1:7890... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: 'index.html'

index.html [  <=  ] 510.58K   813KB/s    in 0.6s    

2021-06-10 23:56:14 (813 KB/s) - 'index.html' saved [522830]

ومع ذلك، عند تشغيل ./launcher rebuild image، يدخل السكربت إلى التطبيق ويؤدي جميع العمليات داخل Docker، حيث تختلف بيئة الشبكة عن المضيف الذي يستخدم الوكيل، ولا يمكنني الوصول إلى YouTube، لذا تفشل عملية rebuild في معظم الأحيان.

root@iosre:/var/discourse# ./launcher enter app
root@iosre-app:/var/www/discourse# wget https://youtube.com
--2021-06-10 15:59:57--  https://youtube.com/
Resolving youtube.com (youtube.com)... 69.171.248.128, 2001::d238:33c1
Connecting to youtube.com (youtube.com)|69.171.248.128|:443... ^C
root@iosre-app:/var/www/discourse# export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
root@iosre-app:/var/www/discourse# wget https://youtube.com
--2021-06-10 16:00:10--  https://youtube.com/
Connecting to 127.0.0.1:7890... failed: Connection refused.

سؤالي هو: ما الذي يمكنني فعله لاستخدام وكيل المضيف داخل Docker، خاصة في ./launcher rebuild app؟

إعجابَين (2)

ربما تطلع على Replace rubygems.org with taobao mirror to resolve network error in China

هناك أيضًا قالب للصين يمكنك تضمينه. يمكنك رؤيته في مجلد القوالب. لست متأكدًا تمامًا من وظيفته.

(هذه ليست إجابة رائعة، لكن مرّ يومان ولم تكن لديك أي إجابة حتى الآن.)

4 إعجابات

شكرًا لك يا جاي! يعكس قالب الصين موقع rubygems.org عبر gems.ruby-china.com، الذي يستضيفه taobao/alibaba.

مستوحى من هذه الفكرة، سأحاول إنشاء نسخة طبق الأصل من github.com باستخدام موقع محلي، على أمل أن يستضيفه alibaba أيضًا.

3 إعجابات

مرحبًا @snakeninny، إذا فهمت السؤال بشكل صحيح، فقد تحتاج إلى شيء مثل هذا:

/var/discourse/launcher rebuild app --docker-args --net=host --skip-mac-address

في هذه الحالة، ربما تحتاج إلى تعديل ملف app.yml، وقسم expose (فقط تحقق من netstat -ltupen للعثور على منفذ الاستماع الفعلي للحاوية).

إعجابَين (2)

شكرًا لك يا إيفان! لقد قمت بذلك، لكنني لم أقم بتعديل ملف app.yml لإظهار القسم. كيف يمكنني فعل ذلك؟

إعجاب واحد (1)

افتح ملف app.yml الخاص بالحاويات باستخدام محرر نصوص وابحث عن “expose”.

إعجاب واحد (1)

يمكنني رؤية هذا في قسم expose في ملف app.yml:

expose:
  - "30080:80"   # تحويل منفذ المضيف 80 إلى منفذ الحاوية 80 (http)
  - "2222:22" # تحويل منفذ المضيف 2222 إلى منفذ الحاوية 22 (ssh)

هل أحتاج إلى تحويل منفذ المضيف 443 (https) إلى منفذ الحاوية؟ وإلى أي منفذ حاوية يجب أن أحول؟

إعجاب واحد (1)

ألم يكن هذا يعمل من قبل؟ أتوقع أن عكسك الوكيل يقوم بأشياء متعلقة بـ HTTPS.

إعجاب واحد (1)

لا، لم يحدث ذلك. كما شرحت، يمكنني الوصول إلى YouTube على المضيف، لكن ليس داخل Docker.

إعجاب واحد (1)

إعدادك معقد قليلاً لدرجة يصعب معها تخمين مشكلتك. أنصحك بإتمام الإعداد أولاً دون استخدام وكيل عكسي. ثم اتبع إرشادات كيفية إعداد Discourse على خادم يحتوي على مواقع Apache موجودة أو تشغيل مواقع ويب أخرى على نفس الجهاز مع Discourse

إعجابَين (2)

مرحباً @snakeninny، نعتذر عن التأخير.

بناءً على إعدادك 30080:80 في قسم التعريض (expose)، كل ما تحتاجه هو إعداد طلبات التحويل (proxy requests) على Nginx أو Apache أو ما شابه.

على سبيل المثال، إعداداتي لـ Nginx (أستخدم المنفذ 2080 بدلاً من 30080):

/etc/nginx/sites-available/00-default-ssl.conf

server {
...

        location / {
                # يُستخدم هذا الإعداد مع Nginx عند تشغيل Docker بالطريقة العادية (وضع الجسر BRIDGED MODE)
                proxy_pass      http://example.com:2080/;
                
                # هذان السطران يُستخدمان في حال كان شبكة Docker في وضع المضيف (--net=host)
                #proxy_pass      http://example.com:3000/;
                #proxy_redirect  http://example.com:2080/ https://example.com;

                proxy_read_timeout 90;
                proxy_http_version 1.1;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;

                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;

                error_page 502 =502 /errorpages/discourse_offline.html;
                proxy_intercept_errors on;

    # يمكنك استثناء الطلبات من عناوين IP معينة من سجل الوصول
    if ( $remote_addr = "x.x.x.x" )
    {
        access_log off;
    }
        }

location /errorpages/ {
    alias /var/www/errorpages/;
}
}

عند تشغيل الحاوية في وضع المضيف (--net=host)، يجب أن تفكر في تغيير إعدادات التحويل لاستخدام المنفذ 3000 مع إعادة التوجيه (ربما عبر HTTPS كما في المثال أعلاه).

إعجابَين (2)