Erreurs 404 (assets) sur une installation en sous-dossier

Cela fait exactement un mois que Discourse me renvoie une erreur 404 sur les fichiers d’actifs (CSS, JS, etc.) depuis que j’ai effectué un « git pull » suivi d’un « rebuild » vers le 15 mai, alors qu’il me demandait de mettre à niveau via la ligne de commande sur la page de mise à niveau automatique.

Et aujourd’hui, après plusieurs jours, j’ai essayé de réinstaller à nouveau, mais le problème persiste, même s’il s’est écoulé plusieurs jours. Le contenu de mon fichier app.yml est fourni ci-dessous.

##
## Après avoir apporté des modifications à ce fichier, vous DEVEZ exécuter un rebuild pour que
## les changements prennent effet sur votre instance Discourse en direct :
##
## /var/discourse/launcher rebuild app
##
## Assurez-vous de respecter la syntaxe YAML ! Vous pouvez utiliser ce site pour vérifier :
## http://www.yamllint.com/

## Ceci est le modèle de conteneur Docker Discourse tout-en-un, autonome

# Vous pouvez ajouter une limitation de débit en décommentant le modèle web.ratelimited.
# Par défaut, il autorise 12 req/s par IP et 100 req/min par IP.
# Cela est configurable en modifiant les paramètres dans ce fichier.

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 : Le serveur de messagerie que cette instance Discourse utilisera
  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

  ## L'adresse CDN pour cette instance Discourse (configurée pour récupérer)
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

## Ces conteneurs sont sans état, toutes les données sont stockées dans /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Le plugin docker manager vous permet de mettre à niveau Discourse en un 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

## Rappelez-vous, ceci est de la syntaxe YAML - vous ne pouvez avoir qu'un seul bloc avec un nom
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 des commandes personnalisées" 

sur le navigateur :

J’ai désactivé tous les plugins dans la configuration YAML, mais j’ai toujours une erreur 404 sur les actifs. Dans le conteneur de l’application, le dossier “community” est déjà créé.

Des suggestions ?

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.

Actuellement, j’essaie d’abord une installation neuve, comme vous pouvez le voir dans le premier message, même la page d’inscription ne fonctionne pas correctement. J’ai essayé assets:precompile, mais cela n’a eu aucun effet. Existe-t-il un moyen d’essayer d’installer une version antérieure de Discourse Docker ?

À moins que vous ne souhaitiez utiliser ce forum pendant une semaine ou deux avant de le supprimer, vous ne voulez vraiment, vraiment, vraiment pas faire cela.

Je parie que vous avez manqué une toute petite étape quelque part qui cause le problème, probablement dans la configuration externe de Nginx. Vous devez résoudre cela avec la dernière version.

Une installation complète et neuve suivant Serve Discourse from a subfolder (path prefix) instead of a subdomain ne fonctionne pas ?

Oui, cela ne fonctionne pas, c’est pourquoi je suis bloqué sur des erreurs 404 : les fichiers JavaScript ne sont pas chargés et renvoient une erreur 404, comme indiqué dans le premier message.

voici ma configuration externe pour le proxy inverse 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;
}

Mais le fichier YAML que vous avez ci-dessus ne ressemble pas à celui de Serve Discourse from a subfolder (path prefix) instead of a subdomain.

C’est parce que ce fichier de configuration ne fonctionnait pas par le passé, donc celui que j’utilise actuellement a été suggéré par @neil ici et il fonctionnait auparavant. Actuellement, j’ai également essayé le fichier de configuration téléchargé là-bas, mais cela n’a pas non plus fonctionné.

Eh bien, je viens d’acheter un tout nouveau droplet et je l’ai configuré ici : https://subfolder.muito.ninja/forum, en suivant Serve Discourse from a subfolder (path prefix) instead of a subdomain.

Cela fonctionne parfaitement pour moi.

Je crains donc que votre proxy inverse ne soit à l’origine du problème…

Salut @john3, l’installation dans un sous-répertoire est douloureuse :grinning:

J’ai comparé ma configuration (à gauche) et la vôtre (à droite), jetez un œil à la ligne 12, vous avez probablement oublié de changer le mot forum. Ensuite, j’ai un bloc supplémentaire replace, lignes 22-29 :

La fin :

Proxy externe :

location /discuss {

## Ceci est ProxyPassReverse pour 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; #Ligne importante pour notre objectif de journalisation

## Fin de ProxyPassReverse pour 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;

Pourriez-vous s’il vous plaît me partager votre configuration de proxy inverse ?

J’ai apporté les modifications, mais le problème persiste. Voici mes configurations. J’utilise CentOS 7 avec le pilote de stockage de périphérique overlay2.

Reverse proxy 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; #Ligne importante pour notre objectif de journalisation

## Fin de ProxyPassReverse pour 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 des commandes personnalisées"

Pourriez-vous s’il vous plaît me envoyer la dernière partie de votre config YML, c’est-à-dire -exec…

Cela dépend du logiciel que vous utilisez pour le proxy inverse.

J’utilise Caddy et je suis Use Caddy instead of NGINX as your reverse proxy

La seule différence par rapport au guide est l’ajout du dossier dans le fichier Caddyfile :

subfolder.muito.ninja

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

Je vois… J’utilise un droplet Digital Ocean avec CentOS 7 et le pilote de stockage overlay2. Nginx en tant que serveur web et le certificat SSL de Let’s Encrypt.