Discourse 일일 챌린지

:information_source: 요약 리더보드, 자동 게시글, 배지 수여 기능을 갖춘 시간 제한 도전을 실행하세요.
:hammer_and_wrench: 리포지토리 링크 R23DPrinting-group / discourse-daily-challenge · GitLab
:open_book: 설치 가이드 Discourse에 플러그인 설치하는 방법

현재 버전: 1.5.0 (2026년 4월 2일 업데이트)
라이선스: MIT


이야기

저는 최근에 Discord에서 Discourse로 이전한 건강 및 웰니스 커뮤니티를 운영하고 있습니다. Discord에서는 월간 피트니스 챌린지를 진행하기 위해 커스텀 봇을 구축했습니다. 회원들은 매일 운동 기록을 게시했고, 봇은 체크인 현황을 추적하며 주간 리더보드를 게시하고 매월 말에 우승자를 발표했습니다. 이는 커뮤니티에서 가장 인기 있는 기능 중 하나였습니다.

Discourse로 이동한 후, 회원들은 챌린지 부활을 요청하기 시작했습니다. 기존 플러그인을 찾아보았지만 아무것도 나오지 않았습니다. 그래서 직접 하나 만들었습니다.

간단한 해결책으로 시작했던 것이 결국 오리지널 Discord 봇보다 훨씬 잘 작동하는 풀-피처 챌린지 시스템으로 발전했습니다. 다른 커뮤니티에도 유용할 수 있을 것 같아 여기 공유합니다.


기능

discourse-daily-challenge 플러그인은 Discourse 내에서 구조화된 시간 제한 챌린지를 직접 실행할 수 있게 해줍니다. 회원들은 지정된 주제(topic)에 해시태그나 사진과 함께 게시글을 작성하여 체크인합니다. 플러그인이 모든 것을 자동으로 추적합니다.

핵심 기능

:white_check_mark: 유연한 체크인
회원들은 챌린지 주제에 설정된 해시태그나 사진 첨부 파일과 함께 게시글을 작성하여 체크인합니다. 챌린지는 일일 또는 주간 체크인으로 설정할 수 있습니다. 체크인 창(window)은 챌린지에 설정된 시간대를 기준으로 평가되므로 글로벌 커뮤니티에서도 올바르게 작동합니다.

:bar_chart: 실시간 리더보드 & 스트릭
관리자 대시보드는 모든 참가자의 총 체크인 수, 현재 스트릭, 완료 비율을 포함한 실시간 순위를 표시합니다. 스트릭 라벨은 챌린지 간격(“일 스트릭” 또는 “주 스트릭”)을 자동으로 반영합니다.

:robot: 자동 리더보드 게시글
챌린지 주제에 주간 자동 리더보드 게시글을 게시할 요일과 시간을 설정할 수 있습니다. 챌린지가 종료된 다음 날 최종 결과 게시글도 자동으로 생성됩니다.

:sports_medal: 커스텀 배지
챌린지를 “완료”하는 데 필요한 최소 체크인 수를 정의합니다. 대상 참가자는 챌린지가 종료될 때 자동으로 커스텀 Discourse 배지를 받습니다. 배지 이름은 주제 제목에서 자동으로 채워집니다.

:card_index_dividers: 동시 다중 챌린지
원하는 만큼의 챌린지를 동시에 실행할 수 있습니다. 각 챌린지는 자체 주제, 일정, 시간대, 배지, 리더보드를 가집니다.

:file_folder: 아카이브된 챌린지
완료된 챌린지는 대시보드의 아카이브 아코디언 뷰에 보존되므로 과거 결과를 다시 확인할 수 있습니다.

:hammer_and_wrench: 관리자 체크인 관리
관리자는 수동으로 체크인을 추가하거나 제거할 수 있습니다 — 놓친 게시글을 보완하거나 분쟁을 해결하는 데 유용합니다.

:pushpin: 수동 리더보드 트리거
“지금 리더보드 게시” 버튼을 통해 관리자는 예정된 시간대 외에 언제든지 리더보드 업데이트를 게시할 수 있습니다.

:police_officer: 모더레이터 접근 권한
전체 사이트 모더레이터는 전용 사이드바 섹션을 통해 챌린지를 생성, 편집, 관리할 수 있습니다. 사이트 설정을 통해 활성화 또는 비활성화할 수 있습니다.

:card_index_dividers: 카테고리 모더레이터 접근 권한
카테고리 모더레이터는 전용 /challenges 라우트를 통해 자신에게 할당된 카테고리에 범위가 한정된 챌린지를 관리할 수 있습니다 — 관리자 권한이 필요하지 않습니다. 사이트 설정을 통해 독립적으로 활성화 또는 비활성화할 수 있습니다.

:robot: ChallengeBot DM
봇 계정이 설정된 경우, ChallengeBot은 각 체크인 후 회원에게 확인 DM(스트릭 정보 및 주제 링크 포함)을 자동으로 보내고, 며칠 동안 체크인하지 않았을 때 알림 DM을 보내며, 챌린지 주제 내의 @멘션이나 Discourse 메시지를 통해 전송된 명령에 응답합니다 — 모든 응답은 DM으로 제공됩니다. 또한 회원이 게시글을 편집하여 해시태그나 사진을 추가한 경우를 감지하며, 허용된 시간 창 내라면 체크인으로 집계합니다. 리더보드 및 최종 결과 게시글도 시스템 계정 대신 ChallengeBot에서 전송됩니다.


설치

containers/app.yml 파일의 hooks > after_code > exec > cmd 아래에 다음을 추가하세요:

- git clone https://gitlab.com/r23dprinting-group/discourse-daily-challenge.git

그 후 재빌드하세요:

cd /var/discourse && ./launcher rebuild app

최초 설치 후, 변경 로그에 별도로 명시되지 않는 한 향후 업데이트는 패널 내의 업데이트 버튼을 통해 적용할 수 있습니다.


설정

챌린지 생성

관리자 → 플러그인 → 챌린지 → Discourse Challenges로 이동하여 새 챌린지를 클릭하세요.

필드 설명
주제 ID 회원들이 체크인할 Discourse 주제입니다. 주제 제목이 배지 이름 필드에 자동으로 채워집니다.
해시태그 트리거 체크인에 필요한 해시태그 (# 없이, 예: workout)
체크인 간격 일일 또는 주간 체크인 모드
주 시작일 주간 챌린지의 경우: 주의 시작 요일 (일요일, 월요일 또는 토요일)
시작일 챌린지의 첫 번째 날 (포함)
종료일 챌린지의 마지막 날 (포함)
챌린지 시간대 체크인 창을 평가하는 데 사용되는 시간대 (선택 사항, 기본값 UTC)
필요 체크인 수 완료 배지를 획득하는 데 필요한 최소 체크인 수
설명 챌린지의 선택적 설명
주간 리더보드 게시글 활성화 자동화된 주간 리더보드 게시글 토글
게시 요일 자동 리더보드 게시글의 요일
게시 시간 자동 리더보드 게시글의 시간 (0–23, 챌린지 시간대 기준)
완료 배지 수여 챌린지 종료 시 자동 배지 수여 토글
배지 이름 생성 및 수여할 배지의 이름 — 주제 제목에서 자동으로 채워짐
알림 DM 활성화 최근 체크인하지 않은 참가자에게 알림 DM 전송 (봇 사용자명 설정 필요). 기본적으로 활성화되어 있습니다.

사이트 설정

설정 기본값 설명
daily_challenge_enabled true 플러그인을 전역적으로 활성화 또는 비활성화
daily_challenge_mod_access_enabled true 전체 사이트 모더레이터가 챌린지를 관리하도록 허용
daily_challenge_category_mod_access_enabled true 카테고리 모더레이터가 할당된 카테고리에서 챌린지를 관리하도록 허용
daily_challenge_bot_username "" DM을 보내고 리더보드를 게시하는 봇 계정의 사용자명

체크인 작동 방식

  1. 회원이 챌린지 주제에 답글을 게시합니다
  2. 게시글에는 설정된 해시태그나 사진 첨부 파일이 포함되어야 합니다
  3. 플러그인은 회원이 현재 기간(챌린지 간격에 따라 일 또는 주) 동안 이미 체크인했는지 확인합니다
  4. 아직 체크인이 없으면 체크인이 기록되고 리더보드가 업데이트됩니다
  5. 회원당 기간당 1회 체크인만 허용됩니다

관리자는 관리자 대시보드에서 모든 체크인을 확인하고 관리할 수 있습니다.


모더레이터 및 카테고리 모더레이터 접근 권한

전체 사이트 모더레이터는 daily_challenge_mod_access_enabled이 켜져 있는 경우 메인 사이드바의 CHALLENGES 섹션을 통해 챌린지 관리에 접근할 수 있습니다.

카테고리 모더레이터는 /challenges/dashboard/challenges/challenges에서 범위가 한정된 버전에 접근할 수 있으며, 자신에게 할당된 카테고리의 주제와 연결된 챌린지만 보고 관리할 수 있습니다. 이를 위해서는 daily_challenge_category_mod_access_enabled이 켜져 있어야 하고, 사용자가 관리자 → 카테고리 → [카테고리] → 모더레이션을 통해 카테고리 모더레이터로 지정되어 있어야 합니다.


ChallengeBot 설정

ChallengeBot은 선택 사항이지만 DM 기능과 출처가 명시된 리더보드 게시글을 활성화합니다. DM 기능이 필요하지 않다면 이 섹션을 건너뛰세요.

  1. 서버에 SSH로 로그인하고 다음을 실행하세요:
cd /var/discourse
./launcher enter app
rake admin:create

프롬프트가 표시되면 봇의 이메일과 강력한 비밀번호를 입력하세요. 관리자 권한에 대해서는 n을 입력하세요.

  1. 관리자 → 사용자에서 새로 생성된 계정을 찾아 다음을 수행하세요:

    • 승인 클릭
    • **신뢰 수준(Trust Level)**을 1로 설정
    • 사용자명을 ChallengeBot(또는 선호하는 이름)으로 업데이트
  2. 선택적으로 봇 계정의 프로필 사진을 설정하세요.

  3. 관리자 → 플러그인 → 챌린지 → 설정으로 이동하여 정확한 사용자명을 봇 사용자명 필드에 입력하세요. 참고: 이 필드는 대소문자를 구분합니다.

ChallengeBot 명령어

회원들은 활성 챌린지 주제에서 봇을 @멘션하거나 프로필을 통해 ChallengeBot에게 직접 메시지를 보내 명령어를 트리거할 수 있습니다. 봇은 항상 DM으로 응답하며 주제에 게시글을 남기지 않습니다.

여러 활성 챌린지에 참여하고 있는 경우, ChallengeBot은 하나를 선택하도록 요청합니다(또는 모두를 위해 A라고 답할 수 있음).

명령어 설명
status 모든 활성 챌린지에 대한 통계
leaderboard 해당 챌린지의 현재 순위
streak 현재 스트릭
checkins 모든 체크인 날짜 목록
progress 완료한 체크인 수 vs 필요 수, 남은 일수
help 사용 가능한 모든 명령어 목록

시간당 사용자당 10회로 속도 제한됩니다.

참고: status와 같은 짧은 DM 명령어를 허용하려면 사이트 설정에서 min_personal_message_post_length1로 설정하세요.


자동 게시글

주간 리더보드

플러그인은 주간 리더보드를 게시할 시간인지 확인하는 시간 단위 백그라운드 작업을 실행합니다. 설정된 요일 + 시간이 도달하면(챌린지 시간대 기준), 현재 순위를 보여주는 형식화된 게시글이 챌린지 주제에 생성됩니다.

최종 결과 게시글

챌린지가 종료된 다음 날, 최종 결과 게시글이 자동으로 게시됩니다. 모든 참가자, 그들의 총 체크인 수, 완료 상태, 그리고 배지 획득자를 축하하는 내용이 나열됩니다.


데이터베이스 테이블

  • daily_challenges — 챌린지 정의
  • daily_check_ins — 챌린지별, 기간별 사용자별 개별 체크인 기록

호환성

  • Discourse 3.x+
  • 셀프호스티드 설치 환경에서 테스트됨
  • Ruby 3.x, Rails 7.x+

로드맵 (v1.6.0)

아직 구체적인 기능이 계획되어 있지 않습니다. 제안 사항이 있다면 GitLab에서 이슈를 열거나 이 주제에 답글을 달아주세요.


변경 로그

변경 로그 보기

v1.5.0

  • 편집 감지 — 회원이 게시글을 편집하여 챌린지 해시태그나 사진을 추가하면, 플러그인은 이제 이를 체크인으로 집계합니다. 일일 챌린지는 원래 게시글로부터 24시간 이내의 편집을 허용하며, 주간 챌린지는 같은 챌린지 주 내의 편집을 허용합니다. 체크인은 원래 게시글의 날짜로 기록됩니다.
  • DM 명령어 — 회원들은 이제 Discourse 메시지를 통해 ChallengeBot에게 직접 명령어를 보내거나, 기존 ChallengeBot DM 스레드에 답글을 달 수 있습니다. 챌린지 주제에서 @멘션을 할 필요가 없습니다.
  • 챌린지 선택기 — 회원이 여러 활성 챌린지에 참여하고 있을 때, ChallengeBot은 쿼리할 챌린지를 선택하도록 번호가 매겨진 목록을 표시합니다. 챌린지가 하나만 있는 회원은 즉시 응답을 받습니다.

v1.4.0

  • ChallengeBot 체크인 확인 DM — 각 성공적인 체크인 후 스트릭 정보와 챌린지 주제로의 클릭 가능한 링크가 포함된 자동 DM
  • 알림 DM — 일일 챌린지는 2일 이상 누락 시 알림을 보내며, 주간 챌린지는 아직 체크인하지 않은 경우 주 마지막 날에 알림을 보냅니다. 현재 체크인 수와 목표를 포함합니다. 챌린지별 토글, 기본적으로 활성화되어 있습니다.
  • @멘션 명령어 — 회원들이 챌린지 주제에서 봇을 멘션하여 DM으로 통계를 받을 수 있습니다. 주제에 게시글을 남기지 않습니다. 명령어: status, leaderboard, streak, checkins, progress, help. 사용자당 시간당 10회로 속도 제한됩니다.
  • 리더보드 및 최종 결과 게시글 — 설정된 경우 ChallengeBot에서 게시하며, 그렇지 않으면 시스템 계정으로 폴백됩니다
  • 새 사이트 설정daily_challenge_bot_username
  • 새 챌린지 필드 — 알림 DM 토글 (기본값 활성화)

v1.3.0

  • 카테고리 모더레이터 접근 권한 — 카테고리 모더레이터는 /challenges/dashboard/challenges/challenges를 통해 할당된 카테고리의 챌린지를 생성, 편집, 삭제 및 체크인을 관리할 수 있습니다 — 관리자 권한이 필요하지 않습니다
  • 배지 이름 자동 입력 — 주제 ID가 입력되면 배지 이름 필드가 주제 제목에서 자동으로 채워집니다
  • 배지 이름 검증 — “완료 배지 수여”가 활성화되어 있을 때 배지 이름은 필수이며, 500 오류 대신 적절한 오류를 반환합니다
  • 모더레이터/카테고리 모더레이터 토글 분리daily_challenge_mod_access_enableddaily_challenge_category_mod_access_enabled를 독립적으로 토글할 수 있습니다

v1.2.0

  • 설정 가능한 체크인 간격 — 일일 또는 주간 챌린지 실행
  • 주 시작일 설정 — 주간 챌린지의 경우, 주의 시작 요일을 일요일, 월요일 또는 토요일 중 선택
  • 간격 인식 스트릭 — 스트릭 라벨 및 계산이 이제 챌린지 간격을 반영합니다
  • 모더레이터 접근 권한 — 전체 사이트 모더레이터가 전용 사이드바 섹션을 통해 챌린지를 관리할 수 있습니다
  • 관리자 UI에서 "Discourse Challenges"로 이름 변경

v1.1.1

  • 모든 활성 챌린지를 동시에 표시하는 다중 챌린지 대시보드
  • 과거 결과를 표시하는 아카이브 챌린지 아코디언

v1.1.0

  • 챌린지별 시간대 지원
  • 주간 게시 일정이 이제 챌린지별(요일, 시간, 활성화/이슈 토글)로 설정됩니다

v1.0.0

  • 초기 릴리스

피드백 및 기여

이 플러그인은 우리 커뮤니티의 실제 필요를 해결하기 위해 구축되었으며, 여러분의 커뮤니티에도 도움이 될 수 있기를 바라며 공유합니다. GitLab에서 이슈, PR, 기능 요청을 환영합니다.

책임감과 일관성이 중요한 커뮤니티(피트니스, 언어 학습, 글쓰기, 창의적 습관 등)를 운영하고 있다면, 일일 챌린지는 진정한 의미에서 강력한 참여 도구가 될 수 있습니다. 이 플러그인이 여러분의 Discourse 커뮤니티에 이를 가져오는 것을 더 쉽게 만들기를 바랍니다.

:link: R23DPrinting-group / discourse-daily-challenge · GitLab

15개의 좋아요

정말 좋습니다, 공유해 주셔서 감사합니다. 기능과 관련하여, 챌린지 간격을 매일이 아닌 다른 주기로 지정할 수 있다면 우리에게 유용할 것 같습니다. 예를 들어, 매일이 아니라 챌린지 기간 동안 주간 챌린지 체크인 방식을 선택할 수 있다면 좋겠습니다. 또한, 관리자만이 세팅할 수 있는 것이 아니라 모더레이터(또는 카테고리 모더레이터)도 챌린지를 생성할 수 있다면 더 좋을 것 같습니다.

1개의 좋아요

요청사항을 제대로 이해했는지 확인해 보겠습니다:

즉, 챌린지를 예를 들어 1개월(4월 1일~30일)로 설정하되, 하루에 1회씩이 아니라 주 1회만 카운트되도록 지정하고 싶으신 건가요? 주일~토요일 기준의 주를 원하시나요, 아니면 7일 단위로 나누길 원하시나요?

좋은 의견입니다. 제 커뮤니티에는 실제로 모드가 없어서 모드 계정으로 관리자 패널이 어떻게 보이는지 모르겠습니다. 개발 환경에서 모드 계정을 만들어서 직접 테스트해 보고 오겠습니다.

1개의 좋아요

네, 정확합니다. 저희 커뮤니티에는 1년 동안 매주 진행하는 ‘52 in 52’ 챌린지가 있어서, 매일 체크인이 아닌 방식이라면 다양한 종류의 챌린지에 대해 더 유연하게 대응할 수 있을 것입니다.

Discourse Events 이 플러그인은 관리자가 주를 토요일, 일요일 또는 월요일 시작하도록 설정할 수 있습니다. 만약 향후 해당 플러그인과 호환성을 고려하여 계획하고 있다면(예: 체크인에 대한 캘린더 이벤트 생성 또는 시작/종료 날짜 설정 등), Calendar 플러그인이 주를 설정하는 방식을 따르는 것이 좋을 것 같습니다. 다만 저희 커뮤니티의 경우 특히 어떤 기준이든 큰 차이는 없다고 생각합니다.

일반적인 모더레이터 외에 카테고리 모더레이터도 도입되면 정말 좋겠습니다. 저희에는 자체 서브 카테고리를 가진 소규모 관심사 그룹들이 있어, 해당 카테고리 모더레이터가 전체 모더레이터 권한 없이도 별도의 챌린지를 진행할 수 있게 하면 좋을 것 같습니다.

1개의 좋아요

정말 훌륭한 아이디어네요. 공유해 주셔서 감사합니다. 실현할 수 있는 방법을 찾아보겠습니다.

1개의 좋아요

이 플러그인은 gamification 플러그인이 활성화되어 있어야 하나요, 아니면 플러그인이 전반적인 게이미피케이션과 관련되어 있어서 해당 태그를 선택하신 건가요?

2개의 좋아요

플러그인은 필요하지 않습니다. 그냥 태그를 선택한 것뿐이에요. 죄송합니다.

2개의 좋아요

v1.2.0이 출시되었습니다!

이번 릴리스에서 새로 추가된 기능:

  • 설정 가능한 체크인 간격 — 일일 또는 주간 챌린지 실행
  • 주 시작일 설정 — 주간 챌린지의 경우, 주가 일요일, 월요일, 또는 토요일에 시작하도록 선택 가능
  • 간격 인식 스트릭 — 스트릭 라벨 및 계산이 이제 챌린지 간격을 반영함 (“주간 스트릭” 대 “일일 스트릭”)
  • 모더레이터 접근 권한 — 전체 사이트 모더레이터는 이제 전용 사이드바 섹션을 통해 챌린지를 생성, 편집 및 관리할 수 있습니다. 이는 관리자 → 설정 → 플러그인(daily_challenge_mod_access_enabled)에서 활성화 또는 비활성화할 수 있으므로, 챌린지 관리를 관리자 전용으로 유지하려는 커뮤니티는 그렇게 할 수 있습니다.
  • 관리자 UI에서 "Discourse Challenges"로 이름 변경
스크린샷

챌린지 폼 — 체크인 간격

대시보드 — 주 시작일

모더레이터 사이드바 접근

참고: 이 릴리스를 적용하려면 데이터베이스 마이그레이션을 위해 ./launcher rebuild app 명령이 필요합니다 — 이 릴리스의 경우 패널 내 업데이트 버튼은 작동하지 않습니다.


카테고리 모더레이터 접근 권한에 관해서는 — 이것은 제가 적극적으로 작업 중인 부분입니다. 문제는 Discourse가 카테고리 모더레이터에게 스태프 권한을 부여하지 않기 때문에, 플러그인이 무엇을 하든 관계없이 /admin 경로에 전혀 접근할 수 없다는 것입니다. 카테고리 모더레이터가 자신의 카테고리 내 챌린지에 대해 범위가 지정된 접근 권한을 가질 수 있도록, 카테고리 모더레이터 전용으로 설계된 비관리자 경로를 탐색하고 있습니다. v1.3.0에서 이 기능이 제공될 예정입니다.

1개의 좋아요

도전을 생성할 수 없으며, 어떤 작업을 수행하든 500 오류가 반환됩니다.

이상하네요. 저는 2개의 다른 포럼에서 문제없이 실행 중이고, 테스트도 꽤 많이 해봤습니다. 현재 사용 중인 Discourse 버전은 무엇인가요? 최신 플러그인 버전(1.2.0)을 사용하고 계신가요?

서버에 SSH로 접속하여 몇 가지 명령어를 실행한 후 결과를 게시해 주시겠어요?

먼저, 플러그인 버전 번호를 확인하세요:

./launcher enter app
cat /var/www/discourse/plugins/discourse-daily-challenge/plugin.rb | grep version

다음으로, 챌린지를 생성해 보세요. 500 에러가 발생하면 즉시 SSH 세션에서 다음을 실행하세요:

./launcher enter app
tail -50 /var/www/discourse/log/production.log

결과를 알려주시면 함께 원인을 찾아보겠습니다.

Discourse 2026.3.0-latest.1 - https://github.com/discourse/discourse version f2781e1455274ea2c011fd1d161ac2ad9fde72bd

# version: 1.2.0
# required_version: 2.7.0
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:05 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "2", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não vou me estressar\",\"action\":\"reply                                                                                        \",\"categoryId\":14,\"tags\":[],\"archetypeId\":\"regular\",\"metaData\":null,\                                                                                        "composerTime\":25298,\"typingTime\":3900,\"locale\":\"\"}", "owner" => "fee91ce                                                                                        037e64ec297a500af13091165", "force_save" => "false"}
Completed 200 OK in 11ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.1ms)
Started GET "/t/os-melhores-blogs-de-games-no-brasil/15399?__cf_chl_rt_tk=5M6_rd                                                                                        _fq46BL9PZ6VvZRAVdIsJ84aL9XIfa1Re_paQ-1773238724-1.0.1.1-g20DH5dkOVXOIHhKYVpNwYR                                                                                        CQNnUboE4.po6L1TFk1E" for 164.52.120.12 at 2026-03-26 20:49:06 +0000
Processing by TopicsController#show as */*
  Parameters: {"__cf_chl_rt_tk" => "5M6_rd_fq46BL9PZ6VvZRAVdIsJ84aL9XIfa1Re_paQ-                                                                                        1773238724-1.0.1.1-g20DH5dkOVXOIHhKYVpNwYRCQNnUboE4.po6L1TFk1E", "slug" => "os-m                                                                                        elhores-blogs-de-games-no-brasil", "topic_id" => "15399"}
  Rendered layout layouts/application.html.erb (Duration: 107.3ms | GC: 1.4ms)
Completed 200 OK in 192ms (Views: 109.0ms | ActiveRecord: 0.0ms (0 queries, 0 ca                                                                                        ched) | GC: 2.4ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:11 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "3", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não vou me estressar com o comportamento                                                                                         \",\"action\":\"reply\",\"categoryId\":14,\"tags\":[],\"archetypeId\":\"regular\                                                                                        ",\"metaData\":null,\"composerTime\":31344,\"typingTime\":4600,\"locale\":\"\"}"                                                                                        , "owner" => "fee91ce037e64ec297a500af13091165", "force_save" => "false"}
Completed 200 OK in 11ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started GET "/leaderboard" for 2804:1e68:c201:632a:1161:4504:ea4d:9983 at 2026-0                                                                                        3-26 20:49:15 +0000
Processing by DiscourseGamification::GamificationLeaderboardController#respond a                                                                                        s JSON
Completed 200 OK in 30ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:16 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "4", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não vou me estressar com o comportamento                                                                                         das outras pessoas \",\"action\":\"reply\",\"categoryId\":14,\"tags\":[],\"arche                                                                                        typeId\":\"regular\",\"metaData\":null,\"composerTime\":36481,\"typingTime\":510                                                                                        0,\"locale\":\"\"}", "owner" => "fee91ce037e64ec297a500af13091165", "force_save"                                                                                         => "false"}
Completed 200 OK in 11ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started GET "/leaderboard/6?period=daily" for 2804:1e68:c201:632a:1161:4504:ea4d                                                                                        :9983 at 2026-03-26 20:49:19 +0000
Processing by DiscourseGamification::GamificationLeaderboardController#respond a                                                                                        s JSON
  Parameters: {"period" => "daily", "id" => "6"}
