DISCOURSE_CDN_URL ломает rebuild/restore

РЕДАКТИРОВАНИЕ: Ну, у меня ушло 18 часов, но похоже, что определение DISCOURSE_CDN_URL мешает (по крайней мере) этому сайту пересобираться и/или работать после восстановления. Думаю, следующий шаг — попробовать собрать без DISCOURSE_CDN_URL, а затем запустить контейнер с установленной переменной окружения.

Что я знал до этого

У меня была эта проблема вчера, и я думал, что она исчезла, но оказалось, что я восстановил базу данных месячной давности. Восстановление актуальной базы данных «убивает» сайт.

Я смог собрать сайт с нуля, так что проблема не в коде и не в стандартных плагинах. НО после восстановления базы данных сайт не работает, и я не могу выполнить пересборку, даже если удалю базу данных. Похоже, проблема в каком-то файле, который читается при сжатии JavaScript.

Я попытался удалить все background: image-url в onebox.scss, что позволило сайту пересобраться, но отображение полностью сломано, так что эти ошибки — лишь симптом, а не причина проблемы.

После восстановления базы данных (и файлов) или при пересборке в логах Rails появляются ошибки, подобные следующим:


I, [2019-12-22T21:21:25.532604 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
NOTE: Inheriting Faraday::Error::ClientError is deprecated; use Faraday::ClientError instead. It will be removed in or after version 1.0
Faraday::Error::ClientError.inherited called from /var/www/discourse/plugins/discourse-github/gems/2.6.5/gems/octokit-4.14.0/lib/octokit/middleware/follow_redirects.rb:14.
> Seeding dark and light themes
[SassC::FunctionsHandler] undefined method `protocol' for nil:NilClass
rake aborted!
Discourse::ScssError: Error: error in C function image-url: undefined method `protocol' for nil:NilClass
        on line 90 of app/assets/stylesheets/common/base/onebox.scss, in function `image-url`
        from line 90 of app/assets/stylesheets/common/base/onebox.scss, in mixin `onebox-favicon`
        from line 110 of app/assets/stylesheets/common/base/onebox.scss
        from line 34 of app/assets/stylesheets/common.scss
        from line 1 of desktop.scss
>>     background: image-url("favicons/#{$image}.png") no-repeat 0% 50%;

   ----------------^
/var/www/discourse/lib/stylesheet/manager.rb:183:in `rescue in compile'
/var/www/discourse/lib/stylesheet/manager.rb:171:in `compile'
/var/www/discourse/lib/stylesheet/manager.rb:80:in `block (2 levels) in stylesheet_details'
/var/www/discourse/lib/stylesheet/manager.rb:66:in `each'
/var/www/discourse/lib/stylesheet/manager.rb:66:in `block in stylesheet_details'
/var/www/discourse/lib/stylesheet/manager.rb:64:in `synchronize'
/var/www/discourse/lib/stylesheet/manager.rb:64:in `stylesheet_details'
/var/www/discourse/lib/stylesheet/manager.rb:34:in `stylesheet_data'
/var/www/discourse/app/models/theme.rb:280:in `block in refresh_message_for_targets'
/var/www/discourse/app/models/theme.rb:279:in `map'
/var/www/discourse/app/models/theme.rb:279:in `refresh_message_for_targets'
/var/www/discourse/app/models/theme.rb:267:in `notify_theme_change'
/var/www/discourse/app/models/theme.rb:275:in `notify_theme_change'
/var/www/discourse/app/models/theme.rb:61:in `block in <class:Theme>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:429:in `instance_exec'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:429:in `block in make_lambda'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:239:in `block in halting_and_conditional'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.r

@pfaffman Я только что наткнулся на эту же проблему, когда разбирался с другими трудностями при настройке S3. Вы так и не выяснили, что её вызывало?

Исправил. Убедитесь, что вы добавляете http:// перед URL вашего CDN :facepalm:

Так что вместо DISCOURSE_CDN_URL=your-cdn-url.com должно быть DISCOURSE_CDN_URL=http://your-cdn-url.com.

Всего 2 часа потрачено на отладку :smiley:

Хм, можно ли добавить здесь какое-то предупреждение, @eviltrout, чтобы люди в будущем не сталкивались с этим?

Это вызовет предупреждение, если вы не укажете протокол:

Но идиоты (вроде меня), которые делают это через переменные окружения, всё равно столкнутся с проблемами. Есть ли какой-то недостаток в том, чтобы выводить предупреждение и добавлять https:// в начало?

GlobalSetting — это объект, который передаёт ваши переменные ENV в Discourse, поэтому, если вы сделаете это таким образом, предупреждение также должно появиться.

Я тоже чувствую себя довольно глупо, попавшись в эту ловушку! :laughing:

Если я правильно помню, я потерял на этом 18 часов во время того, что должно было быть рождественскими каникулами. :frowning_face: