Definire i link DISCOURSE_S3_CDN_URL per le risorse nell'URL CDN S3

I had this problem before and decided that I was crazy, confused, or the database on the site was suspect, but this is on a brand new site. Also, I was on Digital Ocean spaces, so I thought it might be a problem somehow.

I’m trying again to figure out how to keep images on AWS S3 like I think the Big Boys do.

Here’s what I have in the env section:

  DISCOURSE_S3_ACCESS_KEY_ID: 'key'
  DISCOURSE_S3_SECRET_ACCESS_KEY: 'lock'
  DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_S3_BUCKET: 'lc-xyz'
  DISCOURSE_S3_BUCKET_NAME: 'lc-xyz'
  DISCOURSE_S3_BACKUP_BUCKET: 'lc-xyz/backups'
  DISCOURSE_S3_UPLOAD_BUCKET: 'lc-xyz/uploads'
  DISCOURSE_S3_CDN_URL: 'https://lc-rbx.s3.amazonaws.com'

When I include the s3 cdn url the site breaks because all of the links to the assets are on S3 like https://lc-xyz.s3.amazonaws.com/assets/plugin-third-party-01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b.br.js.

Because if you define s3 cdn url Discourse looks for the assets on the s3_cdn_url.

I did a rebuild, but the assets are still missing. I can do a

rake s3:upload_assets

Is there an after_bundling_assets stanza that I could add that to? (I know about after_db_migrate and after_bundle_exec, but don’t know if those would work.)

Do assets get produced some other time? (It would seem like when themes get modified assets would change.)

If I also had a “push CDN like normal”, would that keep this from happening?

Is there some best practice that I’m missing?

You can use after_assets_precompile as the hook for that rake task.

Aha! Thanks very much for that. Where does the list of those things live?

I’m still confused why this is necessary, especially since you seemed confused before. (Or maybe I should be happy that I can push all this stuff to S3, now that I know how to do it–And I think that it was you who said that one could use CloudFlare’s free CDN to front an AWS bucket.)

Sto provando di nuovo. Ho degli upload in corso su S3. Funziona.

Ho configurato Cloudflare per CDN del sito. Se inserisco https://lc-XXX.literatehosting.com/uploads nel parametro s3_cdn_url del sito, i nuovi upload vanno nel bucket S3 e l’immagine è collegata all’URL della CDN e funziona.

MA se provo a impostare s3_cdn_url con una variabile d’ambiente in app.yml (o modifico manualmente config/discourse.conf ed eseguo sv restart unicorn), tutte le risorse vengono caricate da S3 (dove non sono). Questo potrebbe andare bene, ma se provo a eseguire rake s3:upload_assets, viene segnalato che S3 non è configurato.

Mi sono imbattuto in questo mentre stavo cercando di risolvere alcuni conflitti tra nomi di impostazioni.

Penso (e spero, perché significa che ho capito la questione e non ho scritto assurdità nel thread collegato sopra) che se rimuovi queste due righe:

DISCOURSE_S3_BUCKET: 'lc-xyz'
DISCOURSE_S3_BUCKET_NAME: 'lc-xyz'

potrai impostare DISCOURSE_S3_CDN_URL, che verrà utilizzato solo per i caricamenti, non per le risorse.

Penso che tu abbia capito davvero, e grazie a te, sono almeno più vicino a capire anch’io! Grazie mille!

Mi trovo di fronte a questo problema e sono ancora molto confuso dopo aver letto questa discussione…

Sto cercando di servire i caricamenti S3 (non le risorse compilate) tramite CDN (Cloudfront).

Se configuro “s3 cdn url” tramite la schermata delle impostazioni, funziona come previsto (bene… tranne che per System upload not using s3 cdn url).

Tuttavia, se lo configuro tramite DISCOURSE_S3_CDN_URL e ricostruisco, il frontend si rompe perché tenta di caricare le risorse compilate dal mio URL CDN S3.

Sembra che DISCOURSE_S3_CDN_URL / s3_cdn_url debbano influire solo sui caricamenti, mentre DISCOURSE_CDN_URL dovrebbe influire solo sulle risorse.

Anche questa è la mia esperienza. Alla fine ho creato un plugin per impostare S3_CDN_URL.

@pfaffman sembra che questo debba essere segnalato come un bug, vero?

Forse. Non è una funzionalità che probabilmente verrà utilizzata dagli utenti self-hosting comuni, quindi avrà bassa priorità. Inoltre, credo che ci sarà presto un cambiamento nel modo in cui funzionano le impostazioni globali e quelle oscurate dalle impostazioni globali, quindi sarà probabilmente risolto allora.

Sembra lo stesso problema qui, mi hanno respinto.
@pfaffman ho bisogno del tuo aiuto.
Usi CloudFront per ottenere l’URL CDN del dominio personalizzato o ti limiti a usare il prefisso pubblico degli oggetti del bucket nell’URL CDN?

Ho appena riscontrato questo problema. @pfaffman, sei riuscito a risolverlo?

Le upload funzionano impostando manualmente s3_cdn_url nelle impostazioni del sito, ma idealmente avrei bisogno di poter impostare la variabile ENV globalmente durante il deployment. Quando lo faccio, incontro lo stesso problema: Discourse cerca gli asset in s3_cdn_url, il che mi sembra un bug in discourse/lib/content_security_policy/default.rb at main · discourse/discourse · GitHub

Penso di aver appena impostato il valore nel database.

Il mio parere è che la soluzione consista nel trovare il task Rake che spingerà gli asset su S3.

Mi chiedevo se qualcuno del @team potesse confermare se questo sia un comportamento previsto, ovvero che non si possa utilizzare un CDN S3 (impostato globalmente) per i caricamenti senza che Discourse cerchi anche lì le risorse. Sembra un comportamento inaspettato, a meno che non abbia frainteso qualcosa.

Sì, questo è il comportamento previsto.

Configurare un CDN S3 lo utilizzerà per tutto ciò che sarebbe un file statico, siano essi upload o asset JS.

Ecco alcune informazioni a riguardo, ho dovuto occuparmene lo scorso mese.

L’ho risolto impostando entrambe le variabili (DISCOURSE_S3_CDN_URL e DISCOURSE_CDN_URL) e creando due distribuzioni CloudFront: una per gli upload con origine il bucket S3 e una per le risorse con origine il server.

Ecco il codice che utilizziamo per questo:

Ecco il nostro file app.yml (che abbiamo rinominato web.yml), sostituiamo le variabili al momento della build infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

Straordinario. Grazie mille. Non sembra esserci molta documentazione a riguardo e le impostazioni sembrano suggerire che si possa utilizzare S3 solo per i caricamenti, il che penso sia ciò che sta ingannando tutti noi.

È nella mia lista scrivere una guida su questo. Spero di farlo entro la fine della settimana.

Sì, una volta capito che servono due distribuzioni CloudFront, ha più senso. Inoltre, ricorda di caricare le risorse su S3 dopo ogni ricostruzione. C’è un problema con gli aggiornamenti da Docker Manager: devi eseguire manualmente bundle exec rake s3:upload_assets all’interno del contenitore Docker. Se invece fai una ricostruzione, dovrebbe funzionare se aggiungi queste righe al tuo app.yml

hooks:
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - 'bundle exec rake s3:upload_assets'

Quel task sta segnalando che S3 non è configurato. Ho individuato il problema in questo metodo di global_setting.rb:

def self.use_s3?
    (@use_s3 ||=
      begin
        s3_bucket &&
        s3_region && (
          s3_use_iam_profile || (s3_access_key_id && s3_secret_access_key)
        ) ? :true : :false
      end) == :true
  end

Dove ci si aspetta che GlobalSetting.s3_bucket sia definito? A quanto pare dobbiamo impostare le variabili d’ambiente DISCOURSE_S3_UPLOAD_BUCKET e DISCOURSE_S3_BUCKET. Qual è la differenza tra le due?