Плагин пост-голосования конфликтует с предыдущим плагином вопрос-ответ

Привет!

У меня возник большой конфликт на Discourse после изменений…

  1. Раньше у меня было:
- git clone https://github.com/discourse/discourse-question-answer
  1. Сегодня я хотел добавить:
- git clone https://github.com/discourse/discourse-question-answer
- git clone https://github.com/discourse/discourse-post-voting

В результате возник конфликт между двумя плагинами:

Сводка
I, [2022-12-09T10:13:26.139287 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
/var/www/discourse/plugins/discourse-question-answer/lib/question_answer/engine.rb:4: warning: already initialized constant QuestionAnswer::CREATE_AS_QA_DEFAULT
/var/www/discourse/plugins/discourse-post-voting/lib/question_answer/engine.rb:4: warning: previous definition of CREATE_AS_QA_DEFAULT was here
/var/www/discourse/plugins/discourse-question-answer/app/controllers/question_answer/votes_controller.rb:75: warning: already initialized constant QuestionAnswer::VotesController::VOTERS_LIMIT
/var/www/discourse/plugins/discourse-post-voting/app/controllers/question_answer/votes_controller.rb:75: warning: previous definition of VOTERS_LIMIT was here
/var/www/discourse/plugins/discourse-question-answer/app/models/question_answer_vote.rb:7: warning: already initialized constant QuestionAnswerVote::VOTABLE_TYPES
/var/www/discourse/plugins/discourse-post-voting/app/models/question_answer_vote.rb:7: warning: previous definition of VOTABLE_TYPES was here
/var/www/discourse/plugins/discourse-question-answer/app/models/question_answer_comment.rb:7: warning: already initialized constant QuestionAnswerComment::COOKED_VERSION
/var/www/discourse/plugins/discourse-post-voting/app/models/question_answer_comment.rb:7: warning: previous definition of COOKED_VERSION was here
/var/www/discourse/plugins/discourse-question-answer/app/models/question_answer_comment.rb:26: warning: already initialized constant QuestionAnswerComment::MARKDOWN_FEATURES
/var/www/discourse/plugins/discourse-post-voting/app/models/question_answer_comment.rb:26: warning: previous definition of MARKDOWN_FEATURES was here
/var/www/discourse/plugins/discourse-question-answer/app/models/question_answer_comment.rb:31: warning: already initialized constant QuestionAnswerComment::MARKDOWN_IT_RULES
/var/www/discourse/plugins/discourse-post-voting/app/models/question_answer_comment.rb:31: warning: previous definition of MARKDOWN_IT_RULES was here
/var/www/discourse/plugins/discourse-question-answer/extensions/topic_extension.rb:9: warning: already initialized constant Topic::QA_SUBTYPE
/var/www/discourse/plugins/discourse-post-voting/extensions/topic_extension.rb:9: warning: previous definition of QA_SUBTYPE was here
rake aborted!
ArgumentError: Invalid route name, already in use: 'question_answer' 
You may have defined two routes with the same name using the `:as` option, or you may be overriding a route already defined by a resource with the same naming. For the latter, you can restrict the routes created with `resources` as explained here: 
https://guides.rubyonrails.org/routing.html#restricting-the-routes-created
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/route_set.rb:587:in `add_route'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/mapper.rb:1986:in `add_route'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/mapper.rb:1957:in `decomposed_match'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/mapper.rb:1921:in `block in map_match'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/mapper.rb:1915:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/mapper.rb:1915:in `map_match'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/mapper.rb:1663:in `match'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/mapper.rb:642:in `mount'
/var/www/discourse/plugins/discourse-question-answer/config/routes.rb:16:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/route_set.rb:427:in `instance_exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/route_set.rb:427:in `eval_block'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/route_set.rb:434:in `block in finalize!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/route_set.rb:434:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.6.1/lib/action_dispatch/routing/route_set.rb:434:in `finalize!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application/routes_reloader.rb:51:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application/routes_reloader.rb:51:in `finalize!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application/routes_reloader.rb:22:in `reload!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application/routes_reloader.rb:35:in `block in updater'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-6.1.6.1/lib/active_support/file_update_checker.rb:83:in `execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application/routes_reloader.rb:10:in `execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application/finisher.rb:195:in `block in <module:Finisher>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/initializable.rb:32:in `instance_exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/initializable.rb:32:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/initializable.rb:60:in `run_initializers'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application.rb:391:in `initialize!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/railtie.rb:207:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/railtie.rb:207:in `method_missing'
/var/www/discourse/config/environment.rb:7:in `<main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.9.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.9.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.9.4/lib/bootsnap/load_path_cache/loaded_features_index.rb:88:in `register'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.9.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.9.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.6.0/lib/zeitwerk/kernel.rb:35:in `require'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-6.1.6.1/lib/active_support/dependencies.rb:332:in `block in require'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-6.1.6.1/lib/active_support/dependencies.rb:299:in `load_dependency'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-6.1.6.1/lib/active_support/dependencies.rb:332:in `require'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application.rb:367:in `require_environment!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-6.1.6.1/lib/rails/application.rb:533:in `block in run_tasks_blocks'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
I, [2022-12-09T10:13:36.170591 #1]  INFO -- : gem install rrule -v 0.4.4 -i /var/www/discourse/plugins/discourse-calendar/gems/2.7.6 --no-document --ignore-dependencies --no-user-install
Successfully installed rrule-0.4.4
1 gem installed



FAILED
--------------------
  1. Затем я удалил первый плагин. Сборка прошла успешно, но приложение больше не работает:
    • Я получил ошибку HTTP 500
    • Логи ошибок nginx показывают следующее:
    root@slazvmeutp01:/opt/discourse# cat /var/opt/discourse/var-log/nginx/error.log
    2022/12/09 10:47:34 [notice] 537#537: signal process started
    2022/12/09 10:47:37 [error] 554#554: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 18.156.156.214, server: _, request: "POST /message-bus/76e1bd78eedf43a5a337b6f44a8b88d0/poll?dlp=t HTTP/2.0", upstream: "http://127.0.0.1:3000/message-bus/76e1bd78eedf43a5a337b6f44a8b88d0/poll?dlp=t", host: "mydiscourse.domain.com", referrer: "https://mydiscourse.domain.com/admin/plugins"
    2022/12/09 10:59:08 [crit] 554#554: *398 SSL_do_handshake() failed (SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share) while SSL handshaking, client: 212.102.40.218, server: 0.0.0.0:443
    2022/12/09 11:25:50 [notice] 530#530: signal process started
    

Я заметил, что репозиторий Git https://github.com/discourse/discourse-question-answer теперь перенаправляет на второй https://github.com/discourse/discourse-post-voting.
Это, вероятно, объясняет конфликт при первой сборке сегодня.
Но что происходит сейчас? Там указана ошибка TLS, а не ошибка плагина…

Есть какие-нибудь идеи?

Использование только discourse-post-voting — правильное решение. :+1:

Не уверен насчет логов ошибок nginx, но, полагаю, у вас в плагинах тоже нет discourse-feature-voting, верно?

О боже, вы были правы!!
У меня он тоже был, и я вижу, что репозиторий Git также перенаправляет на https://github.com/discourse/discourse-post-voting !! :scream_cat:

Но подождите… голосование за темы и Q&A объединены в голосование за посты? Функции суммируются?

Вот мой последний список плагинов:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-openid-connect
          - git clone https://github.com/discourse/discourse-solved
          - git clone https://github.com/discourse/discourse-yearly-review
          - git clone https://github.com/discourse/discourse-checklist
          - git clone https://github.com/discourse/discourse-docs
          - git clone https://github.com/discourse/discourse-reactions
            #- git clone https://github.com/discourse/discourse-feature-voting
          - git clone https://github.com/discourse/discourse-calendar
            #- git clone https://github.com/discourse/discourse-gamification
          - git clone https://github.com/discourse/discourse-gamification && cd discourse-gamification && git checkout 6a399b4c220f31de62049504d27ff6e50611fbef
          - git clone https://github.com/discourse/discourse-follow
          - git clone https://github.com/discourse/discourse-spoiler-alert
          - git clone https://github.com/paviliondev/discourse-news
          - git clone https://github.com/cfstras/discourse-konami.git
            #- git clone https://github.com/discourse/discourse-question-answer
          - git clone https://github.com/discourse/discourse-post-voting

Discourse наконец-то отвечает.
Но теперь другие проблемы:

  1. В админ-панели плагинов отображается «вопросы и ответы»…
    image
  2. При создании темы меню пунктов отображается некорректно:
  3. Настройки категорий всегда показывают Q&A
    image

Похоже, что Q&A всегда присутствует…

Нет, я ошибаюсь!
Это отдельные проекты, извините.

discourse-feature-voting — это старое название для Discourse Topic Voting, и наличие старого имени вызывает конфликты при загрузке, если там также присутствует post-voting. Если вы добавите новое имя discourse-topic-voting, вы снова сможете использовать оба плагина. :+1:

Не совсем понятно, почему у вас всё ещё используется старый формат Q&A? Я заметил, что вы проверяете конкретную версию Gamification — связано ли это с тем, что вы ограничены определённой совместимостью?

Да!
Я тот, кто отслеживает «стабильную» версию Discourse :sweat_smile:
Это обходной путь, о котором я упоминал здесь: Database migrate fails in "stable" version - #2 by gmoirod

Хорошо, сейчас проведу тест.

Я тоже не знаю :sob:

Официальный плагин post-voting был относительно недавно переименован в ‘post-voting’, и некоторое время в интерфейсе и других местах он отображался как «Вопросы и ответы». Возможно, ваша установка не получает эти изменения, так как вы используете стабильную ветку?

Существует ли способ корректно «удалить» плагин?
Я мог бы использовать это, чтобы удалить q&a и post-voting, а затем переустановить post-voting…

Когда вы проверяете страницу /admin/upgrade, какой номер версии вы видите рядом с post-voting?

Моя версия, прошедшая тестирование и актуальная: 5ea4dccf

Редактирование: Я исправил адрес страницы :slight_smile:

Похоже, что голосование за темы теперь работает корректно.

У меня нет страницы /plugins :thinking:
Но на странице /admin/upgrade я вижу:

  1. Post-voting отсутствует.
  2. q&a отображается без зелёной галочки.

Похоже, вы зафиксированы на этом коммите (FIX: clarify error message for undo vote action window (#98) · discourse/discourse-post-voting@50d8ea4 · GitHub) от сентября, когда проект ещё назывался question-answer:

Вы используете актуальную стабильную версию? На какой версии вы сейчас находитесь?


Кажется, всё в порядке.



Новая проблема…

  1. Я удалил плагины для голосования за посты и темы, пересобрал приложение, чтобы начать с чистого листа (q&a тоже не отображается, несмотря на множество попыток): ок, плагинов больше нет.
  2. Я вернул плагины для голосования за посты и темы, и теперь сборка не удаётся…
Сводка
I, [2022-12-09T14:27:32.724323 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile'
Не удалось обновить 'Discourse Loading Slider': Timeout::Error
rake aborted!
Timeout::Error: Timeout::Error
/var/www/discourse/lib/final_destination/resolver.rb:28:in `block in lookup'
/var/www/discourse/lib/final_destination/resolver.rb:7:in `synchronize'
/var/www/discourse/lib/final_destination/resolver.rb:7:in `lookup'
/var/www/discourse/lib/final_destination/ssrf_detector.rb:84:in `lookup_ips'
/var/www/discourse/lib/final_destination/ssrf_detector.rb:64:in `lookup_and_filter_ips'
/var/www/discourse/lib/theme_store/git_importer.rb:139:in `block in clone_http!'
/var/www/discourse/lib/theme_store/git_importer.rb:131:in `each'
/var/www/discourse/lib/theme_store/git_importer.rb:131:in `clone_http!'
/var/www/discourse/lib/theme_store/git_importer.rb:93:in `clone!'
/var/www/discourse/lib/theme_store/git_importer.rb:18:in `import!'
/var/www/discourse/app/models/remote_theme.rb:126:in `update_remote_version'
/var/www/discourse/lib/tasks/themes.rake:62:in `block in update_themes'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:71:in `block (2 levels) in find_each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:71:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:71:in `block in find_each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:138:in `block in find_in_batches'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:245:in `block in in_batches'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:229:in `loop'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:229:in `in_batches'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:137:in `find_in_batches'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.6.1/lib/active_record/relation/batches.rb:70:in `find_each'
/var/www/discourse/lib/tasks/themes.rake:56:in `update_themes'
/var/www/discourse/lib/tasks/themes.rake:87:in `block (2 levels) in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/themes.rake:86:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Задачи: TOP => themes:update
(Полный трассировочный вывод можно получить, запустив задачу с флагом --trace)
I, [2022-12-09T14:27:49.987988 #1]  INFO -- : Проверка 'Modern Category + Group Boxes' для 'default'... актуально
Проверка 'Dark-Light Toggle' для 'default'... обновление с cd221006 до 3f72c88f
Проверка 'Discourse Loading Slider' для 'default'... 


ОШИБКА
--------------------

Снова пересоберите, и всё прошло.
Так что последняя проблема с 'Discourse Loading Slider' была просто сбоем.
Забудьте об этом.

Моя главная проблема в том, что вместо голосования за посты остаётся раздел вопросов и ответов…

Я думаю, это может быть следствием используемой вами сборки и проблем совместимости. Если посмотреть, что должно отображаться как discourse-topic-voting, то на вашей странице всё ещё показано как discourse-voting.

То есть, вы имеете в виду, что мне следует использовать версию Discourse с тегом ‘tests-passed’?

Если вы хотите получить самые свежие версии. :slightly_smiling_face:

Я бы предпочел, чтобы версии на самом деле были «рабочими» :sweat_smile:
Я знаю, что есть тема о том, какую версию использовать, полагая, что «tests-passed» означает готовность к запуску.
Но я, знаете ли, «человек из Debian»… Стабильность для продакшена!

Я тоже считаю, что это отличный выбор. :+1: :slightly_smiling_face: Обратная сторона медали в том, что вам придётся дождаться запуска версии 3.0 в новом году, чтобы эти последние обновления заработали со Stable.

Хорошо…

Это немного разочаровывает, что управление плагинами не предоставляет возможности отслеживать определённую ссылку в Git.
А также то, что плагины следуют жизненному циклу Discourse.
Так что вы можете глобально отслеживать ветку ‘stable’ как для самого Discourse, так и для плагинов.

На самом деле каждая пересборка или внедрение плагина ощущается как рулетка.

Боюсь, мои знания о ветке Stable довольно ограничены, но, на мой взгляд, она ориентирована на то, чтобы как можно реже вносить изменения. Поэтому я думаю, что добавление новых плагинов и расширений вне окна релиза Stable было бы противоречить этой идее?

Стоит также отметить, что большинство сайтов на Discourse используют ветку test-passed и, как правило, не имеют каких-либо значимых проблем. Даже следование ветке test-passed не означает, что нужно обновляться каждый день и всегда находиться на самой последней версии, поэтому изменения происходят не так часто, как вы, возможно, думаете. Чтобы внедрить эти изменения на свой сайт, вам нужно будет вручную нажать кнопку обновления на странице /upgrade или выполнить пересборку.

Управляемый хостинг также упрощает этот процесс как альтернатива, поскольку они берут на себя все технические вопросы, позволяя вам сосредоточиться на вашем сообществе. :+1: