Rake api_key:get сломан

Что ж, установка не удалась (мой скрипт установки получает API-ключ, чтобы можно было установить mailgun_api_key). Я проверил это и на своей локальной среде разработки.

$ rake api_key:get
rake aborted!
NoMethodError: undefined method `create_master_key' for ApiKey (call 'ApiKey.connection' to establish a connection):Class
Did you mean?  create_with
/home/pfaffman/src/discourse/lib/tasks/api.rake:5:in `block in <main>'
Tasks: TOP => api_key:get
(See full trace by running task with --trace)

Это этот коммит. @david

Вот PR: FIX: create_master_key got renamed by pfaffman · Pull Request #8325 · discourse/discourse · GitHub

Спасибо @pfaffman, я оставил комментарий в PR.

Просто уточняю — это твой личный скрипт, а не стандартный скрипт установки?

Да! Это не сломало обычную установку, а лишь часть моих пост-установочных действий, требующих API-ключа для настройки mailgun_api_key.

Я подозреваю, что эту rake-задачу используют немногие.

:+1: Из любопытства, вы очищаете API-ключ после завершения работы? Вы, возможно, заметили, что я внес много изменений в последнее время, чтобы мы лучше отслеживали API-ключи. Мы стараемся сократить количество «неиспользуемых» API-ключей, которые остаются потенциальными уязвимостями безопасности.

Если это выполняется на сервере, может быть, вы могли бы использовать Ruby для настройки параметра сайта, вместо генерации и использования API-ключа?

О! Думаю, было бы лучше не менять ключ, если он уже существует, или добавить задачу create_if_not_exists. Очень удобно иметь возможность получить существующий ключ с помощью задачи rake, не меняя его и не нарушая работу всего, что использует этот ключ.

В нескольких местах моих инструментов Ansible, если у меня нет API-ключа, я вызываю эту задачу rake для получения существующего, например:

- name: Получить API-ключ
  block:
    - shell: docker exec -w /var/www/discourse -i {{ discourse_yml }}  rake api_key:get
      register: get_api_key

    - set_fact:
        discourse_api_key: "{{ get_api_key.stdout }}"

  when: discourse_api_key is not defined

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

Предполагаю, что с новым способом обработки ключей я мог бы удалять ключ после завершения работы или, скажем, как-то изменять настройки сайта, запуская rails-скрипт внутри контейнера?

Одно из изменений, которое я внёс, заключается в том, что теперь у одного пользователя может быть несколько ключей (или несколько «мастер-ключей»). Это означает, что каждой интеграции можно выделить свой ключ, и их можно независимо проверять, отзывать или удалять. В вашем случае вы могли бы создать ключ с описанием «Инструменты настройки pfaffman». Тогда администраторы сайта будут знать, для чего он используется, и смогут отозвать или удалить его, когда он больше не понадобится.

Что касается того, как это реализуется в задаче rake… Я не уверен. Возможно, мы могли бы создать задачу вида api:get_or_create "моё описание ключа" :thinking:

Подойдёт ли это для вашего случая, @pfaffman?

Конечно! Я думаю, это будет просто отлично.

Как насчёт этого?

rake api_key:get_or_create_master["Onboarding Key"]

Если возражений нет, я объединю его через несколько часов.

Мне нравится! И мой плейбук всё ещё был открыт в редакторе, так что я уже всё сделал. :slight_smile:

Объединено в

Извините, @pfaffman, но, боюсь, мне придётся удалить эту новую задачу rake в следующем PR. Мы будем хешировать ключи API в базе данных, поэтому извлечение существующего ключа станет принципиально невозможным.

Я заменил задачу get_or_create_master на более простую create_master, которая безоговорочно создаст новый ключ. Если вы хотите иметь только один ключ, вам нужно будет отслеживать его в своей собственной системе.

Да, я так и думал, что это произойдёт. В других системах ключ API показывается только один раз, так что…

Спасибо за предупреждение!

Я не могу быстро ответить. (Подождите. Почему в директории db нет файла schema.rb?)

Если я выполню несколько раз команду rake api_key:create_master['some name'] с одним и тем же значением some name, будет ли это ошибкой? То есть, должно ли это имя быть уникальным?

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

Файл schema.rb не включается в систему контроля версий. Лучше всего смотреть на аннотации в конце каждого файла в папке /app/models.

Погодите, что?! С каких пор? В любой моей текущей версии исходного кода Discourse на жёстком диске всё ещё есть schema.rb. Это действительно, очень удобно — иметь возможность быстро найти нужную модель. Открыть один файл и поискать в нём (например, чтобы понять, какую модель вы ищете) гораздо проще, чем просматривать более 200 файлов в app/models. Даже нет удобного способа выполнить grep только по схеме в конце моделей.

Если вы не знаете, какую модель ищете, как её найти? Например, есть много таблиц, связанных с «auth», но не все они начинаются с auth. Как вообще понять, где искать?

Всегда. Это указано в файле .gitignore. Но он создаётся при выполнении команды db:migrate, поэтому он присутствует локально.

Имя таблицы всегда совпадает с именем модели, поэтому я просто использую имена файлов :man_shrugging:

Ага. Ну, это показывает, что я знаю. :wink Спасибо за объяснение.

Иногда я не могу угадать имя таблицы или модели, поэтому наличие всех полей в одном месте очень помогает.