Rake api_key:get 오류

설치에 실패했습니다(제 설치 스크립트는 mailgun_api_key를 설정할 수 있도록 API 키를 가져오게 되어 있습니다). 로컬 개발 인스턴스에서도 확인해 보았습니다.

$ 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 - Pull Request #8325 - discourse/discourse - GitHub

고맙습니다 @pfaffman, PR에 댓글을 남겼습니다

확인만 하고 싶은데, 이건 표준 설치 스크립트가 아니라 개인용 스크립트 맞나요?

네! 일반적인 설치에는 문제가 없었습니다. 다만, 설치 후 처리 과정에서 mailgun_api_key를 설정하기 위해 API 키가 필요한 부분만 깨진 것이었습니다.

이 rake 태스크를 사용하는 사람이 많지 않을 것 같습니다.

:+1: 궁금한 게 있는데, 작업을 마친 후 API 키를 정리하나요? 최근 API 키 관리를 더 잘하기 위해 많은 변경 사항을 적용했음을 눈치채셨을 겁니다. “미사용” API 키가 잠재적인 보안 취약점으로 남아 있는 것을 줄이려는 시도를 하고 있습니다.

이 작업이 서버에서 실행되는 것이라면, API 키를 생성하고 사용하는 대신 Ruby를 사용해 사이트 설정을 설정할 수 있을까요?

오! 이미 키가 존재하는 경우 키를 변경하지 않는 것이 더 낫거나, create_if_not_exists 작업을 두는 것이 좋겠습니다. 키를 변경하지 않고 기존 키를 rake 태스크로 가져올 수 있는 것은 매우 유용합니다. 이렇게 하면 키를 사용하는 다른 부분에 영향을 주지 않고 기존 키를 가져올 수 있으니까요.

제 Ansible 도구 중 몇몇에서는 API 키가 없는 경우, 기존 키를 가져오기 위해 해당 rake 태스크를 호출합니다. 예를 들어 다음과 같이요.

- name: Get api key
  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

이 방식으로 키를 가져오는 것이 실제로 필요한 경우는 클린 설치(clear install)를 할 때뿐인 것 같습니다. (기존 사이트의 경우 해당 사이트의 변수에 API 키를 이미 가지고 있습니다.)

키 처리 방식이 새로워졌으니, 작업을 마친 후 키를 삭제하거나, 컨테이너 안에서 rails 스크립트를 실행하여 사이트 설정을 어떻게든 변경할 수도 있을 것 같습니다.

제가 한 변경 사항 중 하나는 이제 사용자당 여러 키(또는 여러 ‘마스터 키’)를 가질 수 있다는 것입니다. 이는 각 통합(integration)에 고유한 키를 부여할 수 있으며, 각각을 별도로 감사/취소/삭제할 수 있음을 의미합니다. 따라서 귀하의 경우, 설명을 "pfaffman’s setup tooling"으로 설정한 키를 생성할 수 있습니다. 그러면 사이트 관리자는 해당 키의 용도를 알 수 있으며, 더 이상 필요하지 않을 때 취소/삭제할 수 있습니다.

그것이 rake 태스크로 어떻게 구현되는지에 대해서는… 잘 모르겠습니다. api:get_or_create "my key description"와 같은 태스크를 가질 수 있을지도 모릅니다. :thinking:

이것이 귀하의 경우에 작동할까요 @pfaffman?

당연하지! 정말 좋겠어.

PR은 어때요?

rake api_key:get_or_create_master["Onboarding Key"]

반대 의견이 없다면 몇 시간 후에 머지하겠습니다.

나도 괜찮아 보여! 그리고 내 플레이북이 에디터에 그대로 떠 있어서 이미 결심한 상태야. :slight_smile:

병합됨

@pfaffman님, 죄송하지만 다가오는 PR에서 이 새로운 rake 작업을 제거해야 할 것 같습니다. 데이터베이스에서 API 키를 해싱할 예정이므로, 기존 키를 가져오는 것은 근본적으로 불가능해집니다.

get_or_create_master 작업을 더 단순한 create_master 작업으로 대체했습니다. 이 작업은 조건 없이 새로운 키를 생성합니다. 키를 하나만 유지하려면, 키를 자체 시스템에서 직접 관리해야 합니다.

네. 그건 예상하고 있었어요. 다른 시스템들은 API 키를 한 번만 표시하니까요…

미리 알려주셔서 감사합니다!

바로 알기 어렵습니다. (잠깐. db 디렉토리에 schema.rb 파일이 왜 없나요?)

같은 some name으로 rake api_key:create_master['some name']를 여러 번 실행하면 실패하나요? 즉, 그 이름은 고유해야 하나요?

설명은 고유할 필요가 없습니다. 하지만 비슷해 보이는 키를 많이 만들면 상당히 혼란스러울 수 있습니다.

우리는 schema.rb 파일을 커밋하지 않습니다. 확인하는 가장 좋은 곳은 /app/models 아래 각 파일 하단의 주석입니다.

잠깐. 뭐라고요?! 언제부터요? 제 하드 드라이브에 있는 현재 discourse 소스 코드의 커밋에는 여전히 schema.rb 파일이 있습니다. 찾고자 하는 모델이 정확히 무엇인지 파악할 수 있는 것은 정말, 정말 유용합니다. 단일 파일을 열어 무언가를 검색하는 것(예: 찾고자 하는 모델이 무엇인지 파악하기 위해)은 app/models 디렉토리의 200개 이상의 파일을 살펴보는 것보다 훨씬 쉽습니다. 모델 파일 끝부분의 스키마 부분만 grep으로 검색할 수 있는 좋은 방법조차 없습니다.

찾고자 하는 모델이 무엇인지 모르면 어떻게 찾을 수 있나요? 예를 들어 "auth"와 관련된 테이블이 여러 개 있는데, 모두 auth로 시작하는 것도 아닌데, 어디서부터 살펴봐야 할지 어떻게 파악할 수 있겠습니까?

처음부터 그랬어요. .gitignore 파일에 있거든요. 하지만 db:migrate를 실행할 때 생성되므로 로컬에는 존재합니다.

테이블 이름은 항상 모델 이름과 일치하므로, 그냥 파일 이름을 참고합니다 :man_shrugging:

아, 그렇군요. 제가 얼마나 무지한지 보여주는 셈이네요. :wink 설명해 주셔서 감사합니다.

때로는 테이블/모델 이름을 추측하기 어려워서 모든 필드가 한곳에 모여 있으면 큰 도움이 됩니다.