WP Discourse를 특정 버전의 로컬 Discourse 인스턴스에 연결하는 방법

방금 WordPress 6.7.2와 php-fpm-8.3.17-1.fc41.x86_64 환경에서 이 플러그인을 설치해 보았지만 작동하지 않습니다. “옵션 저장” 버튼을 클릭하면 로그에 다음과 같은 오류가 표시됩니다.

[2025-02-21 17:15:13] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""} 

/var/log/php-fpm/www-error.log에도 해당하는 오류가 있습니다:

[21-Feb-2025 17:14:42 UTC] PHP Warning:  Undefined array key "url" in /wordpress/wp-content/plugins/wp-discourse/lib/discourse.php on line 301

https://plugintests.com/plugins/wporg/wp-discourse/latest 의 "스모크 테스트"에서도 동일한 오류가 보고되고 있는 것을 확인했습니다.

수정: undefined url 오류는 무시해도 될 것 같습니다. 웹 양식이 완료되기 전의 초기 오류였던 것으로 보입니다. 그러나 “옵션 저장” 버튼을 클릭할 때마다 여전히 wpdc_response_error가 반복적으로 발생하고 있습니다.

수정2: Discourse 측에서 403 Forbidden 오류를 확인하고 있습니다. 제 WordPress 사이트에서 Discourse로의 연결이 왜 금지되는지 명확하지 않습니다. 같은 API 키를 curl로 사용하면 성공적으로 작동합니다.

Completed 403 Forbidden in 33ms (Views: 0.3ms | ActiveRecord: 15.1ms (2 queries, 0 cached) | GC: 2.2ms)

개발 모드에서 Discourse 3.5.0.beta1-dev를 실행 중입니다.

수정3: 이 버전의 Discourse에서는 API 키에 대한 특수한 WordPress 권한이 있다는 것을 발견했습니다. “Global” 대신 "Granular"를 사용하고 WordPress 아래에 있는 체크박스를 선택하니 403 Forbidden 오류가 사라졌습니다. 하지만 여전히 WordPress로 빈/잘못된 응답이 전송되고 있습니다.

Delivering messages [] to client d9fbb33f11ed404bbc361c459802c87d for user 1 (chunked)

WordPress 플러그인과 함께 사용할 수 있는 더 오래된 버전의 Discourse를 사용해야 할 것 같습니다. 플러그인이 정상적으로 작동하는 최신 버전은 무엇인가요?

안녕하세요 @Gregory_Bartholomew, 문제를 파악해 보겠습니다.

Discourse의 최신 버전에서 작동합니다.

“개발 모드에서” Discourse를 실행하고 있다고 하셨는데, 로컬에서 실행하고 있다는 뜻인가요? 아니라면 어떤 환경에서 실행하고 계신가요?

세분화된 권한(Granular permissions)이 있는 키를 사용하기 전에, 첫 번째 게시글의 영상에 나와 있듯이 글로벌(Global) 키를 사용해 보실 수 있을까요?

감사합니다. 지금 Discourse를 다시 설치하려고 하고 있습니다. 테스트를 위해 3.3.0 버전을 체크아웃했습니다.

ZFS 버그로 인해 ZFS 파일 시스템에서 Docker 컨테이너가 성공적으로 빌드되지 않는 문제가 발생하여(pnpm issue 7024), Docker 컨테이너를 사용하는 대신 Discourse를 로컬에 설치하려고 하고 있습니다. Discourse를 로컬에 설치하면 pnpm install을 실행하기 전에 .npmrc 파일에 package-import-method=hardlink를 추가하여 ZFS 버그를 우회할 수 있습니다.

RAILS_ENV=development를 사용했다는 뜻입니다. 이제 RAILS_ENV=production으로 다시 시도해 볼 예정입니다.

또한, 위에서 링크한 가이드를 Fedora Linux에서 작동하도록 수정하는 작업을 하고 있습니다.

수정: 3.3.0 버전에서는 큰 진전이 없습니다.

$ pnpm install
 WARN  The "workspaces" field in package.json is not supported by pnpm. Create a "pnpm-workspace.yaml" file instead.
 ERR_PNPM_INVALID_SELECTOR  Cannot parse the "**/unset-value" selector

아마도 3.4.0 버전으로 다시 시도해 보겠습니다. :confused:

음, Discourse를 3.4.0 버전으로 재설치했습니다:

하지만 프로덕션 모드로 실행하지는 못했습니다. 왜 그런지 정확히 모르겠어요. 그냥 "Oops …"라고만 표시되고, 로그에서도 딱히 확인되는 것이 없었습니다. 프록시 설정과 관련된 문제인 것 같기도 하지만 확신은 없습니다.

