ci(itms): 운영 nginx vhost(itms.wise.ai.kr) + 통합앱 QR 페이지(/mobile-app) 아티팩트

- 운영 리버스 프록시 템플릿(RHEL conf.d, certbot 개별 발급 안내)
- dev/prod 공용 /mobile-app QR 페이지(중앙 ITSM APK 저장소 읽기전용 재사용)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
itms-merge-dev 2026-07-19 15:50:21 +09:00
parent c93f916959
commit 4fae61105c
3 changed files with 99 additions and 0 deletions

View File

@ -0,0 +1,31 @@
# itms.wise.ai.kr — ITMS 운영 리버스 프록시 (RHEL /etc/nginx/conf.d/ 배치)
# 운영서버 211.37.173.197(utimsurpai.cafe24.com). 브라우저 진입점 = front(:11020).
#
# 배치 절차:
# 1) 이 파일을 /etc/nginx/conf.d/itms.wise.ai.kr.conf 로 배치 (HTTP-only 상태)
# 2) front(:11020) 기동 확인
# 3) certbot --nginx -d itms.wise.ai.kr → 443 블록·리다이렉트 자동 주입
# 4) systemctl reload nginx
# ※ wise.ai.kr 인증서는 와일드카드 아님 → itms 서브도메인 개별 발급 필요(확인 완료).
# ※ 헬스체크는 Host 헤더 필수: curl -H "Host: itms.wise.ai.kr" http://127.0.0.1:11020/
server {
listen 80;
server_name itms.wise.ai.kr;
client_max_body_size 50m;
# 통합 메신저 앱 QR 다운로드 페이지(읽기전용, 중앙 ITSM APK 저장소 재사용)
location = /mobile-app {
alias /opt/itms/static/mobile-app.html;
default_type text/html;
}
location / {
proxy_pass http://127.0.0.1:11020;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 120s;
}
}

View File

@ -24,6 +24,12 @@ server {
client_max_body_size 50m;
# 통합 메신저 앱 QR 다운로드 페이지(읽기전용, 중앙 ITSM APK 저장소 재사용)
location = /mobile-app {
alias /opt/itms/static/mobile-app.html;
default_type text/html;
}
# 웹 UI (front :11020) — 브라우저 진입점
location / {
proxy_pass http://127.0.0.1:11020;

View File

@ -0,0 +1,62 @@
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GUARDiA Messenger 앱 다운로드 — ITMS</title>
<style>
:root { --bg:#0f1420; --card:#182031; --ink:#e8edf6; --sub:#9fb0c8; --accent:#11c3ff; --line:#26324a; }
* { box-sizing:border-box; }
body { margin:0; font-family:"Pretendard","Malgun Gothic",system-ui,sans-serif; background:var(--bg); color:var(--ink);
min-height:100vh; display:flex; align-items:center; justify-content:center; padding:24px; }
.card { background:var(--card); border:1px solid var(--line); border-radius:16px; max-width:420px; width:100%;
padding:32px 28px; text-align:center; box-shadow:0 8px 40px rgba(0,0,0,.35); }
h1 { font-size:20px; margin:0 0 4px; }
.app { font-size:15px; color:var(--accent); font-weight:600; margin-bottom:20px; }
.qr { background:#fff; border-radius:12px; padding:14px; display:inline-block; min-height:180px; min-width:180px; }
.qr img { width:180px; height:180px; display:block; }
.meta { margin:18px 0 8px; color:var(--sub); font-size:13px; line-height:1.7; }
.meta b { color:var(--ink); }
.btn { display:inline-block; margin-top:16px; padding:12px 22px; background:var(--accent); color:#04141c;
font-weight:700; text-decoration:none; border-radius:10px; font-size:15px; }
.note { margin-top:18px; font-size:11.5px; color:var(--sub); line-height:1.6; }
.err { color:#ff7a7a; font-size:13px; }
</style>
</head>
<body>
<div class="card">
<h1>모바일 앱 다운로드</h1>
<div class="app">GUARDiA Messenger</div>
<div class="qr" id="qrbox"><span class="err" style="color:#888">불러오는 중…</span></div>
<div class="meta" id="meta"></div>
<a class="btn" id="dl" href="#" style="display:none">APK 다운로드</a>
<div class="note">
Android 기기에서 QR을 스캔하거나 버튼으로 APK를 내려받아 설치하세요.<br>
본 페이지는 GUARDiA 중앙 앱 저장소(ITSM)의 최신 배포를 읽기 전용으로 표시합니다.
</div>
</div>
<script>
// 중앙 ITSM 공개 엔드포인트(인증 불필요·CORS 허용)에서 최신 APK 정보 조회
var CENTRAL = "https://itsm.zioinfo.co.kr/api/app/public-latest";
fetch(CENTRAL, { cache: "no-store" })
.then(function(r){ return r.json(); })
.then(function(d){
if (!d || !d.has_version) { throw new Error("no version"); }
var qrbox = document.getElementById("qrbox");
qrbox.innerHTML = "";
var img = new Image(); img.src = d.qr_url; img.alt = "APK QR";
img.onerror = function(){ qrbox.innerHTML = '<span class="err">QR 이미지를 불러올 수 없습니다</span>'; };
qrbox.appendChild(img);
document.getElementById("meta").innerHTML =
"<b>" + (d.app_name||"") + "</b> v" + (d.version||"") + "<br>" +
(d.platform||"") + " · " + (d.file_size_mb||"?") + " MB";
var dl = document.getElementById("dl");
dl.href = d.download_url; dl.style.display = "inline-block";
})
.catch(function(e){
document.getElementById("qrbox").innerHTML =
'<span class="err">앱 정보를 불러올 수 없습니다.<br>잠시 후 다시 시도하세요.</span>';
});
</script>
</body>
</html>