Как проверить, что мешает выполнению rake migrate?

Я пробую мультисайт, установил второй экземпляр, и он работает как по маслу.

Но теперь я не могу выполнить пересборку. В логах указано:

warning " > babel-plugin-debug-macros@0.4.0-pre1" has unmet peer dependency "@babel/core@^7.0.0".
warning "workspace-aggregator-ffab61d1-8b70-4cda-8f38-dde575adc062 > discourse > @uppy/xhr-upload@3.1.0" has incorrect peer dependency "@uppy/core@^3.0.6".
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "idx_category_users_user_id_category_id"
DETAIL:  Key (user_id, category_id)=(-4, 9) already exists
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 695 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1

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

Установили ли вы Discourse Chatbot :robot: (поддерживает ChatGPT)?

Да, и я попытался удалить их тогда (потому что я видел, что я не могу тестировать плагины в мультисайте, не выбирая их вручную).

Эта ошибка возникает из-за этого: вам придется вручную исправить запись в базе данных и удалить дубликаты, даже после удаления плагина, так как внесенные им изменения в базу данных являются постоянными.

Спасибо. Не могли бы вы подтвердить, что это именно то, что мне нужно?

discourse=# \d category_users
                                            Таблица "public.category_users"
       Колонка        |            Тип             | Сортировка | Обязательна |                  Значение по умолчанию                   
--------------------+-----------------------------+-----------+----------+--------------------------------------------
 id                 | integer                     |           | not null | nextval('category_users_id_seq'::regclass)
 category_id        | integer                     |           | not null | 
 user_id            | integer                     |           | not null | 
 notification_level | integer                     |           | not null | 
 last_seen_at       | timestamp without time zone |           |          | 
Индексы:
    "category_users_pkey" PRIMARY KEY, btree (id)
    "idx_category_users_category_id_user_id" UNIQUE, btree (category_id, user_id)
    "index_category_users_on_user_id_and_last_seen_at" btree (user_id, last_seen_at)

Я попытался выполнить DROP INDEX idx_category_users_category_id_user_id, но очень буду признателен за точную команду здесь :slight_smile:

Хм, полагаю, десятки установок, и мне не известно ни об одном подобном случае.

В чём именно проблема?

Скрипт с фикстурами создаёт пользователя-бота (чтобы администратору не пришлось лезть в консоль Rails), и при повторном запуске это может завершиться ошибкой, но проверка на это есть. Я проверю, насколько эта проверка надёжна. Запускается ли она дважды в данном варианте установки?

Вы НЕ должны удалять индекс!

Вам нужно просто удалить дублирующуюся запись.

Найдите вторую запись с user_id = -4 и category_id = 9 и удалите её, используя её id.

Это рискованная операция, поэтому сначала выполните проверку:

SELECT * FROM category_users WHERE id = <второй id>;

чтобы убедиться, что возвращается только одна запись, затем:

DELETE FROM category_users WHERE id = <второй id>;

Можете ли вы вспомнить, какие изменения (если вообще были) вы внесли в отношении бота?

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

Спасибо, Роберт. Я спросил, потому что, очевидно, я не специалист по базам данных. Кстати, у меня есть резервные копии, но всё же лучше не совершать ошибок намеренно :smiling_face_with_sunglasses:

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

Здесь на Meta есть дополнительная информация. Надеюсь, вы сможете разобраться и добавить проверки, чтобы избежать этой проблемы:

Ладно, может быть, не совсем моя вина :sweat_smile: