지금 딸을 학교에 데려다 주고 있습니다. 그리고 오늘 오전에 몇 가지 약속이 있어요. 조사하는 데 시간이 좀 걸릴 것 같습니다.
일부 데이터베이스 컬럼이 제대로 마이그레이션되지 않은 것 같습니다. 이 버전에서는 기존 테이블에 여러 개의 새 컬럼이 추가되었습니다. 다음 명령을 실행해 보실 수 있을까요?
cd /var/discourse && ./launcher rebuild app
패널의 업데이트 버튼을 사용하면 데이터베이스 마이그레이션이 적용되지 않습니다. 플러그인이 새 컬럼을 추가한 경우 전체 재빌드가 필요합니다.
인내심을 가져 주셔서 감사합니다. 해결책을 찾아보겠습니다!
실제로, 먼저 이 코드를 실행한 후 출력을 게시해 주시겠어요?
./launcher enter app
su discourse -c 'cd /var/www/discourse && bundle exec rails runner "puts ActiveRecord::Base.connection.columns(\"daily_challenges\").map(&:name)"'
root@segredin-app:/var/www/discourse# su discourse -c 'cd /var/www/discourse && bundle exec rails runner "puts ActiveRecord::Base.connection.columns(\"daily_cha llenges\").map(&:name)"'
id
topic_id
hashtag
start_date
end_date
check_ins_needed
description
created_at
updated_at
final_post_sent
weekly_post_enabled
weekly_post_day
weekly_post_hour
award_badge
badge_name
badge_id
check_in_interval
week_start
category_id
이것을 보세요
ActiveModel::UnknownAttributeError (unknown attribute 'challenge_timezone' for DailyChallenge.) app/controllers/application_controller.rb:447:in 'block in ApplicationController#with_resolved_locale'
challenge_timezone DB 열이 없는 것 같습니다. 다음을 실행해 보시겠어요?
./launcher enter app
su discourse -c 'cd /var/www/discourse && bundle exec rails runner "ActiveRecord::Base.connection.add_column(:daily_challenges, :challenge_timezone, :string, default: \"UTC\") unless ActiveRecord::Base.connection.column_exists?(:daily_challenges, :challenge_timezone)"'
이렇게 하면 해당 열이 추가됩니다. 왜 추가되지 않았는지 조사해서 파일들을 업데이트하겠습니다.
좋아, 아직 남아 있긴 하지만 그의 수정을 기다릴게요
ActiveModel::UnknownAttributeError (unknown attribute 'challenge_timezone' for DailyChallenge.)
app/controllers/application_controller.rb:447:in 'block in ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:447:in 'ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:1098:in 'ApplicationController#ensure_dont_cache_page'
lib/middleware/omniauth_bypass_middleware.rb:35:in 'Middleware::OmniauthBypassMiddleware#call'
lib/middleware/crawler_hooks.rb:11:in 'Middleware::CrawlerHooks#call'
lib/content_security_policy/middleware.rb:12:in 'ContentSecurityPolicy::Middleware#call'
lib/middleware/anonymous_cache.rb:420:in 'Middleware::AnonymousCache#call'
lib/middleware/csp_script_nonce_injector.rb:12:in 'Middleware::CspScriptNonceInjector#call'
config/initializers/008-rack-cors.rb:14:in 'Discourse::Cors#call'
lib/middleware/default_headers.rb:13:in 'Middleware::DefaultHeaders#call'
config/initializers/100-quiet_logger.rb:20:in 'DiscourseRackQuietAssetsLogger#call'
config/initializers/100-silence_logger.rb:29:in 'SilenceLogger#call'
lib/middleware/enforce_hostname.rb:23:in 'Middleware::EnforceHostname#call'
lib/middleware/request_tracker.rb:321:in 'Middleware::RequestTracker#call'
lib/middleware/overload_protections.rb:22:in 'Middleware::OverloadProtections#call'
lib/middleware/processing_request.rb:14:in 'Middleware::ProcessingRequest#call'
올바른 디렉터리인지 확인하려면 먼저 다음을 실행하세요:
cd /var/discourse && ./launcher enter app
그 다음 다음을 실행하세요:
su discourse -c 'cd /var/www/discourse && bundle exec rails runner "ActiveRecord::Base.connection.add_column(:daily_challenges, :challenge_timezone, :string, default: \"UTC\") unless ActiveRecord::Base.connection.column_exists?(:daily_challenges, :challenge_timezone)"'
실행한 후, 앱에서 벗어나려면 "exit"를 입력할 수 있습니다.
웹페이지를 강제 새로고침(Ctrl-Shift-R)한 뒤 다시 시도해 보세요. 그래도 작동하지 않으면 몇 분 내에 수정 사항을 배포하겠습니다.
회의 중입니다. 곧 업데이트하겠습니다.
방금 업데이트를 푸시했습니다. 관리자 패널을 통해 업데이트할 수 있어야 합니다. 작동하지 않으면 다음을 실행해야 할 수 있습니다.
./launcher rebuild app
동작합니다

우와!!! 함께 견뎌주고 문제를 해결하는 데 도움을 줘서 정말 고마워!!

