Comment reconstruire une application en utilisant le réseau hôte plutôt que le réseau docker ?

Bonjour,

Parfois, lorsque je procède à des mises à jour via l’interface web, Discourse m’indique d’exécuter :

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

Comme le processus de rebuild se connecte plusieurs fois à GitHub, et que GitHub est partiellement bloqué en Chine, où mon serveur est hébergé, je dois configurer un proxy HTTP/HTTPS pour mieux accéder à GitHub. Voici une comparaison entre la visite de YouTube sans proxy et avec 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]

Cependant, lorsque j’exécute ./launcher rebuild image, le script entre dans l’application et effectue toutes les opérations à l’intérieur de Docker, où l’environnement réseau diffère de celui de l’hôte avec proxy. Je ne peux donc pas accéder à YouTube, ce qui entraîne l’échec du rebuild la plupart du temps.

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.

Ma question est la suivante : que puis-je faire pour utiliser le proxy de l’hôte à l’intérieur de Docker, en particulier lors de l’exécution de ./launcher rebuild app ?

2 « J'aime »

Peut-être consultez Replace rubygems.org with taobao mirror to resolve network error in China

Il existe également un modèle pour la Chine que vous pouvez inclure. Vous pouvez le voir dans le dossier des modèles. Je ne suis pas tout à fait sûr de ce qu’il fait.

(Ce n’est pas une excellente réponse, mais cela fait deux jours et vous n’en avez toujours pas.)

4 « J'aime »

Merci, Jay ! Le modèle chinois fait miroir de rubygems.org avec gems.ruby-china.com, qui est hébergé par taobao/alibaba.

Inspiré par cette idée, je vais essayer de faire miroir de github.com avec une version locale, espérons-le hébergée par Alibaba également.

3 « J'aime »

Bonjour @snakeninny, si j’ai bien compris votre question, vous aurez peut-être besoin de quelque chose comme ceci :

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

Dans ce cas, vous devrez probablement modifier app.yml, la section expose (vérifiez simplement avec netstat -ltupen pour trouver le port d’écoute réel du conteneur).

2 « J'aime »

Merci, Ivan ! J’ai fait cela, mais je n’ai pas modifié app.yml pour exposer la section. Comment dois-je procéder ?

1 « J'aime »

Ouvrez le fichier app.yml du conteneur avec un éditeur de texte et recherchez « expose ».

1 « J'aime »

Je vois ceci dans la section expose de app.yml :

expose:
  - "30080:80"   # redirige le port hôte 80 vers le port du conteneur 80 (http)
  - "2222:22" # redirige le port hôte 2222 vers le port du conteneur 22 (ssh)

Dois-je rediriger le port hôte 443 (https) vers un port du conteneur ? Vers quel port du conteneur dois-je effectuer cette redirection ?

1 « J'aime »

Cela ne fonctionnait pas avant ? Je suppose que votre proxy inverse gère les opérations HTTPS.

1 « J'aime »

Non, ce n’est pas le cas. Comme je l’ai expliqué, je peux accéder à YouTube sur l’hôte, mais pas dans Docker.

1 « J'aime »

Votre configuration est un peu trop complexe pour que je puisse deviner d’où vient votre problème. Je vous recommande de commencer par configurer les choses sans proxy inverse. Ensuite, consultez Comment installer Discourse sur un serveur avec des sites Apache existants ou Exécuter d’autres sites web sur la même machine que Discourse.

2 « J'aime »

Bonjour @snakeninny, désolé pour le retard.

Suite à votre paramétrage 30080:80 dans la section d’exposition, vous devez simplement configurer les requêtes de proxy sur votre Nginx/Apache/etc.

Par exemple, voici ma configuration pour Nginx (j’utilise le port 2080 au lieu de 30080) :

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

server {
...

        location / {
                # CETTE CONFIGURATION EST UTILISÉE AVEC NGINX LORSQUE DOCKER EST EXÉCUTÉ NORMALEMENT (MODE BRIDGED)
                proxy_pass      http://example.com:2080/;
                
                # CES DEUX LIGNES SONT UTILISÉES DANS LE CAS OÙ LE RÉSEAU DOCKER EST EN MODE HÔTE (--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;

    # VOUS POUVEZ EXCLURE LES REQUÊTES D'UNE IP PARTICULIÈRE DES JOURNAUX D'ACCÈS
    if ( $remote_addr = "x.x.x.x" )
    {
        access_log off;
    }
        }

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

Lorsque vous exécutez votre conteneur en mode hôte (--net=host), vous devriez envisager de modifier vos paramètres de proxy pour utiliser le port 3000 avec une redirection (probablement en https comme dans l’exemple ci-dessus).

2 « J'aime »