Come posso ricostruire l'app usando la host network invece della docker network?

Ciao,

A volte, quando eseguo gli aggiornamenti tramite l’interfaccia web, Discourse mi dice di eseguire

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

Poiché il processo rebuild si connette a GitHub più volte e GitHub è parzialmente bloccato in Cina, dove è ospitato il mio server, devo configurare un proxy HTTP/HTTPS per accedere meglio a GitHub. Ecco un confronto tra la visita a YouTube senza proxy e con 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]

Tuttavia, quando eseguo ./launcher rebuild image, lo script entra nell’app e esegue tutte le operazioni all’interno di Docker, dove l’ambiente di rete è diverso rispetto all’host con il proxy configurato, e non riesco ad accedere a YouTube, quindi il rebuild fallisce la maggior parte delle volte.

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.

La mia domanda è: cosa posso fare per utilizzare il proxy dell’host all’interno di Docker, in particolare durante l’esecuzione di ./launcher rebuild app?

2 Mi Piace

Forse consulta Replace rubygems.org with taobao mirror to resolve network error in China

C’è anche un modello per la Cina che puoi includere. Puoi trovarlo nella cartella dei modelli. Non sono del tutto sicuro di cosa faccia.

(Questa non è una risposta eccellente, ma sono passati due giorni e non ne hai ancora ricevuta nessuna.)

4 Mi Piace

Grazie Jay! Il modello per la Cina riflette rubygems.org con gems.ruby-china.com, ospitato da taobao/alibaba.

Ispirato a quell’idea, proverò a replicare github.com con un mirror domestico, sperando sia ospitato anch’esso da Alibaba.

3 Mi Piace

Ciao @snakeninny, se ho capito bene la domanda, potresti aver bisogno di qualcosa del genere:

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

In questo caso, probabilmente dovrai modificare app.yml, nella sezione expose (controlla semplicemente netstat -ltupen per trovare la porta di ascolto effettiva del container).

2 Mi Piace

Grazie Ivan! Ho eseguito questo comando ma non ho modificato il file app.yml per esporre la sezione. Come posso farlo?

1 Mi Piace

Apri il file app.yml del contenitore con un editor di testo e cerca “expose”.

1 Mi Piace

Posso vedere questo nella sezione expose di app.yml:

expose:
  - "30080:80"   # inoltra la porta host 80 alla porta del contenitore 80 (http)
  - "2222:22" # inoltra la porta host 2222 alla porta del contenitore 22 (ssh)

Devo inoltrare la porta host 443 (https) a una porta del contenitore? A quale porta del contenitore dovrei inoltrare?

1 Mi Piace

Non funzionava prima? Mi aspetto che il tuo reverse proxy stia gestendo le operazioni HTTPS.

1 Mi Piace

No, non è così. Come ho descritto, posso accedere a YouTube sull’host, ma non nel Docker.

1 Mi Piace

La tua configurazione è un po’ troppo complessa per capire qual è il problema. Ti consiglio di impostare tutto senza un reverse proxy all’inizio. Successivamente, segui le guide su Come configurare Discourse su un server con siti Apache esistenti o Esecuzione di altri siti web sulla stessa macchina di Discourse.

2 Mi Piace

Ciao @snakeninny, scusa il ritardo.

Seguendo la tua impostazione 30080:80 nella sezione expose, devi solo configurare le richieste proxy sul tuo Nginx/Apache/etc.

Ad esempio, la mia configurazione per Nginx (uso 2080 invece di 30080):

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

server {
...

        location / {
                # QUESTO È USATO CON NGINX QUANDO DOCKER È ESEGUITO NORMALMENTE (MODALITÀ BRIDGE)
                proxy_pass      http://example.com:2080/;
                
                # QUESTE 2 RIGHE SONO USATE NEL CASO IN CUI LA RETE DI DOCKER SIA IN MODALITÀ HOST (--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;

    # POTRESTI ESCLUDERE LE RICHIESTE DA CERTI IP DAI LOG DI ACCESSO
    if ( $remote_addr = "x.x.x.x" )
    {
        access_log off;
    }
        }

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

Quando esegui il tuo contenitore in modalità host (--net=host), dovresti considerare di modificare le tue impostazioni proxy per utilizzare la porta 3000 con reindirizzamento (probabilmente https come nell’esempio sopra).

2 Mi Piace