Completed 200 OK in 20ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Processing by UserAvatarsController#show as PNG
  Parameters: {"hostname" => "segredin.com", "username" => "mary", "size" => "28                                                                                        8", "version" => "8962_2"}
Completed 418  in 8ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached)                                                                                         | GC: 0.0ms)
Sent file /var/www/discourse/public/uploads/default/optimized/2X/8/86ba5981dfff7                                                                                        6df7de0f2141a1a87ad805e2c5c_2_288x288.jpeg (0.2ms)
Started GET "/latest.json" for 2804:79d4:f008:68f:fd8c:855b:db16:bbee at 2026-03                                                                                        -26 20:49:23 +0000
Processing by ListController#latest as JSON
Completed 200 OK in 143ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cach                                                                                        ed) | GC: 6.8ms)
Started GET "/t/17746/1.json?track_visit=true&forceLoad=true" for 2804:79d4:f008                                                                                        :68f:fd8c:855b:db16:bbee at 2026-03-26 20:49:31 +0000
Processing by TopicsController#show as JSON
  Parameters: {"track_visit" => "true", "forceLoad" => "true", "topic_id" => "17                                                                                        746", "post_number" => "1"}
Completed 200 OK in 114ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cach                                                                                        ed) | GC: 1.8ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:32 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "5", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não consigo k\",\"action\":\"reply\",\"ca                                                                                        tegoryId\":14,\"tags\":[],\"archetypeId\":\"regular\",\"metaData\":null,\"compos                                                                                        erTime\":46059,\"typingTime\":8500,\"locale\":\"\"}", "owner" => "fee91ce037e64e                                                                                        c297a500af13091165", "force_save" => "false"}
Completed 200 OK in 13ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:36 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "6", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não consigo julgar \",\"action\":\"reply\                                                                                        ",\"categoryId\":14,\"tags\":[],\"archetypeId\":\"regular\",\"metaData\":null,\"                                                                                        composerTime\":50400,\"typingTime\":9100,\"locale\":\"\"}", "owner" => "fee91ce0                                                                                        37e64ec297a500af13091165", "force_save" => "false"}
Completed 200 OK in 10ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:37 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "7", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não consigo julgar \",\"action\":\"reply\                                                                                        ",\"categoryId\":14,\"tags\":[],\"archetypeId\":\"regular\",\"metaData\":null,\"                                                                                        composerTime\":51596,\"typingTime\":9100,\"locale\":\"\"}", "owner" => "fee91ce0                                                                                        37e64ec297a500af13091165", "force_save" => "false"}
Completed 200 OK in 10ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Processing by TopicsController#timings as */*
  Parameters: {"timings" => {"1" => "59036"}, "topic_time" => "59036", "topic_id                                                                                        " => "17746"}
