Configura un fornitore di storage di oggetti compatibile con S3 per gli upload

Non sembra che io abbia il permesso di modificare la wiki, ma ho utilizzato con successo un altro provider.

OVHcloud

Nome del servizio: Object Storage

Le regioni corrispondono ai data center, identificati da un codice di tre lettere. Se non sai dove hai creato il tuo bucket, controlla nella scheda object storage del tuo portale clienti.

DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: [codice data center]
DISCOURSE_S3_ENDPOINT: https://s3.[codice data center].io.cloud.ovh.net/
DISCOURSE_S3_ACCESS_KEY_ID: [chiave]
DISCOURSE_S3_SECRET_ACCESS_KEY: [chiave]
DISCOURSE_S3_BUCKET: [nome bucket]
DISCOURSE_S3_BACKUP_BUCKET: [nome bucket]
DISCOURSE_BACKUP_LOCATION: s3
1 Mi Piace

Hai fatto funzionare OVHcloud S3 per gli upload o solo per i backup?

Inizialmente entrambi nella mia versione di test, ma sono passato in produzione solo con i backup, dato che la macchina di produzione ha moltissimo spazio comunque.

È molto compatibile con S3, ma ci sono alcune funzioni mancanti come le regole di ciclo di vita per eliminare i vecchi file o spostarli in archiviazione a freddo, che sono attivamente in sviluppo da parte di OVH. Tuttavia, funziona bene per servire i file.

Per i backup ho semplicemente usato l’opzione di Discourse di eliminare automaticamente i vecchi backup.

1 Mi Piace

Questa è una risposta davvero deludente e completamente inutile. Qual è esattamente il problema? Collegarsi a un documento di supporto che cambia significa che nessuno può effettivamente dire quale sia l’“orribile difettosità” menzionata in questo thread qui.
Menzioni “metadati” e che il CDN “non li conosce”. Quali metadati? Sarebbe utile sapere cosa non funziona.

Volevo solo aggiungere a questo mio post con le istruzioni su come utilizzare E2 di iDrive.

Sembra che ci sia una cosa che iDrive ha recentemente attivato che causa il fallimento delle chiavi di accesso assegnate a un solo bucket, a meno che non venga bypassato un controllo di autenticazione del bucket.

Puoi aggirare questo problema quando usi rclone con no_check_bucket = true nel file rclone.conf, ma non sono sicuro che esista un’impostazione ENV simile per la compilazione di Discourse.

Di conseguenza, con iDrive E2, attualmente devi utilizzare una chiave che abbia accesso in scrittura a tutti i tuoi bucket, piuttosto che a uno solo.

1 Mi Piace

Come farebbe qualcun altro a conoscere il problema esatto per un provider che non utilizza?

Comunque, sembra che ci siamo quasi con Cloudflare R2. Per:

Quando ho inserito tutte le informazioni nell’interfaccia utente web, i nuovi caricamenti sono andati correttamente nello storage S3 e anche i backup vanno correttamente su S3. I caricamenti correnti ovviamente non si sono spostati.
Quindi sono andato su app.yml e ho inserito queste informazioni:

## Questo set di righe consente di caricare e scaricare file ospitati su R2 S3.
  DISCOURSE_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_ENDPOINT: https://randomnumber.r2.cloudflarestorage.com
  DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_BACKUP_BUCKET: exotics-unlimited-backups
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_BUCKET: exotics-unlimited
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: randomnumbers
  DISCOURSE_S3_SECRET_ACCESS_KEY: randomnumbers
  DISCOURSE_S3_INSTALL_CORS_RULE: false

## Il container Docker è stateless; tutti i dati sono memorizzati in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
#         - git clone https://github.com/discourse/discourse-subscriptions.git
          - git clone https://github.com/discourse/discourse-follow.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/communiteq/discourse-private-topics.git
#         - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/tknospdr/discourse-auto-remove-group.git
          - git clone https://github.com/discourse/discourse-topic-voting.git
          - git clone https://github.com/discourse/discourse-livestream.git
#         - git clone https://github.com/discourse/discourse-calendar.git
          - git clone https://github.com/jannolii/discourse-topic-trade-buttons.git
##        - git clone https://github.com/tknospdr/force-tag-group-order.git

## Hook per S3
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

Dopo una ricostruzione il mio sito è stato interrotto a causa di molti file mancanti, quindi ho provato a trasferirli sul server e ho ottenuto questo errore per ogni file:

root@talk-app:/var/www/discourse# rake uploads:migrate_to_s3
Si prega di notare che la migrazione a S3 al momento non è reversibile!
[CTRL+c] per annullare, [ENTER] per continuare

