순수 SQL로 새 사용자 만들기

사용자를 생성하여 Discourse에서 활성 상태로 보이게 하려면, 데이터가 추가되어야 하는 최소한의 테이블은 무엇인가요?

저는 방금 user_emails 테이블에 한 줄을 삽입했습니다.

insert into user_emails (user_id, email, "primary", created_at, updated_at) values (2,'user@email.com',true, now(), now());

예상대로 GUI에는 나타나지 않았습니다. 최소한의 단계는 무엇이며, 다른 테이블에 데이터를 추가해야 하는지, 아니면 재시작이 필요한지 궁금합니다.

누군가는 이것이 올바른 방법이 아니라고 말할 것이라 예상합니다. 그 점은 이해하지만, 아래에서 설명하듯 제 상황상 그렇게 해야 할 수도 있습니다(제 일부 가정은 틀릴 수 있지만, 제 이해도는 다음과 같습니다).

  • 다른 데이터베이스 기반 포럼에서 가져오는 모든 가져오기(import) 스크립트는 Discourse 인스턴스에서 해당 포럼에 연결할 수 있는 것을 전제로 합니다. 하지만 라이브 Discourse 인스턴스에서 다른 포럼(jforum)에 접근하는 것은 어렵거나 불가능할 것이며, 반대로 오래된 포럼이 존재하는 매우 오래된 서버에 Discourse 개발 환경을 설치하는 것도 불가능합니다.
  • 저는 Ruby on Rails를 이해하지 못하므로 기존 스크립트를 수정할 수 없지만, SQL은 이해합니다.
  • API를 사용할 수 있습니다(저는 5,000명의 사용자만 있습니다). 하지만 모든 사용자에게 비밀번호 재설정을 요구하는 대신 MD5 비밀번호 해시를 유지할 수 있는 플러그인/방법이 있으면 좋겠기에, API로는 이 작업을 수행할 수 없다고 생각합니다.
  • jforum 가져오기 스크립트가 있으므로, 이를 통해 jforum에서 데이터를 추출하기 위해 필요한 SQL을 확인한 후 CSV 파일로 만들어 데이터베이스에 로드하는 것은 문제없습니다.
  • 일괄 가져오기(bulk importers)가 Discourse에 SQL을 추가하는 방법을 제공한다고 보이지만, SQL을 어떻게 작성해야 하는지 파악하는 데 어려움을 겪고 있습니다.
  • 사용자를 가져오는 것이 핵심인 것 같고, 그 후 카테고리, 주제, 게시물을 추가하는 것은 그렇게 어렵지 않을 것입니다.

맞아요!

그걸 정말로 이해했다면 질문하지 않았을 텐데요. :wink:

데이터베이스가 손상될 가능성이 꽤 높습니다. 그리고 그러면 아무도 당신을 도울 수 없게 됩니다.

데이터베이스를 덤프(dump)한 후 로컬 Discourse 서버(또는 연결할 수 있는 곳 어디든—저는 가정용 인터넷 연결을 통해 원격 데이터베이스로 더 큰 규모를 가져온 적이 있습니다)에 복원한 다음 기존 스크립트를 실행하세요.

Ruby를 잘 이해해서 SQL을 작성하는 방법을 알아내는 것보다, 이해하지 못하는 Ruby를 사용하는 것이 훨씬 쉽습니다. 저는 첫 번째 임포터(importer)를 작성한 후 훨씬 나중에야 Ruby를 배웠습니다.

조금 비아냥거리는 말투네요!
대량 가져오기 스크립트가 SQL을 실행하는 것이라면(그렇게 생각하는데), 사용자를 생성하는 데 필요한 SQL을 문서화하는 것이 대량 가져오기 스크립트를 사용하려는 것과 비교했을 때 더 위험하지는 않습니다. 그리고 현재 저는 순수한 Discourse 설치 환경이라, 설령 문제가 생겨도 크게 문제가 되지는 않을 것입니다. 개발 경력은 당신보다 훨씬 길다고 자부합니다.

제가 경험이 부족한 부분은 모든 관리자 작업입니다. 로컬 Discourse 서버를 설치하려고 처음 시도했을 때 일이 꼬이기 시작했고, 만약 Discourse 서버에서 제 JForum MySQL 서버에 연결할 수 없다면 MySQL도 설치하고 데이터베이스를 이전해야 할 것입니다. 기존 jforum 스크립트는 메인 소스 트리에 커밋되어 있지 않고, 저는 아주 오래된 버전의 jforum을 사용 중이라 정상 작동할 것으로 기대하지 않습니다.