Completed 418  in 8ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached)                                                                                         | GC: 0.0ms)

음. 그 로그에는 500 오류가 표시되지 않네요. 정확히 언제 오류가 발생하나요? 화면에서 어떤 오류 메시지를 확인하시나요, 아니면 단순히 "문제가 발생했습니다"라는 일반적인 메시지만 뜨나요? 모든 필드를 올바르게 입력하고 계신지 확인해 주셨나요? 특히 토픽 ID는요?

500 오류가 보이면 바로 이 명령어를 실행해 보시겠어요? 크기를 조금 늘려서 실행합니다:

./launcher enter app
tail -100 /var/www/discourse/log/production.log | grep -A 30 "500\|Error\|exception"

(게시글이 작성자에 의해 삭제되었습니다)

잠깐, 다시 활성화할게요

아, 문제를 알아볼 것 같아요. 배지 이름은 주제 제목에서 가져와야 하는데, 지난 업데이트에서 실수를 한 것 같아요. 배지 이름 필드를 직접 입력해 보시고 통과하는지 확인해 주시겠어요? 집에 가면 수정 업데이트를 바로 올릴게요.

2개의 좋아요

새로운 게 있나요? 여기 업데이트를 했는데 아직 아무것도 없어요

안녕하세요. 죄송합니다. 어젯밤에 이 게시물을 업데이트하는 것을 깜빡했습니다. 배지 관련 수정 사항(그리고 몇 가지 다른 개선 사항)이 포함된 업데이트를 배포했습니다. Admin > Update Discourse로 가시면 업데이트가 사용 가능하다는 것을 확인하실 수 있을 것입니다.