어쨌든 RAILS_ENV를 "development"로 되돌리니 실행은 시작되었습니다. 하지만 WordPress에서 연결을 시도할 때 여전히 같은 오류가 발생합니다:

[2025-02-21 22:11:06] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""} 

Discourse로 쿼리가 도달하는 것은 확인되는데, 왜 작동하지 않는지 이해가 되지 않습니다.

GET "/site.json" for 000.123.456.789 at 2025-02-21 16:11:05 -0600
10:11 pm
Processing by SiteController#site as JSON
10:11 pm
ApiKey Load (9.0ms) SELECT "api_keys".* FROM "api_keys" WHERE (revoked_at IS NULL) AND "api_keys"."key_hash" = '3f27a89fedae42123b9ad596fae6c06d36748f53bd241213941083af49cf5e46' ORDER BY "api_keys"
10:11 pm
ApiKeyScope Load (10.6ms) SELECT "api_key_scopes".* FROM "api_key_scopes" WHERE "api_key_scopes"."api_key_id" = 1
10:11 pm
User Load (8.1ms) SELECT "users"."id", "users"."username", "users"."created_at", "users"."updated_at", "users"."name", "users"."last_posted_at", "users"."active", "users"."username_lower", "users".
10:11 pm
UserOption Load (6.1ms) SELECT "user_options"."user_id", "user_options"."mailing_list_mode", "user_options"."email_digests", "user_options"."external_links_in_new_tab", "user_options"."enable_quoti
10:11 pm
Group Load (8.6ms) SELECT "groups"."id", "groups"."name", "groups"."flair_icon", "groups"."flair_upload_id", "groups"."flair_bg_color", "groups"."flair_color" FROM "groups" ORDER BY groups.name ASC
10:11 pm
(7.0ms) SELECT "categories"."id" FROM "categories" WHERE "categories"."read_restricted" = FALSE
10:11 pm
(10.7ms) SELECT "categories"."id" FROM "categories" WHERE "categories"."read_restricted" = TRUE
10:11 pm
Topic Count (4.1ms) SELECT COUNT(*) FROM (SELECT 1 AS one FROM "topics" WHERE "topics"."deleted_at" IS NULL LIMIT 16) subquery_for_count
10:11 pm
(6.1ms) SELECT "users"."id" FROM "users" INNER JOIN "user_auth_tokens" ON "user_auth_tokens"."user_id" = "users"."id" WHERE "users"."admin" = TRUE AND (users.id > 0) ORDER BY user_auth_tokens.crea
10:11 pm
(8.5ms) SELECT "categories"."id" FROM "categories" WHERE "categories"."topic_featured_link_allowed" = TRUE
10:11 pm
ColorScheme Load (6.8ms) SELECT "color_schemes".* FROM "color_schemes" WHERE (color_schemes.id NOT IN (SELECT color_scheme_id FROM theme_color_schemes)) AND "color_schemes"."id" = 1 LIMIT 1
10:11 pm
ColorSchemeColor Load (7.8ms) SELECT "color_scheme_colors".* FROM "color_scheme_colors" WHERE "color_scheme_colors"."color_scheme_id" = 1 ORDER BY id ASC
10:11 pm
(6.0ms) SELECT "group_users"."group_id" FROM "group_users" WHERE "group_users"."user_id" = -1
10:11 pm
(8.0ms) SELECT "category_users"."category_id", "category_users"."notification_level" FROM "category_users" WHERE "category_users"."user_id" = -1
10:11 pm
UserField Load (9.5ms) SELECT "user_fields"."id", "user_fields"."name", "user_fields"."created_at", "user_fields"."updated_at", "user_fields"."editable", "user_fields"."description", "user_fields".
10:11 pm
Completed 200 OK in 256ms (Views: 0.3ms | ActiveRecord: 116.4ms (15 queries, 0 cached) | GC: 94.6ms)

일단 이 문제로 좀 쉬어볼 생각이지만, 무엇이 잘못되었을지 아이디어가 있으시다면 몇 가지 힌트를 주시면 감사하겠습니다. :slightly_smiling_face:

표준 설정을 사용하는 다른 사용자들을 혼란스럽게 할 수 있으므로, 이 대화를 독립적인 주제로 이동했습니다.

다시 정리하자면,

  1. 로컬 머신에서 Discourse를 실행하고 있습니다.
  2. 특정 버전을 실행하고 있으며, 현재는 3.4.0을 사용 중입니다.
  3. 로컬 인스턴스를 원격 WordPress 인스턴스에 연결하려고 하고 있습니다.