의도치 않게 그런 뜻이 나온 겁니다. :wink: 이모티콘을 놓치셨나요?

그렇겠네요!

하지만 디스코스를 3년 넘게 전업으로 다루며 수많은 이동을 수행하고, 여러 이모터(Importer)를 처음부터 작성해 본 사람의 무료 조언도 그만한 가치가 있을 수 있습니다.

SSH 터널을 설정해 보는 것은 어떨까요?

일관성이 없는 것일 수는 있지만, 손상된 것은 아닙니다.

하지만 API를 사용하여 사용자를 생성한 후 SQL을 통해 커스텀 필드에 md5 해시를 삽입할 수 있습니다. 이렇게 하면 두 가지의 장점을 모두 누릴 수 있습니다.

오! 정말 좋은 아이디어네요.

여러분이 찾고 있던 무료 조언이 바로 이거예요!

네, 그런 생각이 들긴 했는데 MD5 해싱이 어떻게 작동하는지 정확히 이해하지 못해서 그것이 가능한지 명확하지 않았습니다. 좋습니다, 한번 시도해 보겠습니다.

사용자 정의 필드를 삽입하기만 하면 됩니다:

  • user_id: 자명합니다
  • name: “import_pass”
  • value: md5 다이제스트

그리고 migratepassword 플러그인을 설치하세요.

감사합니다. 도움을 주실 수 있기를 바라며 몇 가지 질문이 있습니다.

설치

discourse 디렉터리에서 `bundle exec rake plugin:install repo=http://github.com/[Communiteq](https://www.communiteq.com) (formerly DiscourseHosting)/discourse-migratepassword`를 실행하세요
Discourse를 재시작하세요
  1. 플러그인을 설치했는데, Discourse를 어떻게 재시작하나요?

  2. 커스텀 필드를 어떻게 삽입하나요? SQL문을 알려주시거나, "user_fields[1]": "string" 부분을 통해 API로 처리할 수 있는지 알려주세요. 현재 저는 API를 통해 프로그래밍 방식으로 사용자를 생성할 수 있지만, 이 필드는 무시하고 있습니다.

  3. 플러그인이 설치되어 있다면, API를 통한 사용자 생성 호출 시 전달되는 password 값은 무관한가요?

  1. 아니요, 커스텀 필드의 md5 다이제스트보다 우선합니다.

나머지 두 가지 질문에 대한 답변은 이 포럼에서 쉽게 찾을 수 있습니다. 시간을 절약하고 싶으시다면 유료 서비스로 가져오기(import) 및/또는 호스팅을 대신해 드릴 수 있습니다.

두 가지 답변 모두 검색해 보았지만 찾을 수 없었습니다. 첫 번째 경우, 일부 설치는 yaml 파일을 편집한 후 docker를 다시 시작하는 방식으로 수행되는 반면, 이번과 같은 일부는 docker 컨테이너 내부에서 설치되는 것 같아 이 경우의 '재시작’이 무엇을 의미하는지 명확하지 않아 혼란스럽습니다.

이 포럼에서 순수한 SQL 관련 내용을 거의 찾을 수 없네요.

이 오픈소스 소프트웨어를 사용하면서 유료 서비스를 강하게 권유하는 분위기가 놀랍습니다. stackoverflow에서 질문을 할 때와는 전혀 다른 경험입니다.

나는 함께 생각하며 혁신하고 기여하는 것을 좋아합니다. 하지만 생계를 유지해야 하므로 어딘가에서 선을 긋는 것이 필요하고, 저는 혁신하거나, 기여하거나, 함께 생각하는 것이 아니라 단순한 업무를 하고 있다고 느끼는 지점에 그 선을 긋고 있습니다.

사용자 정의 필드에 대한 SQL 쿼리를 찾는 것은 제게는 업무에 해당하며, 당신은 경험이 많은 개발자이므로 스스로 해결할 수 있으리라 생각합니다 :smiley:

물론 제가 알아서 해결해 볼 수는 있지만, 이 포럼에서 쉽게 찾을 수 없으니 물어보는 데는 아무런 손해가 없잖아요.

쉽게 찾을 수 없다

다른 질문의 경우, 여전히 저에게는 불분명합니다.

