¿Cómo reconstruyo la app usando la host network en lugar de la docker network?

Hola,

A veces, al realizar actualizaciones a través de la interfaz web, Discourse me indica que ejecute:

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

Dado que el proceso de rebuild se conecta varias veces a GitHub y este está parcialmente bloqueado en China, donde está alojado mi servidor, debo configurar un proxy HTTP/HTTPS para acceder mejor a GitHub. Aquí hay una comparación entre visitar YouTube sin proxy y 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]

Sin embargo, cuando ejecuto ./launcher rebuild image, el script entra en la aplicación y realiza todas las operaciones dentro de Docker, donde el entorno de red es diferente al del host con proxy, y no puedo acceder a YouTube, por lo que la reconstrucción falla la mayoría de las veces.

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.

Mi pregunta es: ¿qué puedo hacer para aprovechar el proxy del host dentro de Docker, especialmente en ./launcher rebuild app?

2 Me gusta

Tal vez consultes Replace rubygems.org with taobao mirror to resolve network error in China

También hay una plantilla para China que puedes incluir. Puedes verla en la carpeta de plantillas. No estoy muy seguro de qué hace.

(Esta no es una gran respuesta, pero han pasado dos días y aún no tienes ninguna.)

4 Me gusta

¡Gracias, Jay! La plantilla de China replica rubygems.org con gems.ruby-china.com, que está alojada por taobao/alibaba.

Inspirado por esa idea, intentaré replicar github.com con una versión doméstica, con la esperanza de que también esté alojada por Alibaba.

3 Me gusta

Hola @snakeninny, si entendí bien la pregunta, quizás necesites algo así:

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

En este caso, probablemente debas modificar app.yml, la sección expose (simplemente verifica netstat -ltupen para encontrar el puerto de escucha real del contenedor).

2 Me gusta

¡Gracias, Ivan! He hecho esto, pero no he modificado app.yml para exponer la sección. ¿Cómo lo hago?

1 me gusta

Abre el archivo app.yml de containers con un editor de texto y busca “expose”.

1 me gusta

Puedo ver esto en la sección expose de app.yml:

expose:
  - "30080:80"   # reenviar puerto host 80 al puerto del contenedor 80 (http)
  - "2222:22" # reenviar puerto host 2222 al puerto del contenedor 22 (ssh)

¿Necesito reenviar el puerto host 443 (https) a un puerto del contenedor? ¿A qué puerto del contenedor debo reenviarlo?

1 me gusta

¿No funcionaba esto antes? Supongo que tu proxy inverso está manejando cosas de HTTPS.

1 me gusta

No, no lo hizo. Como he descrito, puedo acceder a YouTube en el host, pero no en el contenedor Docker.

1 me gusta

Tu configuración es un poco demasiado complicada para adivinar cuál es tu problema. Recomiendo configurar todo sin un proxy inverso primero. Luego, sigue la guía Cómo configurar Discourse en un servidor con sitios Apache existentes o Ejecutar otros sitios web en la misma máquina que Discourse.

2 Me gusta

Hola @snakeninny, disculpa la demora.

Siguiendo tu configuración 30080:80 en la sección de exposición, solo necesitas configurar las solicitudes de proxy en tu Nginx/Apache/etc.

Por ejemplo, mi configuración para Nginx (yo uso el puerto 2080 en lugar del 30080):

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

server {
...

        location / {
                # ESTO SE USA CON NGINX CUANDO DOCKER SE EJECUTA NORMALMENTE (MODO PUENTE)
                proxy_pass      http://example.com:2080/;
                
                # ESTAS 2 LÍNEAS SE USAN EN CASO DE QUE LA RED DE DOCKER ESTÉ EN MODO 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;

    # PUEDES EXCLUIR LAS SOLICITUDES DE CIERTA IP DEL REGISTRO DE ACCESO
    if ( $remote_addr = "x.x.x.x" )
    {
        access_log off;
    }
        }

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

Cuando ejecutes tu contenedor en modo host (--net=host), deberías considerar cambiar tu configuración de proxy para usar el puerto 3000 con redirección (probablemente https, como en el ejemplo anterior).

2 Me gusta