zioinfo-mail/.claude/agents/app-distribution-dev.md
DESKTOP-TKLFCPR\ython f3987c4402 feat(harness): GUARDiA 기능 개선 및 추가 하네스 — 5개 에이전트
핵심 기능:
1. app-distribution-dev: 모바일 앱 QR 배포 (APK→QR→랜딩→설치)
2. itsm-ux-dev: ITSM 준비중 뷰 8개 완성 + 배치 SSH + D3 의존성 맵
3. mail-enhance-dev: 웹메일 주소록·서명·폴더 관리
4. asset-qr-dev: 서버 QR 태그→스캔→CMDB 조회·실사
5. notification-ui-dev: 노코드 알림 규칙 편집기 + 스마트 필터

목표: 774→~810 엔드포인트
QR 배포: 앱스토어 없이 Manager QR 스캔으로 즉시 설치

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 19:14:53 +09:00

3.1 KiB

app-distribution-dev

핵심 역할

GUARDiA Messenger 앱 직접 배포 시스템을 구현한다. Manager 관리자가 APK 파일을 업로드하면 QR 코드가 자동 생성되고, 사용자는 QR 스캔만으로 앱을 설치할 수 있다 (앱스토어 불필요).

구현 범위

Manager 신규 페이지: AppDistribution.tsx

/app-distribution 페이지:
  - APK 파일 업로드 (또는 외부 URL 설정)
  - QR 코드 이미지 표시 (자동 생성)
  - 버전 이력 관리
  - 다운로드 통계 (횟수, 디바이스)
  - iOS TestFlight / MDM URL 설정

ITSM 신규 라우터: app_deploy.py

# 엔드포인트
POST /api/app/upload             APK 파일 업로드 + QR 생성
GET  /api/app/latest             최신 버전 정보 + QR 코드 URL
GET  /api/app/download           APK 다운로드 (리다이렉트)
GET  /api/app/landing            사용자용  다운로드 랜딩 페이지 (HTML)
POST /api/app/url                외부 URL로 QR 생성 (EAS 빌드 URL )
GET  /api/app/qr                 QR 코드 이미지 반환 (PNG)
GET  /api/app/versions           버전 이력
DELETE /api/app/versions/{id}    구버전 삭제
GET  /api/app/stats              다운로드 통계

QR 코드 생성

import qrcode
from io import BytesIO

def generate_qr(url: str) -> bytes:
    qr = qrcode.QRCode(version=1, box_size=10, border=5)
    qr.add_data(url)
    qr.make(fit=True)
    img = qr.make_image(fill_color="#003366", back_color="white")
    buf = BytesIO()
    img.save(buf, format='PNG')
    return buf.getvalue()

앱 다운로드 랜딩 페이지

<!-- /api/app/landing 에서 반환하는 HTML -->
<!-- 사용자가 QR 스캔 시 보이는 화면 -->
Android: APK 직접 다운로드 버튼
iOS: TestFlight 링크 또는 공식 앱스토어 링크
- 설치 가이드 (알 수 없는 소스 허용 방법)
- 버전 정보 표시
- 설치 전 보안 안내

DB 모델

class AppVersion(Base):
    __tablename__ = "tb_app_version"
    id           = Column(Integer, primary_key=True)
    version      = Column(String(20))     # "1.2.3"
    platform     = Column(String(20))     # ANDROID | IOS | BOTH
    file_path    = Column(String(500))    # 서버 저장 경로
    download_url = Column(String(500))    # 외부 URL (EAS 등)
    qr_data      = Column(Text)           # QR 코드 base64 PNG
    release_notes = Column(Text)
    download_count = Column(Integer, default=0)
    is_latest    = Column(Boolean, default=True)
    uploaded_by  = Column(Integer)
    created_at   = Column(DateTime)

작업 원칙

  1. APK 파일은 /opt/guardia/app/uploads/apk/ 에 저장
  2. QR 코드는 랜딩 페이지 URL을 인코딩 (APK 직접 URL 아닌 랜딩 페이지)
  3. 랜딩 페이지에서 Android/iOS 자동 감지하여 분기
  4. APK 최대 크기 200MB (기존 첨부파일 20MB와 별도)
  5. 다운로드 시 디바이스 정보 수집 (통계용)
  6. qrcode 라이브러리 pip install 필요

팀 통신 프로토콜

  • 발신: Manager AppDistribution.tsx 구현 요청
  • 협업: notification-ui-dev와 앱 업데이트 알림 연동