Именно поэтому эта тема должна быть тем местом, куда мы направляемся. В оригинальном сообщении есть список, который, кажется, обновляется довольно часто. Если вы посмотрите историю редактирования, то сможете увидеть, какие плагины были добавлены и когда.
На данный момент мы завершили! Остался только cakeday, и он будет готов ещё через несколько месяцев.
Недавно я столкнулся с этой проблемой. Я начал осваивать разработку для Discourse, поэтому хотел потренироваться в обновлении рабочего процесса:
# git pull
# bundle install
# pnpm install
# ./bin/rails db:migrate
Но, думаю, плагин Discourse AI требует плагина Pgvector для PostgreSQL (я раньше даже не знал, что он существует):
== 20230710171141 EnablePgVectorExtension: migrating ==========================
-- enable_extension(:vector)
bin/rails aborted!
StandardError: An error has occurred, this and all later migrations canceled: (StandardError)
ERROR: current transaction is aborted, commands ignored until end of transaction block
/home/john/development/discourse/lib/mini_sql_multisite_connection.rb:109:in 'MiniSqlMultisiteConnection#run'
/home/john/development/discourse/plugins/discourse-ai/db/migrate/20230710171141_enable_pg_vector_extension.rb:8:in 'EnablePgVectorExtension#change'
/home/john/development/discourse/lib/freedom_patches/schema_migration_details.rb:8:in 'block in FreedomPatches::SchemaMigrationDetails#exec_migration'
/home/john/development/discourse/lib/freedom_patches/schema_migration_details.rb:8:in 'FreedomPatches::SchemaMigrationDetails#exec_migration'
/home/john/development/discourse/lib/migration/safe_migrate.rb:28:in 'Migration::SafeMigrate::SafeMigration#migrate'
/home/john/development/discourse/lib/migration/safe_migrate.rb:53:in 'Migration::SafeMigrate::NiceErrors#migrate'
/home/john/development/discourse/lib/tasks/db.rake:267:in 'block (2 levels) in <main>'
/home/john/development/discourse/lib/distributed_mutex.rb:53:in 'block in DistributedMutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:49:in 'Thread::Mutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:49:in 'DistributedMutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:34:in 'DistributedMutex.synchronize'
/home/john/development/discourse/lib/tasks/db.rake:242:in 'block in <main>'
Caused by:
PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block (PG::InFailedSqlTransaction)
/home/john/development/discourse/lib/mini_sql_multisite_connection.rb:109:in 'MiniSqlMultisiteConnection#run'
/home/john/development/discourse/plugins/discourse-ai/db/migrate/20230710171141_enable_pg_vector_extension.rb:8:in 'EnablePgVectorExtension#change'
/home/john/development/discourse/lib/freedom_patches/schema_migration_details.rb:8:in 'block in FreedomPatches::SchemaMigrationDetails#exec_migration'
/home/john/development/discourse/lib/freedom_patches/schema_migration_details.rb:8:in 'FreedomPatches::SchemaMigrationDetails#exec_migration'
/home/john/development/discourse/lib/migration/safe_migrate.rb:28:in 'Migration::SafeMigrate::SafeMigration#migrate'
/home/john/development/discourse/lib/migration/safe_migrate.rb:53:in 'Migration::SafeMigrate::NiceErrors#migrate'
/home/john/development/discourse/lib/tasks/db.rake:267:in 'block (2 levels) in <main>'
/home/john/development/discourse/lib/distributed_mutex.rb:53:in 'block in DistributedMutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:49:in 'Thread::Mutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:49:in 'DistributedMutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:34:in 'DistributedMutex.synchronize'
/home/john/development/discourse/lib/tasks/db.rake:242:in 'block in <main>'
Caused by:
ActiveRecord::StatementInvalid: PG::FeatureNotSupported: ERROR: extension "vector" is not available (ActiveRecord::StatementInvalid)
DETAIL: Could not open extension control file "/usr/share/postgresql/extension/vector.control": No such file or directory.
HINT: The extension must first be installed on the system where PostgreSQL is running.
/home/john/development/discourse/plugins/discourse-ai/db/migrate/20230710171141_enable_pg_vector_extension.rb:6:in 'EnablePgVectorExtension#change'
/home/john/development/discourse/lib/freedom_patches/schema_migration_details.rb:8:in 'block in FreedomPatches::SchemaMigrationDetails#exec_migration'
/home/john/development/discourse/lib/freedom_patches/schema_migration_details.rb:8:in 'FreedomPatches::SchemaMigrationDetails#exec_migration'
/home/john/development/discourse/lib/migration/safe_migrate.rb:28:in 'Migration::SafeMigrate::SafeMigration#migrate'
/home/john/development/discourse/lib/migration/safe_migrate.rb:53:in 'Migration::SafeMigrate::NiceErrors#migrate'
/home/john/development/discourse/lib/tasks/db.rake:267:in 'block (2 levels) in <main>'
/home/john/development/discourse/lib/distributed_mutex.rb:53:in 'block in DistributedMutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:49:in 'Thread::Mutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:49:in 'DistributedMutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:34:in 'DistributedMutex.synchronize'
/home/john/development/discourse/lib/tasks/db.rake:242:in 'block in <main>'
Caused by:
PG::FeatureNotSupported: ERROR: extension "vector" is not available (PG::FeatureNotSupported)
DETAIL: Could not open extension control file "/usr/share/postgresql/extension/vector.control": No such file or directory.
HINT: The extension must first be installed on the system where PostgreSQL is running.
/home/john/development/discourse/plugins/discourse-ai/db/migrate/20230710171141_enable_pg_vector_extension.rb:6:in 'EnablePgVectorExtension#change'
/home/john/development/discourse/lib/freedom_patches/schema_migration_details.rb:8:in 'block in FreedomPatches::SchemaMigrationDetails#exec_migration'
/home/john/development/discourse/lib/freedom_patches/schema_migration_details.rb:8:in 'FreedomPatches::SchemaMigrationDetails#exec_migration'
/home/john/development/discourse/lib/migration/safe_migrate.rb:28:in 'Migration::SafeMigrate::SafeMigration#migrate'
/home/john/development/discourse/lib/migration/safe_migrate.rb:53:in 'Migration::SafeMigrate::NiceErrors#migrate'
/home/john/development/discourse/lib/tasks/db.rake:267:in 'block (2 levels) in <main>'
/home/john/development/discourse/lib/distributed_mutex.rb:53:in 'block in DistributedMutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:49:in 'Thread::Mutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:49:in 'DistributedMutex#synchronize'
/home/john/development/discourse/lib/distributed_mutex.rb:34:in 'DistributedMutex.synchronize'
/home/john/development/discourse/lib/tasks/db.rake:242:in 'block in <main>'
Tasks: TOP => db:migrate
Я могу установить его, но мне интересно, есть ли способ отключить плагины на этом уровне, чтобы их миграции просто пропускались. (Я предпочел бы не устанавливать дополнительное ПО, особенно для «плагина», который меня не интересует в плане разработки.)
Я тоже столкнулся с этим сегодня утром. Я установил пакет через sudo после некоторой помощи от ChatGPT. Меня тоже это беспокоит; интересно — возможно, удаление папки плагина из директории /plugins поможет
… но git pull позже может установить его обратно.
Я выступаю против этого изменения. Обычно в разработке ПО наличие компактного ядра означает, что основная дистрибуция может быть меньше, быстрее и иметь меньшую поверхность для атак. Мой предыдущий опыт работы с плагинами показал, что технически код плагина может выполняться даже в «отключенном» состоянии, поскольку проверка этого, как правило, возложена на автора плагина. Таким образом, это, похоже, значительно увеличивает риски и раздувание кода.
Самая срочная проблема заключается в том, что инструкции в руководстве по установке не были обновлены (возможно, я просто их пропустил?). Неясно, что именно нужно установить, чтобы всё снова заработало. Я исправил некоторые ошибки, установив пакет Ubuntu postgresql-16-pgvector, но при запуске db:migrate всё ещё возникали ошибки, связанные с векторами. Мне удалось обойти их, удалив плагин AI локально.
В любом случае, это огромный объём дополнительного кода, и многие из этих плагинов совершенно не соответствуют потребностям большинства сообществ Discourse. (Это не значит, что сами плагины плохи! Я уверен, что они очень полезны для сообществ, которым они нужны. Просто мне трудно понять, почему каждому форуму сообщества необходимо поставлять интеграцию с Zendesk и т. д.). Плагин AI, учитывая его дополнительные требования, которые ломают работу, по моему мнению, должен быть точно удалён.
На личном уровне: когда я захожу в свою панель администратора и внезапно вижу кучу рекламных плагинов, даже если код должен быть неактивным, это вызывает у меня сильное беспокойство. Я, в самых сильных выражениях, хочу заявить, что НЕ хочу, чтобы по умолчанию на моих установках были плагины для рекламы от крупных технологических компаний, даже если они отключены. Это отрасль, которая исторически была невероятно агрессивна по отношению к конфиденциальности пользователей, и Discourse не помогает себе, поставляя такие интеграции по умолчанию. Люди, которым нужна реклама, без труда найдут необходимый плагин; нет необходимости включать его во все установки.
TL;DR: Пожалуйста, пересмотрите это изменение. ![]()
Discourse интегрирует плагины в ядро, которые всегда предлагались в их официальном хостинге
Я согласен, что это добавляет лишний раздутый функционал в административный интерфейс, с множеством торговых марок, которые воспринимаются моим мозгом как реклама. Это не круто. Как сторонник свободного программного обеспечения, старающийся избегать крупных брендов, я считаю, что это шаг в том же направлении, что и Ubuntu несколько лет назад, прежде чем она полностью оказалась колонизирована Amazon, Gaggle и их союзниками. Если вы позволите им попасть вам в поле зрения, они в конечном итоге поглотят вас.
Объединение плагинов в ядро также создаёт возможность для разработчиков со временем ошибочно превратить функциональность плагина в обязательное требование, тогда как сохранение их в виде плагинов гарантирует, что такая ошибка не будет допущена.
Может ли @team прояснить обоснование этого изменения?
Если речь идёт об ускорении установки на инфраструктуре Discourse, возможно, создание пакета discourse-hosting-bundle, автоматически собираемого в CI, могло бы достичь того же результата?
@david, не могли бы вы сохранить алфавитный порядок в списке затронутых плагинов?
Мотивация здесь — обеспечить более плавный опыт для новых пользователей Discourse, чтобы они сразу получали более «полнофункциональный» опыт работы с Discore прямо из коробки.
Другая мотивация — улучшение опыта разработки для нашей команды и для участников сообщества. Благодаря тому, что все эти плагины включены в основную версию, больше нет необходимости учитывать совместимость с разными версиями ядра. Это особенно полезно для таких плагинов, как discourse-ai, которые в настоящее время активно разрабатываются параллельно с соответствующими изменениями в ядре.
Плагины авторизации с брендингом — это те, которые с наибольшей вероятностью будут включены в ядро, как и наши существующие методы авторизации в ядре, такие как Google/Facebook и другие. Поэтому есть большая вероятность, что их скоро удалят из списка.
Это изменение не связано с производительностью на нашем хостинге. У нас уже была готовая сборка со всеми этими плагинами и даже больше, как вы описываете. ![]()
Я исправил порядок ![]()
На это уже был дан ответ в первом посте:
Вот несколько примеров:
- нам не нужно беспокоиться о версионировании, если мы добавляем что-то в ядро для плагина, мы знаем, что оба находятся на одной версии
- проще тестировать плагин, зависящий от другого плагина, если код присутствует для обоих
- когда мы что-то меняем в ядре, нам часто приходится делать несколько PR только для исправления спецификаций в плагинах; теперь это означает всего один отдельный PR
В итоге у команды Discourse появляется больше времени на улучшение и поддержку продукта вместо решения подобных проблем, так что в конечном счёте вы тоже выиграете.
Мне бы очень хотелось, чтобы они исчезли из моего интерфейса, но они просто занимают место, потому что они не являются опциональными и их нельзя скрыть: они являются частью ядра. Именно поэтому мы обеспокоены.
Что касается опыта первого пользователя, возможно, изменение шаблона контейнера с включением и документированием официального пакета могло бы сработать:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
# Плагин docker_manager обязателен для автоматических обновлений через веб-интерфейс
- git clone https://github.com/discourse/docker_manager.git
# Следующие плагины устанавливаются на всех хостинговых экземплярах Discourse.
# Раскомментируйте строку, удалив `#` перед строкой `- git clone`, чтобы включить их.
# См. https://meta.discourse.org/t/bundling-more-popular-plugins-with-discourse-core/373574/
# Плагин Discourse Advertising (Ads): https://meta.discourse.org/t/discourse-advertising-plugin-ads/33734
#- git clone https://github.com/discourse/discourse-adplugin
# Discourse Affiliate
#- git clone https://github.com/discourse/discourse-affiliate
# ...
# ...
# Пожалуйста, добавьте другие плагины ниже. Список официальных плагинов см. по адресу:
# https://meta.discourse.org/tag/official
# Все доступные плагины см. по адресу:
# https://meta.discourse.org/c/plugin/22
Что касается опыта разработчика, surely вы можете автоматизировать передачу версий плагинов другим, менее интрузивным способом. Например, используя правило pups для раскомментирования плагинов с помощью описанной выше стратегии документации.
Вы даже могли бы создать шаблон контейнера, который делает это за вас:
templates:
- "templates/discourse.hosting.yml"
- "templates/discourse.core-bundle.yml"
Обратите внимание, что мое первое впечатление было положительным: я смог открыть для себя несколько интересных плагинов, которые ранее не были мне известны. Но да, поскольку я видел, как вы оптимизируете и ищете наименьший общий знаменатель на протяжении последнего десятилетия, меня удивляет, что вы выбрали именно такой подход к реализации подобного предложения.
Я полагаю, что вы можете добавить команду rm -rf discourse-ai в то место, где обычно находятся команды git clone. Сам я этого не делал.
Да, технически можно удалить все папки в директории плагина, и ядро Discourse продолжит работать
Скорее всего, эти плагины, разработанные командой Discourse, соблюдают правила и добавляют минимальные накладные расходы. Наличие всех их в репозитории упрощает проверку их совместной работы и общих требований.
Вы используете внешний PostgreSQL вместо встроенного? У вас двухконтейнерная настройка, которая давно не обновлялась?
Вы можете придумать способ удалить их, но они ничего не смогут сделать, пока вы не создадите аккаунт у этих зловещих компаний и не получите ключи для начала отслеживания.
Спасибо за ваш ответ,
Надеюсь, что да, но это увеличивает поверхность для ошибок и атак, не принося никакой пользы сообществам, которые не используют эти плагины (а их будет большинство).
Мне кажется, что Discourse правильно выявил проблему, но выбрал неверное решение.
Я полностью согласен, что существует реальная коренная проблема хрупкости экосистемы разработки и плагинов для Discourse. Разрабатывать под постоянно меняющуюся цель действительно сложно, и изменения API в ядре усугубляют это. В какой-то мере это неизбежно при работе с передовыми версиями, но именно поэтому такое поведение не должно быть стандартным. Учитывая, что у меня всего пара простых плагинов, я понимаю и сочувствую вашей проблеме (хотя она гораздо шире моей).
Однако то, что делает Discourse сейчас, — это лишь откладывание решения проблемы на потом. Возможно, это поможет самой платформе Discourse, но не решит проблему для остальных разработчиков плагинов. Все остальные сталкиваются с теми же трудностями, просто в меньших масштабах.
Более правильное решение — внедрение более надежной серии LTS, на которую можно ориентироваться при разработке. Я знаю, что эта тема уже обсуждалась, поэтому не буду повторяться, но одной из главных проблем для сообществ, разработчиков плагинов и даже сотрудников Discourse является отсутствие LTS. Использование стабильной ветки активно не рекомендуется. Если бы применялся более традиционный процесс разработки, создание плагинов было бы гораздо проще. Мы могли бы знать, когда произойдут сбои (при обновлении основных версий), и планировать действия заранее. В противном случае мы можем быть уверены, что небольшие обновления не сломают наши форумы случайно. (На мой взгляд, это одна из самых больших проблем Discourse, о которой часто говорят при обсуждении вариантов для форумов. Нестабильность — серьезный недостаток.)
Да — согласно ссылке, я столкнулся с этим в среде разработки, которая не основана на контейнерах. (Я еще не пробовал это в продакшн-контейнерах)
Я думаю, что это одна из вещей, которые меня беспокоят: если «стандартный» путь предполагает наличие этих плагинов, то я могу столкнуться с ошибками, потому что все остальные принимают рекламные плагины. Мне придется либо рисковать неожиданными ошибками, либо мириться с дополнительной нагрузкой от плагинов. Моя цель — обеспечить максимальную стабильность для моих развертываний.
Также стоит отметить, что даже ядро Discourse довольно тяжелое с точки зрения использования ресурсов по сравнению с другими форумами. Я считаю, что стоит стремиться держать ядро легковесным, чтобы не усугублять проблемы с производительностью.
Я еще не проверял их, чтобы убедиться, что они не загружают JS для отслеживания или «звонка домой», когда отключены, но пока буду считать, что вы правы. Надеюсь, кто-то перепроверит это, потому что это будет огромным скандалом, если окажется, что это не так.
Я считаю, что замечание Hellekin о загромождении верно, и также думаю, что идея с плагином для рекламы от крупных технологических компаний не будет хорошо воспринята частью сообщества с открытым исходным кодом — именно теми, кто с большей вероятностью использует форумы с открытым исходным кодом.
В любом случае, я также хочу сказать, что я ценю то, что вы выслушали мою обратную связь, даже если это было непросто ![]()
Я думаю, что сложно определить, какие из них были вычитаны ранее, а какие нет.
Я на мгновение подумал, проверяли ли вы заранее, есть ли какие-либо открытые комментарии, которые теперь отсутствуют, так как были добавлены только тексты, а не все данные из Crowdin. Но я предполагаю, что мне даже не хочется знать ответ на этот вопрос. В конечном счёте, не имеет значения, отвечает ли никто в течение месяцев или же вопросы и комментарии переводчиков просто исчезают.
Есть ли тесты, гарантирующие отсутствие побочных эффектов при удалении директорий плагинов с новым пакетом, чтобы плагин не стал непреднамеренно обязательным?
Наш основной набор тестов выполняется без загрузки каких-либо плагинов, поэтому да, любые зависимости от ядра к плагинам должны обнаруживаться системой непрерывной интеграции (CI).
Я закомментировал строки для клонирования плагинов, но при повторном запуске “launcher rebuild app” я получаю те же сообщения:
FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 546 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1
---
HINT: The plugin 'discourse-reactions' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-reactions' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-data-explorer' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-data-explorer' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-solved' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-solved' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
Причина ошибки указана выше строки FAILED.