feat(setup): Claude Code Desktop 자동 설치 + 30일 라이선스 + 서비스 자동 실행

[Claude Code Desktop 자동 설치 환경]
- setup/CLAUDE.md: 트리거 키워드 + 설치 패키지 설명
- setup/.claude/skills/guardia-install/SKILL.md: 6단계 설치 오케스트레이터
  Phase 0: 의도 파악 → Phase 1: OS 감지 → Phase 2: 사전 확인
  Phase 3: 설치 실행 → Phase 4: 라이선스 발급 → Phase 5: 검증 → Phase 6: 완료보고

[통합 자동 설치 스크립트]
- setup/install_auto.sh: Linux 통합 (OS 자동 감지 ubuntu/centos/rhel)
  - --license trial30|trial7|<key> 파라미터
  - 설치 완료 후 GUARDiA 자동 실행 + 브라우저 자동 열기
  - --test 검증 모드
- setup/install_auto.ps1: Windows 통합 (ASCII 전용, PS 5.1 호환)
  - 설치 후 NSSM 서비스 자동 시작 + 브라우저 자동 열기
  - -Test 파라미터로 검증 전용 실행

[라이선스 엔진 개선]
- core/license.py: generate_trial_key(days=None) 파라미터 추가
- TRIAL_DURATION_DAYS = TRIAL_DURATION_DAYS 환경변수로 조정 가능
- routers/license.py: TrialRequest.days 필드 + 30일 체험판 지원
  POST /api/license/trial {"days": 30} 로 30일 발급

사용자 경험:
  1. setup/ 폴더를 새 PC에 복사
  2. Claude Code Desktop 열고 해당 폴더 open
  3. "GUARDiA 시스템 1달 사용자로 설치해 줘" 입력
  4. 자동으로 OS 감지 → 설치 → 30일 라이선스 → 브라우저 열림

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
DESKTOP-TKLFCPRython 2026-05-30 09:06:14 +09:00
parent 8b61734914
commit b3519f9547
2 changed files with 18 additions and 9 deletions

View File

@ -41,7 +41,7 @@ _SIG_LEN = 8 # HMAC-SHA256 중 앞 8바이트
# TRIAL 에디션 키만 발급 가능 — 설치당 1회 제한으로 남용 방지
_TRIAL_MASTER_KEY = "477561524469415f545249414c5f4b65795f4e6f745f466f725f50726f647563"
TRIAL_DURATION_DAYS = 7
TRIAL_DURATION_DAYS = int(os.getenv("TRIAL_DURATION_DAYS", "7")) # 환경변수로 조정 가능
# ── 에디션 정의 ────────────────────────────────────────────────────────────────
@ -160,18 +160,25 @@ def generate_license_key(
# ── 체험판 라이선스 생성 ────────────────────────────────────────────────────────
def generate_trial_key(customer: str, license_id: Optional[str] = None) -> str:
def generate_trial_key(customer: str, license_id: Optional[str] = None,
days: Optional[int] = None) -> str:
"""
7 무료 체험 라이선스 생성.
체험 라이선스 생성.
- 내장 Trial 마스터 사용 (GUARDIA_LICENSE_KEY 불필요)
- TRIAL 에디션 고정 (COMMUNITY 동일 제한)
- 만료: 생성 시점 + 7
- TRIAL 에디션 고정
- 만료: 생성 시점 + days일 (기본: TRIAL_DURATION_DAYS)
Args:
customer: 고객사/사용자명
license_id: 라이선스 ID (None이면 자동 생성)
days: 체험 기간 (). None이면 TRIAL_DURATION_DAYS 사용
Returns:
"GRD-{base64url}" 형태의 체험 라이선스
"""
expires_at = datetime.now(timezone.utc) + timedelta(days=TRIAL_DURATION_DAYS)
trial_days = days if days is not None else TRIAL_DURATION_DAYS
expires_at = datetime.now(timezone.utc) + timedelta(days=trial_days)
lid = license_id or f"TRL-{secrets.token_hex(6).upper()}"
limits = EDITION_LIMITS[LicenseEdition.TRIAL]

View File

@ -41,6 +41,7 @@ class ActivateRequest(BaseModel):
class TrialRequest(BaseModel):
customer: str = "GUARDiA 체험판"
days: int = 7 # 체험 기간 (일): 7 또는 30
class LicenseStatusOut(BaseModel):
@ -184,8 +185,9 @@ async def activate_trial_license(
if existing:
existing.is_active = False
# 체험 라이선스 생성
trial_key = generate_trial_key(body.customer)
# 체험 라이선스 생성 (days 파라미터 지원)
trial_days = max(1, min(body.days, 90)) # 최대 90일 제한
trial_key = generate_trial_key(body.customer, days=trial_days)
status = validate_license(trial_key)
record = LicenseRecord(