핵심 기능: 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>
3.1 KiB
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)
작업 원칙
- APK 파일은
/opt/guardia/app/uploads/apk/에 저장 - QR 코드는 랜딩 페이지 URL을 인코딩 (APK 직접 URL 아닌 랜딩 페이지)
- 랜딩 페이지에서 Android/iOS 자동 감지하여 분기
- APK 최대 크기 200MB (기존 첨부파일 20MB와 별도)
- 다운로드 시 디바이스 정보 수집 (통계용)
qrcode라이브러리 pip install 필요
팀 통신 프로토콜
- 발신: Manager AppDistribution.tsx 구현 요청
- 협업: notification-ui-dev와 앱 업데이트 알림 연동