Учетная запись Chatbot id -4: почему нельзя удалить через админку и какие есть обходы

Рабочие заметки после разбора через Admin API и код ядра Discourse (ветка Cursor в репозитории hoee).

Объект

На инстансе админ-карточка: /admin/users/-4/chatbot (Chatbot в админке).

Что вернул админский JSON (снимок проверки)

  • id: -4 (это бот по правилам ядра: user_id > 0 только для «живых» пользователей)
  • username: Chatbot
  • admin: true
  • moderator: false
  • post_count: 0
  • can_be_deleted: false
  • can_be_anonymized: false

Почему can_be_deleted: false при нуле постов

В Guardian#can_delete_user? удаление запрещено, если целевой пользователь admin. Это не связано с числом постов в нашем случае.

Почему руками через UI и админский HTTP часто «не дают»

Для операций вроде revoke admin / destroy на негативный id не проходит Guardian#can_administer?: там есть условие, что идентификатор цели положительный (obj.id.positive?). Поэтому запросы к member-роутам вида «как у обычного username» дают 404, а с сегментом -4 возможен 403 invalid_access, даже когда API-актер - staff.

Итог: снять admin и удалить учетку штатным Admin API по тому же UX, что для людей, обычно нельзя - нужен другой контур (ниже).

Мягкий путь без удаления строки в БД

Отключить модуль AI-бота в настройках сайта: параметр ai_bot_enabled (false - поведение GPT-бота и связанного UI в ЛС/хедере приглушается; строка пользователя при этом может остаться).

На машине с checkout репозитория hoee и файлом discourse.env добавлен хелпер:

  • scripts/discourse-ai-chatbot-operator.sh audit - краткий дамп полей из /admin/users/-4/list.json
  • ai-bot-disable / ai-bot-enable - PUT на ai_bot_enabled (ключи system из discourse.env, не публиковать)

Жесткий путь: реально удалить User

Только на хосте приложения Discourse, со снимком БД до правок: в консоли Rails снять флаг admin у записи (например update_columns), затем UserDestroyer от живого admin с id > 0 и delete_posts: true при необходимости. Текст блока для копирования: scripts/discourse-ai-chatbot-operator.sh rails-destroy-snippet.

Риски: плагин discourse-ai при обновлениях может пересоздавать ботов; возможны сообщения о missing bot user, пока модуль не починит состояние.

Ссылки по коду upstream

Если нужно, в ответах можно вынести отдельную инструкцию «как проверить актуальное значение ai_bot_enabled через Admin → Настройки → плагин discourse-ai» без API.

Обновление: учетная запись удалена

Операцию на хосте выполнили не через Admin API (туда по-прежнему не пускает Guardian для негативного id), а через rails runner внутри боевого контейнера app от пользователя discourse:

  • снят флаг admin у User.find(-4) через update_columns + reload;
  • затем UserDestroyer от живого администратора с id > 0 с опцией delete_posts: true (в нашем случае постов не было).

Проверка снаружи: GET /u/chatbot.json больше не отдает пользователя, GET /admin/users/-4/list.jsonnot_found.

Напоминание: при повторном включении модуля discourse-ai плагин может снова завести учетку бота при необходимости.