Errores 404 (assets) en instalación de subcarpeta

Hace exactamente un mes que Discourse me está dando un error 404 en los archivos de activos (css/js, etc.) después de ejecutar “git pull” y luego “rebuild” aproximadamente el 15 de mayo, ya que me pedía actualizar mediante la línea de comandos en la página de actualización automática.

Y ahora, hoy, después de varios días, he intentado reinstalar de nuevo y sigue igual, a pesar de que han pasado días. El contenido de mi archivo app.yml se muestra a continuación.

##
## Después de realizar cambios en este archivo, DEBES reconstruir para que cualquier cambio
## surta efecto en tu instancia en vivo de Discourse:
##
## /var/discourse/launcher rebuild app
##
## ¡Asegúrate de obedecer la sintaxis YAML! Puedes usar este sitio para ayudarte a verificar:
## http://www.yamllint.com/

## esta es la plantilla del contenedor Docker de Discourse todo en uno y autónomo

# Puedes agregar limitación de velocidad descomentando la plantilla web.ratelimited.
# Por defecto permite 12 solicitudes por segundo por IP y 100 por minuto por IP
# Esto es configurable modificando los parámetros en este archivo

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"

expose:
  - "25654:80"
#  - "80:80"
#  - "2222:22"

params:
  db_default_text_search_config: "pg_catalog.english"
  version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en
  UNICORN_WORKERS: 2
  DISCOURSE_DEVELOPER_EMAILS: ''
  DISCOURSE_HOSTNAME: ''
  DISCOURSE_RELATIVE_URL_ROOT: /community

  ## TODO: El servidor de correo que usará esta instancia de Discourse
  DISCOURSE_SMTP_ADDRESS:
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: 
  DISCOURSE_SMTP_PASSWORD: 
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_AUTHENTICATION: login

  ## La dirección CDN para esta instancia de Discourse (configurada para cargar)
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

## Estos contenedores son sin estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## El plugin docker_manager te permite actualizar Discourse con un solo clic
## http://discourse.example.com/admin/docker
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
#          - git clone https://github.com/discourse/discourse-chat-integration.git
#          - git clone https://github.com/gdpelican/babble.git
#          - git clone https://github.com/discourse/discourse-solved.git
#          - git clone https://github.com/discourse/discourse-adplugin.git
#          - git clone https://github.com/communiteq/discourse-sitemap.git
#          - git clone https://github.com/discourse/discourse-bbcode-color.git

## Recuerda, esto es sintaxis YAML: solo puedes tener un bloque con un nombre
run:
    - exec:
        cd: $home
        cmd:
          - rm -fr public/assets
          - sudo -E -u discourse bundle exec rake assets:precompile
          - mkdir -p public/community
          - cd public/community && ln -s ../uploads && ln -s ../backups
    - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /community/$1 break;
          proxy_pass http://discourse;
    - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /community {
             rewrite ^/community/?(.*)$ /$1;
          }
    - replace:
         filename: /etc/nginx/conf.d/discourse.conf
         from: $proxy_add_x_forwarded_for
         to: $http_fastly_client_ip
         global: true

    - exec: echo "Fin de los comandos personalizados" 

en el navegador:

He desactivado todos los plugins en la configuración YAML, pero sigue dando error 404 en los activos. En el contenedor de la aplicación, la carpeta “community” ya está creada.

¿Alguna sugerencia?

I made the below changes to the config but did not help.

run:
    - exec:
        cd: $home
        cmd:
          - mkdir -p public/community
          - cd public/community && ln -s ../uploads && ln -s ../backups
    - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /forum/$1 break;
          proxy_pass http://discourse;
    - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /community {
             rewrite ^/community/?(.*)$ /$1;
          }
    - replace:
         filename: /etc/nginx/conf.d/discourse.conf
         from: $proxy_add_x_forwarded_for
         to: $http_your_original_ip_header
         global: true

update:

there are 2 folders in /public/community i.e. “backup” and “uploads”. I tried changing the version from tests-passed to stable again but the issue remains the same i.e. no javascript or CSS files and giving 404 error… I also tried to change the permission for the “uploads” folder in community and symlinked assets folder in community but did not help.

Downgrading isn’t possible, if you’re on tests-passed you can’t rebuild on a lower version (beta/stable).

You would need to stay on the current tests-passed release until Stable or Beta catches up.

Subfolder installs are considered an advanced topic and we really can’t support them here because of all the problems which arise. There are pages and pages of topics detailing the types of problems found when installing against a subfolder. In 2019 there’s really no good reason to use a subfolder install, all of the SEO claims have been debunked, and the added complexity really adds nothing of value.

Even on CDCK hosting, subfolder installs are only available to enterprise customers, with an additional fee.

I would suggest reverting to a subdomain, or opening a topic on marketplace to engage with a consultant.

I destroyed the container and then rebuild it with the stable release, the problem is with the assets i.e. CSS or javascript files which are not being found. This error happened probably in the update of May. Is there a way I install the previous versions?

