Impossible de effectuer une sauvegarde ou de naviguer vers les sauvegardes

Obtention

La sauvegarde a échoué.

Voici le journal :

undefined method `start_with?' for nil /var/www/discourse/app/models/site_setting.rb:172:in `use_dualstack_endpoint’
/var/www/discourse/lib/s3_helper.rb:269:in `s3_options' /var/www/discourse/lib/backup_restore/s3_backup_store.rb:14:in `initialize’
/var/www/discourse/lib/backup_restore/backup_store.rb:17:in `new'`


après une reconstruction très récente vers la dernière version.

Dans mon cas, S3 est hébergé avec un bucket AWS standard.

Cela pourrait-il être lié ?

4 « J'aime »

J’utilise le stockage d’objets minio pour mon s3 et j’obtiens cette erreur :

rake aborted!
Aws::S3::Errors::Http504Error: Aws::S3::Errors::Http504Error (Aws::S3::Errors::Http504Error)
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/client.rb:11285:in `list_objects_v2'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/bucket.rb:1304:in `block (2 levels) in objects'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/user_agent.rb:28:in `feature'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/bucket.rb:1303:in `block in objects'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:101:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:101:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:101:in `block in non_empty_batches'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:52:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:52:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:52:in `block in each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:58:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:58:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:58:in `each'
/var/www/discourse/lib/tasks/s3.rake:14:in `map'
/var/www/discourse/lib/tasks/s3.rake:14:in `existing_assets'
/var/www/discourse/lib/tasks/s3.rake:210:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => s3:expire_missing_assets
(See full trace by running task with --trace)
I, [2024-11-11T08:02:51.942337 #1]  INFO -- : Checking for stale S3 assets...

I, [2024-11-11T08:02:51.944197 #1]  INFO -- : Terminating async processes
I, [2024-11-11T08:02:51.944334 #1]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 39
I, [2024-11-11T08:02:51.944432 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 107
2024-11-11 08:02:51.944 UTC [39] LOG:  received fast shutdown request
107:signal-handler (1731312171) Received SIGTERM scheduling shutdown...
2024-11-11 08:02:51.945 UTC [39] LOG:  aborting any active transactions
2024-11-11 08:02:51.949 UTC [39] LOG:  background worker "logical replication launcher" (PID 54) exited with exit code 1
2024-11-11 08:02:51.950 UTC [49] LOG:  shutting down
107:M 11 Nov 2024 08:02:51.960 # User requested shutdown...
107:M 11 Nov 2024 08:02:51.960 * Saving the final RDB snapshot before exiting.
2024-11-11 08:02:52.047 UTC [39] LOG:  database system is shut down
107:M 11 Nov 2024 08:02:52.207 * DB saved on disk
107:M 11 Nov 2024 08:02:52.208 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake s3:expire_missing_assets failed with return #&lt;Process::Status: pid 3550 exit 1&gt;
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "cmd"=>["sudo -E -u discourse bundle exec rake s3:upload_assets", "sudo -E -u discourse bundle exec rake s3:expire_missing_assets"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
4f601885ffad64bcd29f6dbd06df1f0f86ad301341d40e752df7447809a32eff

@martin

1 « J'aime »

Un autre problème est que vous ne pouvez plus accéder aux sauvegardes :

Erreur lors du calcul du rapport `storage_stats` : méthode `start_with?' indéfinie pour nil
/var/www/discourse/app/models/site_setting.rb:172:in `use_dualstack_endpoint'
/var/www/discourse/lib/s3_helper.rb:269:in `s3_options'
2 « J'aime »

Est-ce que cela pourrait être la raison ?

[7] pry(main)> SiteSetting.Upload.s3_region
=> nil
[8] pry(main)> SiteSetting.s3_region
=> "eu-west-2"
[9] pry(main)>

SiteSetting.Upload.s3_region est vide sur mon instance, donc starts_with? génère une erreur.

1 « J'aime »

Dans cette PR :

Le spec utilise SiteSetting.s3_region, mais le code utilise SiteSetting.Upload.s3_region :thinking:

2 « J'aime »

@hosna et @merefield, SiteSetting.enable_s3_uploads est-il vrai pour vous deux ? Si c’est le cas, nous devrions simplement utiliser SiteSetting.s3_region :

Qu’en est-il de SiteSetting::Upload.enable_s3_uploads, qu’est-ce que cela vous donne ?

Je pourrais faire une correction comme celle-ci, en utilisant la navigation sécurisée pour s3_region :

def self.use_dualstack_endpoint
  SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region&.start_with?("cn-")
end

Mais je veux comprendre pourquoi SiteSetting.Upload.s3_region est vide pour vous.

2 « J'aime »

OK, c’est de plus en plus étrange, il y a deux paramètres ?

image

  • J’utilise S3 pour les sauvegardes mais pas pour les téléversements (ce qui est un choix valide et ce qui est le cas depuis des années ?)
  • L’activation des deux n’est pas imposée par l’interface.
  • Je n’ai pas changé de paramètres depuis des années.

Ainsi SiteSetting::Upload.s3_region est vide car je ne l’utilise pas ?

Bien que, comme note annexe, les téléversements devraient être regroupés avec les sauvegardes de toute façon, mais SiteSetting.s3_region devrait suffire pour cela ?

Mes sauvegardes échouent toujours

3 « J'aime »

si vous parlez de ce paramètre, non, il n’est pas activé pour moi

J’ai configuré S3 dans mon fichier app.yml comme ceci

ce qui a été mentionné ici

@martin

3 « J'aime »

Je signale le même problème que celui mentionné ci-dessus. Pas d’accès à /admin/backups (erreur 500), la sauvegarde a échoué.

Les sauvegardes S3 sont activées, les téléchargements S3 ne le sont pas - c’est ainsi depuis des années et cela fonctionne avec succès.

Journal d'erreurs
### Message (14 copies signalées)

Erreur lors du calcul du rapport `storage_stats` : méthode indéfinie `start_with?' pour nil /var/www/discourse/app/models/site_setting.rb:172:in `use_dualstack_endpoint' /var/www/discourse/lib/s3_helper.rb:269:in `s3_options' /var/www/discourse/lib/backup_restore/s3_backup_store.rb:14:in `initialize' /var/www/discourse/lib/backup_restore/backup_store.rb:17:in `new' /var/www/discourse/lib/backup_restore/backup_store.rb:17:in `create' /var/www/discourse/app/models/concerns/reports/storage_stats.rb:10:in `report_storage_stats' /var/www/discourse/app/models/report.rb:269:in `public_send' /var/www/discourse/app/models/report.rb:269:in `block in find' /var/www/discourse/app/models/report.rb:165:in `block in wrap_slow_query' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.5/lib/active_record/connection_adapters/abstract/transaction.rb:535:in `block in within_new_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.1.5/lib/active_support/concurrency/null_lock.rb:9:in `synchronize' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.5/lib/active_record/connection_adapters/abstract/transaction.rb:532:in `within_new_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb:344:in `transaction' /var/www/discourse/app/models/report.rb:160:in `wrap_slow_query' /var/www/discourse/app/models/report.rb:267:in `find' /var/www/discourse/app/controllers/admin/reports_controller.rb:97:in `block (2 levels) in bulk' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:400:in `block in each_pair' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:399:in `each_pair' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:399:in `each_pair' /var/www/discourse/app/contro...

### Trace

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:134:in `block in error'

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:231:in `each'

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:231:in `dispatch'

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:134:in `error'

/var/www/discourse/app/models/report.rb:295:in `rescue in find'

/var/www/discourse/app/models/report.rb:262:in `find'

/var/www/discourse/app/controllers/admin/reports_controller.rb:97:in `block (2 levels) in bulk'

actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:400:in `block in each_pair'

actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:399:in `each_pair'

actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:399:in `each_pair'

/var/www/discourse/app/controllers/admin/reports_controller.rb:76:in `block in bulk'

/var/www/discourse/lib/hijack.rb:64:in `instance_eval'

/var/www/discourse/lib/hijack.rb:64:in `block in hijack'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:911:in `callback_on_resolution'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:797:in `call_callback'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:803:in `call_callbacks'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:692:in `resolve_with'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:1325:in `resolve'

/var/www/discourse/lib/scheduler/defer.rb:115:in `block in do_work'

rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'

rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'

/var/www/discourse/lib/scheduler/defer.rb:109:in `do_work'

/var/www/discourse/lib/scheduler/defer.rb:97:in `block (2 levels) in start_thread'

### Env

1/14

|hostname|forum-app|
| --- | --- |
|process_id|849|
|application_version|234133bd3b0750b2675a1c2c6745616c899df990|
|HTTP_HOST|forum.glasair-owners.com|
|REQUEST_METHOD|GET|
|HTTP_USER_AGENT|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36|
|HTTP_ACCEPT|application/json, text/javascript, */*; q=0.01|
|HTTP_REFERER|https://forum.glasair-owners.com/admin|
|HTTP_X_FORWARDED_FOR|xxx|
|HTTP_X_REAL_IP|xxx|
|username|xxx|
|time|6:47 pm|
||params null|
2 « J'aime »

Même problème ici…

3 « J'aime »

Non. C’est ça le problème, j’en suis sûr. Ils utilisent S3 pour les sauvegardes, mais pas pour les téléchargements, ce qui est une configuration assez courante pour les auto-hébergeurs. Il est facile de configurer les sauvegardes S3, et cela ne nécessite pas de CDN ni de modifier le YML pour télécharger les actifs à précompiler.

Il est vide parce qu’ils n’utilisent pas S3 pour les téléchargements.

      SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

du lien github ci-dessus, devrait être

      GlobalSettings.use_s3 && SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

ou peut-être

      SiteSetting.enable_s3_uploads && SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

Je ne suis pas tout à fait sûr de la façon dont use_s3 et enable_s3_uploads sont connectés.

4 « J'aime »

Et je pense que

devrait vraiment être def self.enable_s3_uploads? (puisqu’il signale si les téléchargements s3 sont activés plutôt que de les activer) et ensuite

  SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

devrait être

  use_s3_uploads? && SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

D’un autre côté, c’est ainsi que Sam l’a nommé il y a 7 ans, et cela semble avoir été très bien :-).

donc, tel que la fonction est nommée maintenant

  use_s3_uploads && SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")
5 « J'aime »

ne devrait-ce pas plutôt être ? :

use_s3_uploads? && !SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

c’est-à-dire que le point de terminaison des téléchargements S3 n’est pas vide ?

3 « J'aime »

mais j’utilise aussi s3 pour les téléchargements. Je l’ai configuré dans mon app.yml.

3 « J'aime »

J’ai la même chose… je me suis connecté à mon fournisseur de stockage pour vérifier si j’avais payé la facture, et je l’ai fait.

Pourquoi un changement aussi radical a-t-il été appliqué sans aucune annonce ?

Devons-nous maintenant tout saisir dans app.yml ?

Pourquoi tous les paramètres ont-ils été supprimés du backend d’administration ? Comment pouvons-nous récupérer ces paramètres ? Je l’ai configuré il y a des années et je n’ai aucune idée de quelle est ma clé ou mon secret, et je ne suis même pas sûr de pouvoir le récupérer sans réinitialiser la clé (ce qui affecterait d’autres services pour lesquels j’utilise les mêmes points de terminaison s3…)

2 « J'aime »

Je pense que les paramètres sont toujours là dans l’interface utilisateur (emplacement de sauvegarde, fréquence, compartiment S3, etc.), cela ne fonctionne tout simplement plus comme avant.

Je ne pense pas qu’il s’agisse d’un changement fonctionnel intentionnel, c’est juste cassé ?

Il devrait certainement toujours être possible de sauvegarder sur S3 sans avoir à stocker les téléchargements sur S3 - ce sont deux cas d’utilisation distincts, bien que quelque peu alignés…

5 « J'aime »

Même problème
J’utilisais S3 pour la sauvegarde, pas pour le téléchargement.

2 « J'aime »

Parce qu’il n’était pas censé casser quoi que ce soit, mais le code s3 doit prendre en charge un grand nombre de cas limites, et à moins que vous n’ayez écrit ce code ou prêté attention à son développement au fil des ans, il est assez difficile d’intervenir et de voir à quel point le problème est important.

3 « J'aime »

Désolé à tous, j’étais absent pour cause de maladie pendant quelques jours. Ceci devrait résoudre le problème :

J’ai essayé ceci localement avec les téléchargements S3 désactivés et les sauvegardes S3 activées avant et après la correction, j’ai pu reproduire la même erreur puis la résoudre.

7 « J'aime »

Reconstruit et sauvegardé avec succès.

Merci @martin .

4 « J'aime »