특정 사용자가 만든 주제를 삭제하려고 하면 502 오류가 발생합니다

특정 사용자가 생성한 주제를 관리자 패널 → 사용자 메뉴에서 삭제하려고 시도하고 있습니다. 그런데 502 오류가 발생합니다.


특정 사용자가 생성한 주제를 삭제할 다른 방법이 있을까요?

Yogesh_g 님,

해당 사용자가 작성한 301,719개의 게시물을 모두 삭제하려는 건가요? :grimacing: 이렇게 하면 누락된 게시물 때문에 의미가 없는 토픽이 많이 남게 될 것 같습니다.

이런 상황에서 해당 사용자를 익명 처리하는 것이 더 나은 방법일까요?

“delete all posts max” 설정 때문에 502 오류가 발생하는 것 같습니다.

삭제하려는 글의 수보다 더 큰 값으로 한도를 높였습니다. 그리고 이 토픽에는 같은 사용자가 작성한 글만 포함되어 있습니다.

사용자 익명화가 어떻게 작동하는지 설명해 주실 수 있을까요? 모든 사용자에게 모든 글이 숨겨지는 것인가요?

제가 사용 중인 Discourse 호스팅의 데이터베이스에 접근할 수 있는 방법이 있을까요?

아니요, 게시물을 숨기는 것이 아니라 사용자 이름을 제거합니다. 사용자가 계정 삭제를 요청할 때 좋은 해결책으로, 커뮤니티의 주제를 온전히 유지하면서 콘텐츠를 익명화하여 누가 작성했는지 아무도 알 수 없게 합니다. 자세한 내용은 다음 링크에서 확인하실 수 있습니다:

호스팅된 사이트를 사용 중이라면, Discourse 팀의 도움을 받는 것이 가장 좋습니다.

이것은 상당히 독특한 상황이며, 방대한 양의 [database] 작업이 필요합니다. 요청이 타임아웃되는 것도 당연합니다.

매우 예외적인 경우로 보입니다. 이 문제를 해결하려면 호스팅 지원팀에 연락하여 도움을 받는 것도 추천합니다.

알겠습니다. 지원팀에 연락하고 여기서 업데이트해 드릴게요.

특정 사용자의 모든 게시글을 삭제할 다른 방법이 있을까요? 아니면 데이터베이스에서 게시글을 삭제하는 커스텀 플러그인을 만들어 볼 수도 있을까요? (클라이언트가 이 기능을 요청하고 있지만, Discourse에 이미 해당 기능이 있으므로 게시글 수가 많을 경우 제대로 작동할지 확실하지 않습니다.)

플러그인을 만들어야 할까요, 아니면 만들지 말아야 할까요? 그리고 만들 경우 어떻게 작동하게 될까요?

@ Michael Brown @southpaw 지정된 수량 단위로 사용자의 게시물을 삭제하는 플러그인을 만들었습니다. 게시물 삭제를 위한 일부 Ruby 코드를 작성했으며, 현재 설정 API를 통해 관리자로부터 입력을 받고 있습니다.

현재 제가 직면한 문제는, 입력 필드와 버튼이 있는 플러그인용 관리자 페이지를 만들고 싶은 것입니다. 이 버튼을 클릭하면 제 Ruby 코드가 실행되기를 원합니다.

여러 방법을 시도해 보았지만 실패했습니다.

도움이 필요합니다. Discourse에서 이를 구현할 수 있는 방법이 있을까요?

@Yogesh_g님 안녕하세요,

:open_mouth:

저는 플러그인 작성 경험이 (아직!) 없어서, 관리자 페이지를 작동시키는 방법에 대해 질문하신 내용에 대해 바로 답변을 드리기 어렵습니다. 하지만 필요한 도움을 받고 계신지 확인하고 싶습니다.

여기서 모든 부분을 종합하는 데 조금 어려움을 겪고 있어, 좀 더 자세한 내용을 확인하기 위해 개인 메시지를 보내드렸습니다.

안녕하세요, discourse 커뮤니티 @pfaffman @merefield

특정 사용자가 작성한 모든 게시글(총 301,719개)을 삭제해야 합니다. 여러 가지 방법을 시도해 보았지만 삭제에 실패했습니다.

해당 사용자의 모든 게시글을 삭제하는 방법을 알려 주실 수 있을까요? 이 문제로 3개월째 고생하고 있습니다.

완전 삭제인지 소프트 삭제인지 말씀하시는 건가요?

영구 삭제. 이 게시글이 어떤 사용자에게도 표시되지 않기를 바랍니다.

이 주제가 도움이 될까요?

정확히 원하시는 내용은 아닐 것 같지만, 필요하신 부분에 맞게 수정해 보실 수 있을지도 모르겠습니다.

이 방법은 작동하지 않습니다. 전에 시도해 봤습니다.

예전에 비슷한 문제를 겪은 적이 있습니다. 여러 사용자의 게시글 중 조건에 맞는 약 200,000개를 삭제해야 했거든요. 일반적인 방법을 사용하면 장기간 렉이 발생할 수 있습니다.
결국 가장 단순한 방법을 선택했습니다. 1부터 최대 게시글 ID까지 반복문을 돌렸고, 조건을 만족하면 삭제하는 방식이었죠. 이 작업을 완료하는 데 약 1시간이 걸렸고, 전체 게시글은 약 900,000개였습니다.

유사한 방식으로 시도해 보았지만 서버에서 시간 초과 오류가 발생합니다. 아래는 해당 코드입니다.

# frozen_string_literal: true

module Jobs
  class DeleteUserPosts < ::Jobs::Scheduled
    every 2.minutes

    def execute(args)
      return unless SiteSetting.delete_user_topics_enabled?

      username = SiteSetting.delete_posts_for_username
      posts_per_batch = SiteSetting.delete_posts_in_single_batch.to_i

      return unless username.present? && posts_per_batch.positive?

      user = User.find_by(username: username)
      return unless user.present?

      posts = user.posts.order(created_at: :asc)

      deleted_count = 0
      posts.each do |post|
        break if deleted_count >= posts_per_batch

        if SiteSetting.delete_user_topics_dry_run?
          Rails.logger.error("DeleteUserPosts would remove Post ID #{post.id} (#{post.topic.title} - #{post.excerpt}) (dry run mode)")
        else
          Rails.logger.error("DeleteUserPosts removing Post ID #{post.id} (#{post.topic.title} - #{post.excerpt})")
          begin
            PostDestroyer.new(Discourse.system_user, post).destroy
            deleted_count += 1
          rescue StandardError => e
            Rails.logger.error("Error deleting post ID #{post.id}: #{e.message}")
          end
        end
      end

      # 남은 게시물이 없으면 예약된 작업을 취소합니다
      if posts.size <= posts_per_batch
        self.class.cancel_scheduled_job
      end
    end
  end
end

이것이 당연히 잘못될 수 있습니다. 30만 개의 게시물은 적은 수가 아니며, 이를 한 번에 메모리에 로드할 수 없습니다.

사용하신 코드 스니펫을 공유해 주시거나, 예를 보여줄 수 있을까요?