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:
parent
8b61734914
commit
b3519f9547
@ -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]
|
||||
|
||||
|
||||
@ -41,6 +41,7 @@ class ActivateRequest(BaseModel):
|
||||
|
||||
class TrialRequest(BaseModel):
|
||||
customer: str = "GUARDiA 체험판"
|
||||
days: int = 7 # 체험 기간 (일): 7 또는 30
|
||||
|
||||
|
||||
class LicenseStatusOut(BaseModel):
|
||||
@ -184,9 +185,10 @@ async def activate_trial_license(
|
||||
if existing:
|
||||
existing.is_active = False
|
||||
|
||||
# 체험 라이선스 생성
|
||||
trial_key = generate_trial_key(body.customer)
|
||||
status = validate_license(trial_key)
|
||||
# 체험 라이선스 생성 (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(
|
||||
license_key = trial_key,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user