조금 후에 변경 사항에 대한 전체 게시물을 작성하겠습니다.

2개의 좋아요

제가 이걸 잘못된 방법으로 하고 있다는 확신이 듭니다.

첫 번째 궁금한 점: 토픽 ID는 이미 존재하는 것을 사용해야 하나요, 아니면 새로 생성해야 하나요?
tag은 # 없이 작성하는 것으로 이해했습니다.

start와 end는 며칠 또는 몇 주 단위로 설정할 수 있나요, 아니면 예를 들어 12월까지로 설정할 수도 있나요?

어쨌든 이 플러그인이 마음에 들어서 피드백을 제공하기 위해 여기 있으니, 설명을 기다리겠습니다.

계정이 접근할 수 있는 기존 주제 ID여야 합니다(관리자 계정이므로 문제가 되지 않을 것입니다). 예: 주제의 URL이 다음과 같은 경우:

https://community.com/t/test-formatting/722

입력해야 할 주제 ID는 722입니다.

숫자를 입력하면 아래에 주제의 이름이 표시되어 올바른 ID를 입력했는지 확인할 수 있습니다.

맞습니다. 해시태그는 # 없이 입력하세요. #testtag를 사용하려면 상자 안에 testtag만 입력하면 됩니다.

시작일과 종료일은 원하는 대로 지정할 수 있습니다.

activerecord (8.0.5) lib/active_record/inheritance.rb:76:in 'ActiveRecord::Inheritance::ClassMethods#new'
plugins/discourse-daily-challenge/app/controllers/discourse_daily_challenge/admin_daily_challenges_controller.rb:26:in 'DiscourseDailyChallenge::AdminDailyChallengesController#create'

제 첫 번째 설정

그리고 최근 로그