위 내용 중 틀린 부분이 있나요? 또한 다음 사항에 대해 설명해 주실 수 있을까요?

  1. 로컬 머신에서 원격 WordPress 인스턴스에 어떻게 연결하고 있나요? ngrok을 사용 중인가요?
  2. 최신 버전 대신 특정 버전의 Discourse를 실행하는 이유는 무엇인가요?
  3. 궁극적인 목표는 무엇인가요?

네.

네.

제 테스트 WordPress 인스턴스도 로컬에서 실행되고 있습니다.

아니요, 모든 것이 로컬에서 실행됩니다. 서로 다른 IP 주소(하나는 WordPress용, 다른 하나는 Discourse용)를 듣고 있는 두 개의 httpd 인스턴스를 실행하고 있습니다. WordPress 인스턴스는 호스트 시스템에서 직접 실행되고 있고, Discourse 인스턴스는 systemd-nspawn 컨테이너에서 실행되고 있습니다. 호스트 시스템과 컨테이너 모두 Fedora Linux 41을 실행하고 있습니다.

처음에는 Docker 인스턴스를 시도했지만, 테스트 머신에서 빌드되지 않았습니다. 오류 메시지를 조사하던 중 문제가 ZFS 파일 시스템과 관련되어 있다는 것을 알려주는 오픈된 버그 리포트를 발견했습니다. 워크어라운드를 적용하기 위해 Docker 이미지를 수정하는 방법을 모르므로, 소스 저장소를 클론하고 해당 방식으로 Discourse를 빌드하는 방법을 찾았습니다.

처음에는 최신 버전(3.5.0.beta1-dev)을 빌드했지만, 동작이 영상이 보여준 내용과 다르게 느껴졌습니다. 권한이 "Global"으로 설정되어 있을 때, WordPress가 API 키로 연결을 시도하면 Discourse 로그에 403 Forbidden이 표시되었습니다. 권한을 "Granular"으로 변경하고 WordPress에 대한 모든 상자를 체크하면 쿼리가 더 진행되었지만, WordPress는 빈/잘못된 응답을 받았습니다. 그 후 https://blog.discourse.org/에서 홍보 중인 최신 버전이 3.4라는 것을 확인했고, 제가 겪는 문제 중 일부가 프리릴리스 버전을 실행하려고 해서일 수 있다고 결론 내렸습니다. 테스트하려는 WordPress 플러그인과 완전히 호환될 정도로 충분히 오래된 버전일 것이라 생각하여 git checkout v3.3.0을 시도했지만, 제 시스템에서 빌드되지 않아 3.4.0 버전으로 체크아웃했고, 이 버전은 잘 동작하는 것 같습니다(다만 “development” 모드에서).

솔직히 말하면, WordPress Discourse 플러그인을 실험하고 익숙해지는 것뿐입니다. Discourse 자체에는 큰 관심이 없습니다. 단순히 테스트할 대상이 필요할 뿐입니다. 모든 것이 어떻게 작동하는지에 익숙해지면, 플러그인을 프로덕션 사이트(fedoramagazine.org)에 설치하고 댓글을 프로덕션 Discourse 인스턴스인 discussion.fedoraproject.org로 리다이렉트하는 것을 시도해 볼 수도 있습니다.

이 포럼에서 본 것 중 가장 슬픈 말이야! :lolsob:

이 문제는 로컬 설정 및 네트워크와 관련이 있을 것입니다. Discourse 버전이나 글로벌 키와 세부 키(Granular Keys) 간의 차이 때문은 아닙니다. 로컬에서 WordPress와 Discourse를 실행할 수 있는 다양한 방법과 환경이 존재하기 때문에, 로컬 앱 간 상호 연결 문제를 디버깅하는 것은 저에게도 쉽지 않습니다. 도움이 될 수 있는 몇 가지 팁을 드리겠습니다.

  1. 항상 최신 버전의 Discourse, WordPress 및 WP Discourse 플러그인을 실행하세요.
  2. WP Discourse의 로컬호스트 Discourse URL에서 포트 4200 대신 포트 3000을 사용하세요.
  3. 생성한 키가 발행 사용자(Publishing Username)로 설정한 관리자 사용자 이름으로 사용할 수 있는지 확인하세요.

다음은 로컬 WordPress와 Discourse가 서로 연결된 제 로컬 설정의 모습입니다. 저는 로컬에서 WordPress를 실행하기 위해 MAMP Pro를 사용합니다.


동작했어요!!!

포트 3000에 직접 연결하는 팁을 알려주셔서 감사합니다. 그게 차이를 만든 것 같습니다.

참고로 (적어도 제 로컬 환경에서는) ember-cli를 시작하기 전에 ALLOW_EMBER_CLI_PROXY_BYPASS=1을 설정해야 했습니다.