제가 할 일을 대신해 주길 기대하는 것은 아니지만, 문서가 사용자에게 너무 많은 것을 전제한다는 점은 일반적으로 짜증나는 부분입니다.

2번 질문입니다. user_id 5에 대해 사용자 정의 import_pass 필드를 추가하는 예시입니다. (user_id는 user_emails 테이블 또는 users 테이블의 id에서 확인할 수 있습니다)

insert into user_custom_fields (user_id, name, value, created_at, updated_at) values (5,‘import_pass’,‘2aee1c40222c7754d4534e61452612cc’, now(), now());

아, 찾았어요.
./launcher restart app
하지만 재시작되는 것 같지 않아요. 앱에 접속하고 데이터베이스에 연결할 수는 있지만, 웹사이트에는 접속할 수 없어요. 그냥 다시 빌드하고 시작해야 할 것 같아요.

그래서 ./launcher rebuild app을 실행했고, 이제 다시 작동합니다.

데이터베이스가 재생성될 줄 알았는데 그렇지 않았으니, 실제 데이터베이스가 Docker 외부에 영구적으로 저장되어 있고 rebuild 명령어가 Docker 앱을 다시 구축하는 것뿐이겠구나 싶었습니다. 또한 yaml 파일을 수정하여 추가한 dataexplorer 플러그인도 여전히 남아 있는 것을 확인했습니다. 그런데 passwordmigration 플러그인은 남아 있는 건지, 아니면 rebuild로 인해 지워지는 건지 모르겠습니다. 관리자 페이지의 플러그인 섹션에는 분명히 아무것도 없거든요.

자, passwordmigration를 설치한 후 다시 restart를 실행했는데, 또다시 사이트가 다운되었습니다. passwordmigration가 무언가를 깨뜨리는 것처럼 보입니다.

다시 rebuild를 해서 작동하게 만들었습니다(하지만 이제 passwordmigration 플러그인이 없습니다). migrationpassword를 먼저 설치하지 않고 ./launcher restart app을 실행하면 정상적으로 재시작되므로, 제 환경에서 migrationpassword와 관련된 특별한 문제인 것 같습니다.

마지막으로 시도했을 때, passwordmigration 플러그인은 가져오기(import) 실행과 호환되지 않아 가져오기를 완료한 후에 설치하는 것이 좋습니다.

이 플러그인이 재빌드(rebuild)를 깨뜨리고 있을 수도 있지만, Richard가 호스팅에서 이 플러그인을 사용하고 있으므로 그런 가능성은 낮습니다. 가져오기를 완료한 후 데이터 탐색기와 마찬가지로 app.yml에 이 플러그인을 설치하는 것을 권장합니다.

새로운 데이터베이스를 사용하려면 /var/discourse/shared/standalone 내의 postgres 디렉터리를 rm -rf로 삭제하세요. https://meta.discourse.org/t/advanced-troubleshooting-with-docker/15927 링크를 참고해 보시는 것도 좋습니다.

가져오기 중에 비활성화하는 것만으로도 충분합니다.

이상하네요. 데이터베이스를 삭제하고 ./discourse-setup을 실행해서 완전히 새로 설치했는데, 처음엔 아무 문제 없었습니다.

rake로 migrationpassword 플러그인을 설치하고 재시작했는데, 다시 웹사이트에서 502 오류가 발생했습니다!

DataExplorer 플러그인이 여전히 남아 있어서 제거하고 다시 빌드하니 정상 작동했고, 이후 migrationpassword를 다시 설치하니 또 502 오류가 났습니다.

다른 환경에서는 잘 동작하는데 제 기본 설치 환경에서는 안 되니 정말 혼란스럽네요.

다음으로 app.yml 파일을 직접 수정해서 설치하는 방법을 시도해 보겠습니다.

(크리스마스 쇼핑 때문에 일이 지연되었지만) 결국 app.yml 파일을 수정하고 다시 빌드하여 migratepassword를 설치해 보았고 … 성공했습니다!
하지만 bundle exec rake plugin:install repo=http://github.com/[Communiteq](https://www.communiteq.com) (formerly DiscourseHosting)/discourse-migratepassword 옵션은 제 기본 설치 환경에서는 작동하지 않습니다. 아마도 GitHub - communiteq/discourse-migratepassword: Support migrated password hashes · GitHub 의 README.md 파일에서 이 부분을 확인하거나 제거해야 할 것 같습니다.