Wie kann ich die App mit dem Host-Netzwerk anstatt dem Docker-Netzwerk neu erstellen?

Hallo,

Manchmal, wenn ich Updates über die Web-Oberfläche durchführe, fordert Discourse mich auf, Folgendes auszuführen:

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

Da der rebuild-Prozess mehrmals eine Verbindung zu GitHub herstellt und GitHub in China, wo mein Server gehostet wird, teilweise blockiert ist, muss ich einen HTTP/HTTPS-Proxy einrichten, um besseren Zugriff auf GitHub zu erhalten. Hier ist ein Vergleich beim Aufruf von YouTube ohne und mit Proxy:

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]

Wenn ich jedoch ./launcher rebuild image ausführe, betritt das Skript die App und führt alle Operationen innerhalb von Docker aus, wo die Netzwerkumgebung sich von der des proxied Hosts unterscheidet. Daher kann ich nicht auf YouTube zugreifen, und der rebuild-Vorgang schlägt meistens fehl.

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.

Meine Frage lautet: Was kann ich tun, um den Proxy des Hosts innerhalb von Docker zu nutzen, insbesondere bei ./launcher rebuild app?

2 „Gefällt mir“

Vielleicht schau mal hier vorbei: Replace rubygems.org with taobao mirror to resolve network error in China

Es gibt auch eine China-Vorlage, die du einbinden kannst. Du findest sie im Ordner „templates“. Ich bin mir nicht ganz sicher, was sie genau bewirkt.

(Das ist keine großartige Antwort, aber es sind bereits zwei Tage vergangen und du hast bisher noch keine erhalten.)

4 „Gefällt mir“

Danke, Jay! Die China-Vorlage spiegelt rubygems.org mit gems.ruby-china.com wider, das von taobao/alibaba gehostet wird.

Inspiriert von dieser Idee werde ich versuchen, github.com mit einer inländischen Version zu spiegeln, hoffentlich ebenfalls von Alibaba gehostet.

3 „Gefällt mir“

Hallo @snakeninny, wenn ich die Frage richtig verstanden habe, brauchst du vielleicht so etwas:

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

In diesem Fall musst du wahrscheinlich die Datei app.yml anpassen, den Abschnitt expose (prüfe dazu einfach netstat -ltupen, um den tatsächlich vom Container genutzten Port zu finden).

2 „Gefällt mir“

Danke, Ivan! Ich habe das gemacht, habe aber die app.yml nicht geändert, um den Abschnitt freizugeben. Wie mache ich das?

1 „Gefällt mir“

Öffnen Sie die Datei app.yml mit einem Texteditor und suchen Sie nach “expose”.

1 „Gefällt mir“

Ich kann das im expose-Bereich der app.yml sehen:

expose:
  - "30080:80"   # Weiterleitung von Host-Port 80 an Container-Port 80 (http)
  - "2222:22" # Weiterleitung von Host-Port 2222 an Container-Port 22 (ssh)

Muss ich den Host-Port 443 (https) an einen Container-Port weiterleiten? An welchen Container-Port soll ich weiterleiten?

1 „Gefällt mir“

Hat das nicht schon früher funktioniert? Ich gehe davon aus, dass dein Reverse Proxy HTTPS-Operationen durchführt.

1 „Gefällt mir“

Nein, das hat es nicht. Wie ich bereits beschrieben habe, kann ich YouTube auf dem Host-System aufrufen, aber nicht im Docker-Container.

1 „Gefällt mir“

Ihre Einrichtung ist etwas zu kompliziert, um Ihr Problem zu erraten. Ich empfehle, die Einrichtung zunächst ohne Reverse-Proxy durchzuführen. Anschließend können Sie anleitungen zur Einrichtung von Discourse auf einem Server mit bestehenden Apache-Sites oder andere Websites auf derselben Maschine wie Discourse betreiben konsultieren.

2 „Gefällt mir“

Hallo @snakeninny, entschuldige bitte die Verzögerung.

Nach deiner Einstellung 30080:80 im Abschnitt „Expose“ musst du lediglich Proxy-Anfragen auf deinem Nginx/Apache/etc. einrichten.

Zum Beispiel meine Einstellung für Nginx (ich verwende 2080 statt 30080):

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

server {
...

        location / {
                # DIESES WIRD MIT NGINX VERWENDET, WENN DOCKER NORMAL (BRIDGE-MODUS) AUSGEFÜHRT WIRD
                proxy_pass      http://example.com:2080/;
                
                # DIESE 2 ZEILEN WERDEN VERWENDET, WENN DAS DOCKER-NETZWERK IM HOST-MODUS LÄUFT (--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;

    # ANFRAGEN VON BESTIMMTEN IPs KÖNNEN AUS DEM ZUGRIFFSLOG AUSGESCHLOSSEN WERDEN
    if ( $remote_addr = "x.x.x.x" )
    {
        access_log off;
    }
        }

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

Wenn du deinen Container im Host-Modus ausführst (--net=host), solltest du deine Proxy-Einstellungen prüfen und ggf. auf Port 3000 mit Umleitung (wahrscheinlich HTTPS, wie im obigen Beispiel) umstellen.

2 „Gefällt mir“