다음 단계에서 새로운 기능이 추가될 예정인가요? 몇 가지 아이디어를 드리고 싶습니다.
코인과 배지가 포함된 스트릭(연속 달성) 기능, 그리고 내 통계를 확인할 수 있는 공간/섹션
어쨌든 정말 마음에 들고, 더 많은 업데이트를 기다리고 있습니다 ![]()
현재 이 부분을 작업하고 있습니다. 기본적으로는 사용자가 생성하는 “봇”(실제로는 단순한 사용자 계정)입니다. 이 플러그인은 봇에 대한 언급을 감시합니다. 언급을 발견하면 해당 작업을 실행합니다. 예를 들어:
봇 이름: ChallengeBot
누군가가 이렇게 입력합니다:
@ChallengeBot status
봇은 챌린지에서의 현재 상태를 담은 DM(다이렉트 메시지)을 해당 사용자에게 전송합니다.
봇에는 다른 옵션들도 몇 가지 있습니다.
v1.4.0이 이제 사용 가능합니다!
이번 릴리스에서는 ChallengeBot이 추가되었습니다. ChallengeBot은 챌린지에 DM 기반 참여 기능을 제공하는 선택적 봇 계정입니다.
이번 릴리스의 주요 변경 사항:
- 체크인 확인 DM — 멤버는 성공적인 체크인 후 ChallengeBot으로부터 현재 연속 기록과 챌린지 토픽 링크가 포함된 DM을 받습니다.
- 리마인더 DM — 2일 이상 연속으로 체크인하지 않은 참가자(일일 챌린지) 또는 주 마지막 날까지 체크인하지 않은 참가자(주별 챌린지)는 ChallengeBot으로부터 부드러운 알림을 받습니다. 현재 체크인 횟수와 목표가 포함됩니다. 챌린지별로 토글할 수 있으며, 기본값은 활성화되어 있습니다.
- @멘션 명령어 — 멤버는 활성 챌린지 토픽에서
@ChallengeBot을 멘션하여 DM으로 개인 통계를 받을 수 있습니다. 봇은 토픽 자체에는 응답하지 않습니다. 사용 가능한 명령어:status,leaderboard,streak,checkins,progress,help. 사용자당 시간당 10개 명령어로 제한됩니다. - 리더보드 및 최종 결과 게시글 — ChallengeBot이 설정된 경우, 주별 리더보드 게시글과 최종 결과 게시글이 시스템 계정 대신 봇 계정에서 전송됩니다.
- 새로운 사이트 설정 —
daily_challenge_bot_username - 새로운 챌린지 필드 — 리마인더 DM 토글 (기본값: 활성화)
ChallengeBot 설정은 선택 사항입니다 — 설정하지 않아도 기존 모든 기능이 정상적으로 작동합니다. 전체 설정 안내는 메인 게시글을 참조하세요.
참고: 이 릴리스에는 데이터베이스 마이그레이션이 포함되어 있습니다. 패널의 업데이트 버튼을 누르면 자동으로 적용됩니다.
이 옵션은 PM으로 보내고 토픽에도 표시하는 방식으로 가능한가요? 참고로 저는 @system을 챗봇으로 설정해 두었습니다.
CSS
.daily-challenge-dashboard {
background-color: #1a1a1b;
padding: 20px;
border-radius: 8px;
color: #d7dadc;
}
.d-page-subheader__title {
color: #ffffff;
font-size: 1.5rem;
margin-bottom: 15px;
border-bottom: 1px solid #343536;
padding-bottom: 10px;
}
.d-stat-tiles.fcd-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 12px;
margin-bottom: 30px;
}
.d-stat-tile {
background-color: #272729;
border: 1px solid #343536;
padding: 15px;
border-radius: 8px;
transition: border-color 0.2s;
}
.d-stat-tile:hover {
border-color: #818384;
}
.d-stat-tile__label {
color: #818384;
font-size: 0.75rem;
text-transform: uppercase;
font-weight: 700;
letter-spacing: 0.5px;
}
.d-stat-tile__value {
display: block;
font-size: 1.8rem;
font-weight: 600;
color: #ff4500;
}
.fcd-leaderboard__table {
width: 100%;
border-collapse: separate;
border-spacing: 0 8px;
}
.fcd-leaderboard__table thead th {
color: #818384;
font-size: 0.7rem;
text-transform: uppercase;
padding: 0 15px 5px 15px;
text-align: left;
}
.fcd-leaderboard__row {
background-color: #272729;
transition: transform 0.1s ease;
}
.fcd-leaderboard__row td {
padding: 12px 15px;
border-top: 1px solid #343536;
border-bottom: 1px solid #343536;
}
.fcd-leaderboard__row td:first-child {
border-left: 1px solid #343536;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
}
.fcd-leaderboard__row td:last-child {
border-right: 1px solid #343536;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
}
.fcd-leaderboard__row:hover {
background-color: #2d2d2e;
}
.fcd-rank {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
font-weight: bold;
font-size: 0.8rem;
}
.fcd-rank--gold { background: #ffd700; color: #000; box-shadow: 0 0 10px rgba(255, 215, 0, 0.3); }
.fcd-rank--silver { background: #c0c0c0; color: #000; }
.fcd-streak-icon {
color: #ff4500;
filter: drop-shadow(0 0 3px rgba(255, 69, 0, 0.5));
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.1); opacity: 0.8; }
100% { transform: scale(1); opacity: 1; }
}
.fcd-progress {
height: 8px;
background-color: #343536;
border-radius: 4px;
overflow: hidden;
width: 100px;
display: inline-block;
vertical-align: middle;
margin-right: 8px;
}
.fcd-progress__bar {
background: linear-gradient(90deg, #ff4500, #ff8c00);
height: 100%;
border-radius: 4px;
}
.fcd-progress__label {
font-size: 0.8rem;
color: #d7dadc;
font-weight: bold;
}
.fcd-leaderboard__user img {
border-radius: 50%;
border: 2px solid #343536;
margin-right: 10px;
}


