Ошибка при выполнении "bundle exec rake s3:upload_assets" — не удалось найти Gemfile или директорию .bundle/

Я пытаюсь выполнить bundle exec rake s3:upload_assets от имени root, но получаю следующие ошибки: Could not locate Gemfile or .bundle/ directory.

Также я попробовал выполнить команду без root, используя sudo -E -u discourse bundle exec rake s3:upload_assets, но получил следующие ошибки: sudo: unknown user discourse sudo: error initializing audit plugin sudoers_audit

  • Обе команды я выполнил в следующей директории: /var/discourse
  • Это стандартная установка, без использования Docker или чего-либо подобного.

Как я могу это исправить, чтобы иметь возможность выполнить эту команду?

Спасибо.

Вам нужно запустить это внутри контейнера.

cd /var/discourse
./launcher enter app

А затем выполните эту команду.

Спасибо! Это помогло мне продвинуться дальше, теперь я столкнулся с этой ошибкой:

root@redacted:/var/www/discourse# sudo -E -u discourse bundle exec rake s3:upload_assets
/root is not writable.
Bundler will use `/tmp/bundler20250409-510203-w6snye510203' as your home directory temporarily.
ERROR: Ensure S3 is configured in config/discourse.conf or environment vars

У меня всё настроено в параметрах сайта Discourse. Я не использую Docker, поэтому мне не нужны переменные окружения?

Я попытался добавить переменные окружения в app.yml, пересобрать образ, снова зайти в приложение и выполнить команду, но получил следующее:

`/root` не доступен для записи.
Bundler будет использовать `/tmp/bundler20250409-1393-48ek5u1393` как временный домашний каталог.
Применение правил CORS...
Попытка применить набор правил CORS для ASSETS в бакете biohacking-forum.
rake aborted!
Seahorse::Client::NetworkingError: Пустое или неполное тело ответа (Seahorse::Client::NetworkingError)
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/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.182.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.182.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.182.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.219.0/lib/aws-sdk-core/plugins/checksum_algorithm.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/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.219.0/lib/aws-sdk-core/plugins/invocation_id.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/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.219.0/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.219.0/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/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.219.0/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `block in call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/lib/aws-sdk-core/telemetry/no_op.rb:29:in `in_span'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/lib/aws-sdk-core/plugins/telemetry.rb:53:in `span_wrapper'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/client.rb:6359:in `get_bucket_cors'
/var/www/discourse/lib/s3_helper.rb:401:in `fetch_bucket_cors_rules'
/var/www/discourse/lib/s3_helper.rb:168:in `ensure_cors!'
/var/www/discourse/lib/s3_cors_rulesets.rb:60:in `sync'
/var/www/discourse/lib/tasks/s3.rake:183: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>'
Задачи: TOP => s3:upload_assets => s3:ensure_cors_rules
(Полный трассировочный отчет можно получить, запустив задачу с флагом --trace)

Так и не удалось разобраться в этом :frowning:

Переменные окружения всё же необходимы, поэтому в документации по настройке совместимого с S3 провайдера объектного хранилища для загрузок указано именно так, и именно об этом сообщает сообщение об ошибке.

Все переменные S3 следует перенести в скрытые настройки, так как их конфигурация через параметры сайта обычно не приносит пользы.

Извините, я забыл, что вы не используете Docker. Но да, вам всё равно нужно установить их в переменных окружения ENV. Я делаю это в своей среде разработки для восстановления баз данных из S3.

Если вы настраиваете это не для среды разработки, то, скорее всего, совершаете серьёзную ошибку.

@Eviepayne

Исправил, выполнив следующие действия — было две ошибки.

Сначала исправил вторую ошибку так:

rails c
Upload.find(386).destroy!
exit

Это устранило проблему с повреждённым постом (некорректный текст или что-то подобное).

Затем красные ошибки на экране возникали из-за использования случайного поддомена (предоставленного Cloudflare) и загрузки файлов на него. Мне пришлось загрузить файлы на новый домен (включая мой подключённый домен).

Используя:

sudo -E -u discourse bundle exec rake s3:upload_assets

Затем:

sudo -E -u discourse bundle exec rake uploads:migrate_to_s3

После этого форум загрузился корректно, и при щелчке правой кнопкой мыши и открытии изображений в новой вкладке видно, что они размещены на R2. Затем я сделал резервную копию.

Наконец, я очистил всё с помощью:

sudo -E -u discourse bundle exec rake uploads:clean_up

Это освободило соответствующее дисковое пространство для файлов (обратите внимание: у меня осталась локальная резервная копия обоих файлов — на уровне ОС и на уровне Discourse — до миграции).

Теперь всё работает идеально!