Не удалось предоставить права администратора из-за ошибки

Привет!

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

Я проверил логи и нашёл следующие сообщения:

ActiveRecord::RecordInvalid (Validation failed: Name has already been taken) app/models/group.rb:607:in 'refresh_automatic_group!' app/models/group.rb:666:in 'block in refresh_automatic_groups!' app/m

Failed to handle exception in exception app middleware : ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

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

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-City.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-City.mmdb

Как мне дальше отлаживать это?

Спасибо,
Ханнес

Вы получаете эту ошибку при нажатии кнопки «Предоставить права администратора»?

Нет, кнопка «Предоставить права администратора» работает.

Весь процесс выглядит так:

  1. Я нажимаю кнопку «Предоставить права администратора», и приложение показывает мне модальное окно: «Мы отправили вам электронное письмо для подтверждения нового администратора. Пожалуйста, откройте его и следуйте инструкциям».
  2. Я нажимаю ссылку подтверждения в письме («Подтвердить учётную запись администратора»), которая перенаправляет меня на страницу подтверждения.
  3. На странице подтверждения я нажимаю кнопку «Предоставить права доступа администратора», после чего появляется страница ошибки (см. скриншот в моём первоначальном сообщении), а также сообщения об ошибке в логе.

Также я только что заметил следующее сообщение выше в логе (с префиксом числа 46 — означает ли это, что оно повторялось 46 раз?):

Ошибка обеспечения согласованности для группы: Ошибка валидации: Имя уже занято

Это действительно очень интересный пограничный случай. Предполагая, что у вас самохостинг, что возвращает следующая команда?

./launcher enter app
rails c
Group.pluck(:name, :id)
=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["staff", 3],
 ["trust_level_0", 10],
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14]]

Discourse очень придирчив к этим идентификаторам: staff должно быть равно 2, admins — 1. Если каким-то образом у вас есть другая группа с таким именем, это может вызвать проблемы. Также убедитесь, что ни у одного пользователя нет имени admins.

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

=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["trust_level_0", 10]
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14],
 ["Staff", 42]]

Я заметил, что нет группы staff, есть только Staff. Если staff всегда имела id 3, то, вероятно, это означает, что кто-то удалил её и создал новую группу (id 42).

Достаточно ли просто создать staff заново или как мне решить эту проблему?

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

1 лайк

Интерфейс не позволяет мне это сделать:

Мне нужно выполнить это напрямую в базе данных?

Возможно ли переименовать группу через командную строку или как можно решить эту ситуацию?

Попробуйте напрямую из БД, это должно быть безопасно

2 лайка

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

Для истории, на случай если кто-то окажется в подобной ситуации:

docker exec -it app /bin/bash
su - postgres
psql -d discourse
discourse=# update groups set name='staff' where id=3;
\q
5 лайков

Да, это состояние, в которое невозможно попасть.

3 лайка