Migrazione degli upload su S3 per 'default'...
Caricamento dei file su S3...
 - Elenco dei file locali
 => 31 file
 - Elenco dei file S3
. => 4 file
 - Sincronizzazione dei file su S3
#<Thread:0x00007ff89dcbcb20 /var/www/discourse/lib/file_store/to_s3_migration.rb:212 run> terminato con eccezione (report_on_exception è true):
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call': You can only specify one non-default checksum at a time. (Aws::S3::Errors::InvalidRequest)
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/checksum_algorithm.rb:169:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/invocation_id.rb:16:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/response_target.rb:24:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `block in call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/telemetry/no_op.rb:29:in `in_span'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:53:in `span_wrapper'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/client.rb:17315:in `put_object'
    from /var/www/discourse/lib/file_store/to_s3_migration.rb:215:in `block (2 levels) in migrate_to_s3'

Mi piacerebbe ricevere qualche consiglio per finire una cosa o l’altra.

I file mancanti sono probabilmente asset, quindi hai bisogno del rake task che li carichi su s3 (s3:upload_assets – è verso l’alto)

Ma i tuoi errori sono probabilmente dovuti alla nuova libreria aws s3 che rompe un sacco di servizi. Quindi dovrai trovare il modo di fare il downgrade della gemma aws o usare un altro servizio.

Penso che ci possa essere un argomento su come farlo. L’ho fatto su uno o due siti, ma non sono sicuro di come o dove sia stato documentato.

Penso che potrebbe essere questo argomento

1 Mi Piace

Devo eseguirla anche se fa parte delle modifiche che ho inserito nel file app.yml? Pensavo servisse a caricare automaticamente i file durante una ricostruzione.

Ci ho appena provato. L’output è stato:


root@talk-app:/var/www/discourse# rake s3:upload_assets
Installing CORS rules...
skipping
Skipping: assets/logo-single-3f9a3693.png
Skipping: assets/favicon-7e45025e.ico
Skipping: assets/logo-single-dev-0d38377d.png
Skipping: assets/push-notifications/posted-e02e1c60.png
Skipping: assets/push-notifications/watching_first_post-e02e1c60.png
Skipping: assets/push-notifications/README-d49cc975.md
(lunga lista...)
Skipping: assets/plugins/footnote_extra-95ffab71.gz.js

Non dovresti, ma queste sono le cose che renderebbero il tuo sito “rotto” (o per te “rotto” significa “immagini mancanti”?) Il caricamento di immagini con migrate_to_s3 influisce solo sulle immagini.

Non riesco a spiegare come le risorse siano già state caricate (cosa c’era di rotto sul sito? Come sono state caricate se la tua configurazione S3 è rotta?)

Puoi caricare immagini sul tuo sito?

Al momento non posso fare nulla sul sito.
Sentiti libero di guardarlo e vedere. https://eu.technospider.com

Dato che tutto sembra essere nel mio bucket, probabilmente c’è una variabile d’ambiente che deve essere aggiornata per far funzionare tutto correttamente.
Se riusciamo a risolvere questo problema, possiamo dire che R2 è pronto per il grande momento.

Manca questo (e un sacco di altri file) https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?__ws=eu.technospider.com

È il tuo CDN o il tuo bucket? Quel file esiste nel tuo bucket? Forse è nel tuo bucket ma il tuo CDN è rotto?

Ecco come ho configurato R2 una volta e penso che abbia funzionato.

            - "DISCOURSE_S3_REGION: 'auto'"
            - "DISCOURSE_S3_ENDPOINT: https://some-number.r2.cloudflarestorage.com"
            - "DISCOURSE_S3_ACCESS_KEY_ID: 'keyid'"
            - "DISCOURSE_S3_SECRET_ACCESS_KEY: 'secret'"
            - "DISCOURSE_S3_CDN_URL: 'https://r2.myforum.us/xyz'"
            - "DISCOURSE_CDN_URL: 'https://r2.literatecomputing.com'"
            - "DISCOURSE_S3_BUCKET: 'myforum/xyz'"
            - "DISCOURSE_S3_BACKUP_BUCKET: 'myforum/xyz/backups'"

Quindi questo non ha mai funzionato?

1 Mi Piace

Dove dovrebbe trovarsi “extra-locales”? Non lo vedo sotto ‘public’ o ‘assets’ nemmeno all’interno del container. Dove dovrei cercare?

Scusa per le domande stupide, ma questa è un’avventura completamente nuova per me.
Cos’è il mio CDN o il mio bucket?