Destroying the container doesn’t help, your database was migrated, and as I’ve already said above there’s no way to migrate back. If you didn’t take a backup prior to upgrade you’re stuck at tests-passed until beta or stable reaches the same level.

If you have a backup from then you might be able to do a new build and put the Verdun you want in the version line.

You might try entering the container and doing a

 rake assets:precompile

My current subfolder solution is with traefik as the reverse proxy. I offer that installation as a service if you’re interested.

Actualmente, estoy intentando una instalación nueva primero, como pueden ver en el primer mensaje, incluso la página de registro no funciona correctamente. He intentado ejecutar assets:precompile, pero no ha tenido ningún efecto. ¿Hay alguna manera de intentar instalar una versión anterior de Discourse Docker?

A menos que quieras usar este foro durante una o dos semanas y luego eliminarlo, realmente, realmente, realmente no quieres hacer eso.

Mi suposición es que te saltaste algún paso minúsculo en algún lugar que está causando el problema, probablemente en la configuración externa de Nginx. Querrás resolverlo con la versión más reciente.

¿No está funcionando una instalación completa nueva siguiendo Serve Discourse from a subfolder (path prefix) instead of a subdomain?

Sí, no funciona, por eso estoy atascado con errores 404; los archivos de JavaScript no se están cargando y generan un error 404, como se muestra en el primer mensaje.

esta es mi configuración externa para el proxy inverso de Nginx.

location /community {
        pagespeed  off;
        rewrite         /(.*) /$1  break;
        proxy_pass      http://127.0.0.1:25654/;
        proxy_read_timeout      90;
        proxy_redirect  http://127.0.0.1:25654/ https://www.domain.com/community;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Pero el archivo yml que tienes arriba no se parece al de Serve Discourse from a subfolder (path prefix) instead of a subdomain.

Eso es porque ese archivo de configuración no funcionó en el pasado, por lo que el que estoy usando ahora fue sugerido por @neil aquí y funcionó en el pasado. Actualmente, también probé el archivo de configuración subido allí, pero tampoco funcionó.

Bueno, acabo de comprar un droplet totalmente nuevo y lo configuré aquí: https://subfolder.muito.ninja/forum, siguiendo las instrucciones de Serve Discourse from a subfolder (path prefix) instead of a subdomain.

En mi caso funciona perfectamente.

Así que temo que tu proxy inverso esté causando el problema…

Hola @john3, la instalación en subcarpeta es dolorosa :grinning:

Comparé tu configuración (izquierda) y la mía (derecha), echa un vistazo a la línea 12; probablemente olvidaste cambiar la palabra forum. Además, tengo un bloque extra replace, líneas 22-29:

El final:

Proxy externo:

location /discuss {

## Esto es ProxyPassReverse para Nginx
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $remote_addr;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_read_timeout     3600;
proxy_connect_timeout  240;
proxy_set_header Host $host;
proxy_set_header X-RealIP $remote_addr; #Línea importante para nuestro objetivo de registro

## Fin de esto es ProxyPassReverse para Nginx

proxy_pass http://192.168.1.2$request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

¿Podrías compartir conmigo tu configuración de proxy inverso?

He realizado los cambios y sigue igual. Mis configuraciones se detallan a continuación. Estoy usando CentOS 7 con overlay2 como controlador de almacenamiento del dispositivo.

Proxy inverso de Nginx:

location /community {
                pagespeed  off;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $remote_addr;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_read_timeout     3600;
proxy_connect_timeout  240;
proxy_set_header Host $host;
proxy_set_header X-RealIP $remote_addr; #Línea importante para nuestro objetivo de registro

## Fin de ProxyPassReverse para Nginx

proxy_pass http://127.0.0.1:25654$request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

app.yml

run:
    - exec:
        cd: $home
        cmd:
          - mkdir -p public/community
          - cd public/community && ln -s ../uploads && ln -s ../backups
    - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /community/$1 break;
          proxy_pass http://discourse;
    - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /community/ {
             rewrite ^/community/?(.*)$ /$1;
          }
    - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /community {
             rewrite ^/community/?(.*)$ /$1;
          }
    - replace:
         filename: /etc/nginx/conf.d/discourse.conf
         from: $proxy_add_x_forwarded_for
         to: $http_fastly_client_ip
         global: true

    - exec: echo "Fin de los comandos personalizados"

¿Podrías enviarme la última parte de tu configuración YML, es decir, -exec…?

Esto depende del software que estés utilizando para el proxy inverso.

Estoy usando Caddy y siguiendo Use Caddy instead of NGINX as your reverse proxy

El único cambio respecto a la guía es agregar la carpeta en el Caddyfile:

subfolder.muito.ninja

proxy /forum unix:/sock/nginx.http.sock {
  transparent
}

Entiendo… Estoy utilizando un droplet de Digital Ocean con CentOS 7 y el controlador de almacenamiento overlay2. Nginx como servidor web y el SSL de Let’s Encrypt.