エラーのため管理者権限を付与できません

こんにちは!

ユーザー(実際にはどのユーザーでも)に管理者権限を付与しようとすると、確認リンクをクリックした後、次のエラーメッセージしか表示されません。

ログを確認したところ、次のメッセージが見つかりました。

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

これをさらにデバッグするにはどうすればよいですか?

よろしくお願いします。
Hannes

「管理者権限を付与」ボタンをクリックすると、そのエラーが発生しますか?

「管理者権限を付与」ボタンをクリックすると機能します。

完全なプロセスは以下のとおりです。

  1. 「管理者権限を付与」ボタンをクリックすると、アプリケーションに「新しい管理者を検証するためにメールを送信しました。メールを開いて指示に従ってください。」というモーダルが表示されます。
  2. メール内の確認リンク(「管理者アカウントを確認」)をクリックすると、確認ページに移動します。
  3. 確認ページで「管理者アクセスを付与」ボタンをクリックすると、エラーページ(元の投稿のスクリーンショットを参照)が表示され、ログにもエラーメッセージが表示されます。

また、ログのさらに上の方に次のメッセージがあることに気づきました(46という数字が前に付いています。これは46回繰り返されたことを意味しますか?)。

Error ensuring consistency for Group: Validation failed: Name has already been taken

これは非常に興味深いエッジケースのように思えます。セルフホストされていると仮定した場合、これは何を返しますか?

./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 はこれらの ID に非常にこだわっています。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

UIでそれができません。

DBで直接行う必要がありますか?

コマンドラインでグループ名を変更することは可能ですか、またはこの状況をどのように解決できますか?

それから直接DBから試してください、安全であるはずです

「いいね!」 2

はい、これで解決しました!グループは存在していましたが、誰かが名前を変更していました。これは基本的にコア機能を損なうため、UIでシステムグループの名前変更を禁止すべきかどうか疑問に思っています。

同様の状況になった人のために、記録として以下に示します。

docker exec -it app /bin/bash
su - postgres
psql -d discourse
discourse=# update groups set name='staff' where id=3;
\q
「いいね!」 5

ええ、それは絶対にあなたが入れない状態であるべきです

「いいね!」 3