Con i trattini iniziali e tutte le virgolette singole e doppie? Non ho nessuno di questi nel mio file app.yml. Dovrei aggiungerli e ricostruire per testare?
Questo è esattamente come appare il mio file, indentato di 2 spazi ciascuno:

## Questo insieme di righe consente di caricare e scaricare file ospitati su R2 S3.
  DISCOURSE_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_ENDPOINT: https://randomnumber.r2.cloudflarestorage.com
  DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_BACKUP_BUCKET: exotics-unlimited-backups
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_BUCKET: exotics-unlimited
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: randomnumbers
  DISCOURSE_S3_SECRET_ACCESS_KEY: randomnumbers
  DISCOURSE_S3_INSTALL_CORS_RULE: false

Ha funzionato quando ho inserito le impostazioni tramite l’interfaccia web, poi quando ho inserito tutto nel file app.yml ho ottenuto quello che hai visto quando sei andato sul sito.

Ecco cosa vedo quando accedo a una delle tue risorse:

Questo oggetto non esiste o non è accessibile pubblicamente a questo URL. Controlla l'URL dell'oggetto che stai cercando o contatta il proprietario per abilitare l'accesso pubblico.

Puoi vedere se https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?__ws=eu.technospider.com funziona se cambi l’hostname con il tuo endpoint Cloudflare.

Puoi trovare quel file nel tuo bucket? Puoi accedervi?

Non lo so, ma è un URL che ho copiato dagli strumenti per sviluppatori nel mio browser.

Quindi prima trova quel file nel tuo bucket e vedi se c’è, e poi potrai capire perché la CDN non riesce a trovarlo.

No. Uso uno strumento diverso per la configurazione, ma quelle sono le impostazioni ENV che sono abbastanza sicuro che abbiano funzionato per me una volta.

Capisco. È frustrante. Buona fortuna.

Ottengo:

Questo file XML non sembra avere alcuna informazione di stile associata. L'albero del documento è mostrato di seguito.
<Errore>
<Codice>InvalidArgument</Codice>
<Messaggio>Autorizzazione</Messaggio>
</Errore>

Il mio endpoint è:
https://7100e60b936991e069a3230dc05d4976.r2.cloudflarestorage.com/exotics-unlimited/

Ho appena cambiato

DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com

in

DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com/exotics-unlimited

E ora mi trovo di fronte a un indicatore di caricamento che non scompare mai.
Progresso? Chi può dirlo. :slight_smile:

Trova una risorsa a cui puoi accedere tramite l’URL del bucket e poi scopri come accedere alla stessa risorsa tramite la CDN.

Perdonami per non saperlo. Ma qual è il bucket rispetto alla CDN.

Un bucket è quella “directory principale” che hai creato e dove si trovano tutti i file. CDN è un insieme di server in tutto il mondo che ricevono una copia di quel bucket. Il tuo è identificato tramite l’URL che hai fornito quando è stata creata quella connessione, ad esempio cdn.example.com.

Sembra che con R2 venga creato automaticamente il CDN se si assegna un dominio personalizzato al bucket. Questo è stato un po’ confusionario poiché non ho dovuto fare nulla con il CDN.

Vedrò cosa riesco a capire.

Sembra che, indipendentemente da ciò che provo, non riesco ad accedere a nessun oggetto dall’URL dell’endpoint R2.

https://7100***********dc05d4976.r2.cloudflarestorage.com/exotics-unlimited/assets/logo-815195ae.png

e

https://exotics-unlimited.7100***********dc05d4976.r2.cloudflarestorage.com/assets/logo-815195ae.png

Mi restituisce:

Questo file XML non sembra avere alcuna informazione di stile associata. L'albero del documento è mostrato di seguito.
<Error>
<Code>InvalidArgument</Code>
<Message>Authorization</Message>
</Error>

Ma tramite CDN:

![discourse](upload://4axzzMIqD328iAou0u6qv18Avo8.png)

Mi restituisce:
discourse
Poiché l’errore parla di autorizzazione, ho approfondito un po’ e ho trovato questo frammento:

Nota

Per impostazione predefinita, solo alcuni tipi di file vengono memorizzati nella cache. Per memorizzare nella cache tutti i file nel tuo bucket, devi impostare una regola della pagina “Cache tutto”.

Per ulteriori informazioni sul comportamento predefinito della cache e su come personalizzarlo, fai riferimento a Comportamento predefinito della cache

Da questa pagina:

Ho creato una regola “Cache tutto”, ma non è cambiato nulla.