404-Fehler (Assets) bei Installation im Unterordner

Es ist genau ein Monat her, seit Discourse mir nach einem git pull und anschließendem rebuild am 15. Mai 404-Fehler bei Asset-Dateien (CSS/JS usw.) zurückgegeben hat. Damals wurde ich über die Seite für automatische Updates aufgefordert, ein Upgrade über die Kommandozeile durchzuführen.

Heute, nach mehreren Tagen, habe ich erneut versucht, neu zu installieren, aber das Problem besteht weiterhin, obwohl es bereits Tage her ist. Der Inhalt meiner app.yml-Datei ist unten aufgeführt.

##
## Nach Änderungen an dieser Datei MÜSSEN Sie neu erstellen (rebuild), damit
## Änderungen in Ihrer live Discourse-Instanz wirksam werden:
##
## /var/discourse/launcher rebuild app
##
## Stellen Sie sicher, dass Sie die YAML-Syntax einhalten! Sie können diese Seite zur Überprüfung nutzen:
## http://www.yamllint.com/

## Dies ist die All-in-One, eigenständige Discourse Docker-Container-Vorlage

# Sie können eine Ratenbegrenzung aktivieren, indem Sie die Vorlage web.ratelimited auskommentieren.
# Standardmäßig sind 12 Anfragen pro Sekunde und 100 pro Minute pro IP erlaubt.
# Dies kann durch Ändern der Parameter in dieser Datei konfiguriert werden.

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: Der Mailserver, den diese Discourse-Instanz verwenden wird
  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

  ## Die CDN-Adresse für diese Discourse-Instanz (konfiguriert zum Abrufen)
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

## Diese Container sind zustandslos; alle Daten werden in /shared gespeichert
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Das docker_manager-Plugin ermöglicht Ihnen ein Upgrade von Discourse mit einem Klick
## 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

## Denken Sie daran: Dies ist YAML-Syntax – Sie können nur einen Block mit einem Namen haben
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 "Ende der benutzerdefinierten Befehle" 

Im Browser:

Ich habe alle Plugins in der YML-Konfiguration deaktiviert, aber es treten weiterhin 404-Fehler bei den Assets auf. Im App-Container ist der Ordner “community” bereits erstellt.

Irgendwelche Vorschläge?

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.

1 „Gefällt mir“

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.

1 „Gefällt mir“

Currently, I am trying a fresh installation first, as you can see in the first post even the registration page is not working fine. I have tried assets:precompile but its same no effect. Is there a way I can try to install an older version of discourse docker?

Unless you want to use this forum for a week or two and then delete it, you really, really, really don’t want to do that.

My guess is that you missed some tiny step somewhere that’s causing the problem, probably in the external Nginx config. You want to figure it out with the latest version.

A complete fresh install following Serve Discourse from a subfolder (path prefix) instead of a subdomain is not working?

1 „Gefällt mir“

Yes, it’s not working, that is why I am stuck at 404 errors, javascript files are not being loaded and giving 404 error as shown in the first post.

this is my external config for the Nginx reverse proxy.

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;
}

But the yml file you have above doesn’t look like the one in Subfolder support with Docker.

That’s because that config file didn’t work in the past, so the one I am using now was suggested by @neil here and it worked in the past. Currently, I also tried the config file uploaded there, but that didn’t work too.

Well, I just bought a brand new droplet and set it up here: https://subfolder.muito.ninja/forum, following the Serve Discourse from a subfolder (path prefix) instead of a subdomain

It is working fine for me.

So I’m afraid your reverse proxy is breaking it up…

1 „Gefällt mir“

Hi @john3, subfolder installation is painful :grinning:

I compared my config (left) and yours (right), take a look at line 12, probably you forgot to change word forum. Next, I have extra block replace, lines 22-29:

The end:

External proxy:

location /discuss {

## This is ProxyPassReverse for 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; #Important line for our logging objective

## End This is ProxyPassReverse for 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;
2 „Gefällt mir“

Could you please share with me your reverse proxy config?

I have made the changes and it’s still the same. My configs are given below. I am using Centos 7 with overlay2 as device storage driver.

Nginx reverse proxy:

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; #Important line for our logging objective

## End This is ProxyPassReverse for 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 "End of custom commands"

Could you please send me the last part of your YML config i.e. -exec…

This depends on what software you are using to reverse proxy.

I’m using Caddy and following Running Discourse with Caddy Server

Only change from the guide is adding the folder in the Caddyfile:

subfolder.muito.ninja

proxy /forum unix:/sock/nginx.http.sock {
  transparent
}
2 „Gefällt mir“

I see… I am using a digital ocean droplet with Centos 7 and overlay2 storage driver. Nginx as the web server and let’s encrypt’s SSL.