- docs/verification/real-env-0.1.1.md/.json: 배포 경과·결함 수정 요약, 흐름별 단계·증거, 재검증(systemd/nginx/HAL·포털 건강/배포 영수증/모듈 버전) 기록 - docs/RUNBOOK-0.1.1.md: 서버 한 대 운영, 메일 서버 등록 값, 발신 메일, 같은 릴리스 재등록 절차 - VERSION_HISTORY.md 알려진 제한에 실환경 검증 결과 기입. 출시 완료는 선언하지 않음 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1082 lines
29 KiB
JSON
1082 lines
29 KiB
JSON
{
|
|
"generatedAt": "2026-10-26T14:33:19.592Z",
|
|
"stamp": "mvpcu283",
|
|
"summary": {
|
|
"verified_real": 7,
|
|
"partial": 7,
|
|
"not_verified": 20
|
|
},
|
|
"flows": [
|
|
{
|
|
"no": 1,
|
|
"title": "신규 고객 가입과 이메일 확인",
|
|
"verdict": "verified_real",
|
|
"note": "실제 포털·실제 mailer 경로(포획 서버) — 외부 수신함 도착은 별도 1건으로 확인",
|
|
"steps": [
|
|
{
|
|
"name": "가입 → 세션 발급(실제 포털 https://my.ariweb.net)",
|
|
"ok": true,
|
|
"detail": {
|
|
"status": 200
|
|
}
|
|
},
|
|
{
|
|
"name": "확인 전 그룹 생성 차단(403 email_unverified)",
|
|
"ok": true,
|
|
"detail": "email_unverified"
|
|
},
|
|
{
|
|
"name": "확인 메일이 실제 발신 경로(mailer resend → 포획 서버)로 나감 · 토큰 추출",
|
|
"ok": true,
|
|
"detail": {
|
|
"subject": "[Ariweb] 이메일 주소를 확인해 주세요",
|
|
"from": "no-reply@ariweb.net",
|
|
"linkHost": "https://my.ariweb.net"
|
|
}
|
|
},
|
|
{
|
|
"name": "이메일 확인(1회용) → 재사용 거부",
|
|
"ok": true,
|
|
"detail": {
|
|
"first": 200,
|
|
"second": "token_used"
|
|
}
|
|
},
|
|
{
|
|
"name": "내 정보: 확인됨 · 개인 그룹 · owner",
|
|
"ok": true,
|
|
"detail": {
|
|
"verifiedAt": "2026-10-26T14:31:15.078Z",
|
|
"group": "personal",
|
|
"role": "owner"
|
|
}
|
|
},
|
|
{
|
|
"name": "중복 가입은 존재를 드러내지 않는 안내(409)",
|
|
"ok": true,
|
|
"detail": "signup_unavailable"
|
|
},
|
|
{
|
|
"name": "로그인 화면(로그인 상태면 302, 아니면 200)·기기(세션) 목록",
|
|
"ok": true,
|
|
"detail": {
|
|
"loggedIn": 302,
|
|
"anonymous": 200,
|
|
"sessions": 1
|
|
}
|
|
}
|
|
],
|
|
"evidence": {
|
|
"verifiedAt": "2026-10-26T14:31:15.078Z",
|
|
"group": "personal",
|
|
"role": "owner"
|
|
}
|
|
},
|
|
{
|
|
"no": 2,
|
|
"title": "개인 사용자 그룹 생성과 다른 사용자 초대",
|
|
"verdict": "verified_real",
|
|
"note": "",
|
|
"steps": [
|
|
{
|
|
"name": "팀 그룹 만들기 → 현재 그룹 전환",
|
|
"ok": true,
|
|
"detail": "g_01a1789f67b12a216acd1955fa"
|
|
},
|
|
{
|
|
"name": "이메일 초대 → 초대 메일(포획)에서 링크",
|
|
"ok": true,
|
|
"detail": "upaCVcL43bFzzZaGTtGZi_tU2J64oJEA"
|
|
},
|
|
{
|
|
"name": "초대 수락(1회용) → member · 재사용 거부",
|
|
"ok": true,
|
|
"detail": {
|
|
"reuse": "invite_invalid"
|
|
}
|
|
},
|
|
{
|
|
"name": "권한 없는 구성원의 변경 API → 403",
|
|
"ok": true,
|
|
"detail": {
|
|
"requiredRole": [
|
|
"owner",
|
|
"admin"
|
|
],
|
|
"yourRole": "member"
|
|
}
|
|
}
|
|
],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 3,
|
|
"title": "상품 주문, 결제 확인, 권리 활성화",
|
|
"verdict": "verified_real",
|
|
"note": "",
|
|
"steps": [
|
|
{
|
|
"name": "상품 목록(공개 버전·가격·한도)",
|
|
"ok": true,
|
|
"detail": {
|
|
"count": 2,
|
|
"id": "pv_01a178834fac072b5600ce1e60",
|
|
"name": "팀",
|
|
"price": 49000,
|
|
"sites": 3
|
|
}
|
|
},
|
|
{
|
|
"name": "주문 제출(수동 결제, 독립 메일 옵션 포함) → 결제 대기",
|
|
"ok": true,
|
|
"detail": {
|
|
"id": "o_01a1789f68c3298aec8ad337e8",
|
|
"group_id": "g_01a1789f67b12a216acd1955fa",
|
|
"order_no": "AW-20261026-0003",
|
|
"kind": "new",
|
|
"product_version_id": "pv_01a178834fac072b5600ce1e60",
|
|
"items_json": "[{\"type\":\"product\",\"id\":\"team\",\"name\":\"팀\",\"qty\":1,\"unit_price\":49000,\"amount\":49000,\"tax\":4900,\"target_type\":\"group\",\"target_id\":null,\"grants\":{\"sites\":3,\"web_disk\":21474836480,\"web_out\":214748364800,\"mail_storage\":21474836480,\"mail_msgs\":10000,\"mailboxes\":20}},{\"type\":\"option\",\"id\":\"standalone_mail\",\"name\":\"독립 메일 서비스\",\"qty\":1,\"unit_price\":9000,\"amount\":9000,\"tax\":900,\"target_type\":\"group\",\"target_id\":null,\"grants\":{\"mail_services\":1,\"mail_storage\":5368709120,\"mail_msgs\":3000,\"mailboxes\":5},\"policy\":null}]",
|
|
"target_type": "group",
|
|
"target_id": "g_01a1789f67b12a216acd1955fa",
|
|
"amount": 58000,
|
|
"tax": 5800,
|
|
"total": 63800,
|
|
"currency": "KRW",
|
|
"status": "awaiting_payment",
|
|
"payment_method": "manual_transfer",
|
|
"payment_instructions_json": "{\"method\":\"manual_transfer\",\"bank\":\"검증용 은행(예시)\",\"account\":\"000-0000-0000-00 (검증 환경 예시 계좌)\",\"holder\":\"Ariweb 검증 환경\",\"note\":\"입금자명에 주문 번호를 적어 주세요. 운영자가 입금을 확인한 뒤 승인하면 권리가 활성화됩니다.\",\"deadline_days\":7}",
|
|
"due_at": "2026-11-02T14:31:15.395Z",
|
|
"paid_at": null,
|
|
"paid_ref": null,
|
|
"approved_at": null,
|
|
"approved_by": null,
|
|
"rejected_at": null,
|
|
"rejected_reason": null,
|
|
"expired_at": null,
|
|
"cancelled_at": null,
|
|
"idempotency_key": "g_01a1789f67b12a216acd1955fa:real-mvpcu283",
|
|
"created_by": "u_01a1789f67540609561010fe91",
|
|
"created_at": "2026-10-26T14:31:15.395Z",
|
|
"updated_at": "2026-10-26T14:31:15.395Z",
|
|
"note": null,
|
|
"entitlement_ids_json": null,
|
|
"terms_json": "{\"acceptedAt\":\"2026-10-26T14:31:15.395Z\",\"productVersion\":\"pv_01a178834fac072b5600ce1e60\",\"terms\":\"v0.1.1\"}",
|
|
"subscription_id": null,
|
|
"items": [
|
|
{
|
|
"type": "product",
|
|
"id": "team",
|
|
"name": "팀",
|
|
"qty": 1,
|
|
"unit_price": 49000,
|
|
"amount": 49000,
|
|
"tax": 4900,
|
|
"target_type": "group",
|
|
"target_id": null,
|
|
"grants": {
|
|
"sites": 3,
|
|
"web_disk": 21474836480,
|
|
"web_out": 214748364800,
|
|
"mail_storage": 21474836480,
|
|
"mail_msgs": 10000,
|
|
"mailboxes": 20
|
|
}
|
|
},
|
|
{
|
|
"type": "option",
|
|
"id": "standalone_mail",
|
|
"name": "독립 메일 서비스",
|
|
"qty": 1,
|
|
"unit_price": 9000,
|
|
"amount": 9000,
|
|
"tax": 900,
|
|
"target_type": "group",
|
|
"target_id": null,
|
|
"grants": {
|
|
"mail_services": 1,
|
|
"mail_storage": 5368709120,
|
|
"mail_msgs": 3000,
|
|
"mailboxes": 5
|
|
},
|
|
"policy": null
|
|
}
|
|
],
|
|
"payment_instructions": {
|
|
"method": "manual_transfer",
|
|
"bank": "검증용 은행(예시)",
|
|
"account": "000-0000-0000-00 (검증 환경 예시 계좌)",
|
|
"holder": "Ariweb 검증 환경",
|
|
"note": "입금자명에 주문 번호를 적어 주세요. 운영자가 입금을 확인한 뒤 승인하면 권리가 활성화됩니다.",
|
|
"deadline_days": 7
|
|
},
|
|
"entitlement_ids": [],
|
|
"terms": {
|
|
"acceptedAt": "2026-10-26T14:31:15.395Z",
|
|
"productVersion": "pv_01a178834fac072b5600ce1e60",
|
|
"terms": "v0.1.1"
|
|
},
|
|
"statusLabel": "결제 대기",
|
|
"product": {
|
|
"id": "pv_01a178834fac072b5600ce1e60",
|
|
"name": "팀",
|
|
"version": 1,
|
|
"billingCycle": "monthly"
|
|
},
|
|
"nextStep": "안내된 계좌로 63,800 원 을 입금하세요. 운영자가 입금을 확인한 뒤 승인하면 권리가 활성화됩니다.",
|
|
"canCancel": true,
|
|
"lastCancellableStep": "운영자 승인 전까지",
|
|
"remaining": null,
|
|
"policyNotes": {
|
|
"paymentDeadlineDays": 7,
|
|
"restrictionAfterUnpaidDays": 14,
|
|
"restrictionEffect": "신규 배포·설정 변경·새 메일함 생성 제한(기존 서비스·조회·삭제·내보내기 유지)"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "입금 확인 전 승인 거부(409)",
|
|
"ok": true,
|
|
"detail": "payment_not_confirmed"
|
|
},
|
|
{
|
|
"name": "운영자 입금 확인 → 승인 → 권리 활성화",
|
|
"ok": true,
|
|
"detail": {
|
|
"paid": "awaiting_approval",
|
|
"approved": "approved",
|
|
"granted": 10
|
|
}
|
|
},
|
|
{
|
|
"name": "고객 결제 화면: 활성 상품·권리·다음 청구일",
|
|
"ok": true,
|
|
"detail": {
|
|
"subs": 1,
|
|
"nextBilling": "2026-11-26T14:31:15.451Z"
|
|
}
|
|
}
|
|
],
|
|
"evidence": {
|
|
"orderNo": "AW-20261026-0003",
|
|
"bill": {
|
|
"subs": 1,
|
|
"nextBilling": "2026-11-26T14:31:15.451Z"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"no": 4,
|
|
"title": "초안 사이트 생성",
|
|
"verdict": "verified_real",
|
|
"note": "실제 Webmaker 에 프로젝트 생성(내부 API 서명 호출)",
|
|
"steps": [
|
|
{
|
|
"name": "사이트 생성(새 Webmaker 프로젝트 · 관리형) → 초안",
|
|
"ok": true,
|
|
"detail": {
|
|
"id": "s_01a1789f690cb9115f0330d2e8",
|
|
"group_id": "g_01a1789f67b12a216acd1955fa",
|
|
"name": "검증 사이트 mvpcu283",
|
|
"purpose": "실제 환경 검증",
|
|
"webmaker_project_id": "85e1859a8638022beb761f1ec4ccfc93",
|
|
"template": null,
|
|
"lang": "ko",
|
|
"timezone": "Asia/Seoul",
|
|
"lifecycle": "draft",
|
|
"deploy_mode": "managed",
|
|
"primary_domain": null,
|
|
"site_count_state": "none",
|
|
"site_count_reservation_id": null,
|
|
"server_id": null,
|
|
"external_agent_id": null,
|
|
"current_version": null,
|
|
"current_deployment_id": null,
|
|
"deploy_verify": null,
|
|
"health": "unknown",
|
|
"health_checked_at": null,
|
|
"maintenance": 0,
|
|
"search_visible": 1,
|
|
"description": null,
|
|
"settings_json": null,
|
|
"paused_at": null,
|
|
"cancel_at": null,
|
|
"retention_until": null,
|
|
"delete_after": null,
|
|
"deleted_at": null,
|
|
"created_by": "u_01a1789f67540609561010fe91",
|
|
"created_at": "2026-10-26T14:31:15.468Z",
|
|
"updated_at": "2026-10-26T14:31:15.519Z",
|
|
"runtime": "static",
|
|
"consent_version": null,
|
|
"pending_cleanup_json": null,
|
|
"return_due_at": null,
|
|
"last_deploy_at": null,
|
|
"last_external_check_json": null,
|
|
"next_job_json": null,
|
|
"mail_choice": null,
|
|
"next_notice_at": null,
|
|
"delete_hold_reason": null,
|
|
"public_stopped_at": null,
|
|
"prev_lifecycle": null,
|
|
"settings": {},
|
|
"pendingCleanup": null,
|
|
"lastExternalCheck": null,
|
|
"nextJob": null
|
|
}
|
|
},
|
|
{
|
|
"name": "초안 목록·사용량(사이트 수 미소비)",
|
|
"ok": true,
|
|
"detail": {
|
|
"drafts": 1,
|
|
"lifecycle": "draft",
|
|
"projectId": null
|
|
}
|
|
}
|
|
],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 5,
|
|
"title": "Webmaker에서 페이지 제작",
|
|
"verdict": "partial",
|
|
"note": "제작 화면 진입(SSO)은 실제 Webmaker 로 확인 · 페이지 제작(AI 생성·저장)은 사람이 Webmaker 화면에서 수행해야 하므로 미수행",
|
|
"steps": [
|
|
{
|
|
"name": "제작 화면 열기: 포털 SSO 티켓 → 실제 Webmaker /api/auth/sso 302(1회용)",
|
|
"ok": true,
|
|
"detail": {
|
|
"portal": 302,
|
|
"webmaker": 302,
|
|
"webmakerLocation": "/?site=85e1859a8638022beb761f1ec4ccfc93",
|
|
"reuse": 403
|
|
}
|
|
},
|
|
{
|
|
"name": "저장본 목록·배포 전 확인(실제 Webmaker 프로젝트)",
|
|
"ok": true,
|
|
"detail": {
|
|
"versionsStatus": 200,
|
|
"versions": 0,
|
|
"precheck": true
|
|
}
|
|
}
|
|
],
|
|
"evidence": {
|
|
"sso": {
|
|
"portal": 302,
|
|
"webmaker": 302,
|
|
"webmakerLocation": "/?site=85e1859a8638022beb761f1ec4ccfc93",
|
|
"reuse": 403
|
|
},
|
|
"ver": {
|
|
"versionsStatus": 200,
|
|
"versions": 0,
|
|
"precheck": true
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"no": 6,
|
|
"title": "관리형 배포",
|
|
"verdict": "partial",
|
|
"note": "배포 요청이 거부됨: precheck_failed — 배포 전 확인에서 차단된 항목이 있습니다 (저장본이 없어 배포할 내용이 없음; 사람이 Webmaker 에서 페이지를 저장한 뒤 수행)",
|
|
"steps": [
|
|
{
|
|
"name": "배포 요청(관리형) → HAL 작업·사이트 수 예약",
|
|
"ok": true,
|
|
"detail": {
|
|
"status": 409,
|
|
"error": "precheck_failed",
|
|
"message": "배포 전 확인에서 차단된 항목이 있습니다"
|
|
}
|
|
}
|
|
],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 7,
|
|
"title": "도메인 연결과 HTTPS 발급",
|
|
"verdict": "not_verified",
|
|
"note": "실제 소유 도메인과 공개 DNS(TXT·A) 변경이 필요 — 이번 작업은 공개 DNS 를 바꾸지 않음",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 8,
|
|
"title": "외부 주소에서 사이트 확인",
|
|
"verdict": "not_verified",
|
|
"note": "공개 DNS(my/hal/사이트 도메인) 생성 전 — 외부 주소 접속은 레코드 생성 뒤 확인",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 9,
|
|
"title": "사이트 정보와 접속·사용량 통계 확인",
|
|
"verdict": "partial",
|
|
"note": "화면 데이터 제공 확인 · 실제 접속 통계(awstats 로그 집계)는 공개 DNS 로 외부 방문이 생긴 뒤 확인 가능",
|
|
"steps": [
|
|
{
|
|
"name": "사이트 정보·배포 이력·사용량 화면",
|
|
"ok": true,
|
|
"detail": {
|
|
"overviewKeys": [
|
|
"ok",
|
|
"overview",
|
|
"refreshJob"
|
|
],
|
|
"usageKeys": [
|
|
"ok",
|
|
"overview",
|
|
"allocations",
|
|
"samples"
|
|
],
|
|
"deployments": 0
|
|
}
|
|
}
|
|
],
|
|
"evidence": {
|
|
"overviewKeys": [
|
|
"ok",
|
|
"overview",
|
|
"refreshJob"
|
|
],
|
|
"usageKeys": [
|
|
"ok",
|
|
"overview",
|
|
"allocations",
|
|
"samples"
|
|
],
|
|
"deployments": 0
|
|
}
|
|
},
|
|
{
|
|
"no": 10,
|
|
"title": "사이트 대표 메일과 메일함 생성",
|
|
"verdict": "partial",
|
|
"note": "실제 AriMail 테넌트·메일함 생성 확인 · 활성화는 도메인 DNS(MX/SPF/DKIM) 반영이 필요해 외부 대기",
|
|
"steps": [
|
|
{
|
|
"name": "사이트 연결 도메인 등록(검증 전용 이름, 소유 확인은 외부 대기)",
|
|
"ok": true,
|
|
"detail": {
|
|
"id": "d_01a1789f6a07e57873e2f0c05f"
|
|
}
|
|
},
|
|
{
|
|
"name": "사이트 대표 메일 생성 → 실제 AriMail 테넌트 준비",
|
|
"ok": true,
|
|
"detail": {
|
|
"id": "msv_01a1789f6a0d5f702a1581f2fd",
|
|
"status": "needs_setup",
|
|
"kind": "site_bound"
|
|
}
|
|
},
|
|
{
|
|
"name": "메일함 생성(초기 비밀번호 1회 표시) → 재조회에 비밀번호 없음 · 실제 AriMail 계정",
|
|
"ok": true,
|
|
"detail": {
|
|
"id": "mb_01a1789f6e723ade68602baaf9",
|
|
"address": "kim@check-mvpcu283.ariweb.net",
|
|
"shownOnce": true,
|
|
"leakedOnReload": false
|
|
}
|
|
},
|
|
{
|
|
"name": "DNS 확인(미반영 구분) → 활성화 작업은 외부 대기",
|
|
"ok": true,
|
|
"detail": {
|
|
"dnsOk": true,
|
|
"items": [],
|
|
"activate": 200,
|
|
"job": "queued",
|
|
"waitReason": ""
|
|
}
|
|
}
|
|
],
|
|
"evidence": {
|
|
"d": {
|
|
"id": "d_01a1789f6a07e57873e2f0c05f"
|
|
},
|
|
"svc": {
|
|
"id": "msv_01a1789f6a0d5f702a1581f2fd",
|
|
"status": "needs_setup",
|
|
"kind": "site_bound"
|
|
},
|
|
"mb": {
|
|
"id": "mb_01a1789f6e723ade68602baaf9",
|
|
"address": "kim@check-mvpcu283.ariweb.net",
|
|
"shownOnce": true,
|
|
"leakedOnReload": false
|
|
},
|
|
"dns": {
|
|
"dnsOk": true,
|
|
"items": [],
|
|
"activate": 200,
|
|
"job": "queued",
|
|
"waitReason": ""
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"no": 11,
|
|
"title": "외부 송신, 수신, 회신 확인",
|
|
"verdict": "not_verified",
|
|
"note": "검증용 수신 주소(자동 응답 메일함)와 고객 도메인 MX 반영 필요",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 12,
|
|
"title": "독립 메일 서비스 생성",
|
|
"verdict": "verified_real",
|
|
"note": "",
|
|
"steps": [
|
|
{
|
|
"name": "메일 전용 도메인 등록(purpose mail)",
|
|
"ok": true,
|
|
"detail": "d_01a1789f6e94cf197bdcb0cb81"
|
|
},
|
|
{
|
|
"name": "독립 메일 서비스 생성(독립 옵션 소비·사이트 수 미소비)",
|
|
"ok": true,
|
|
"detail": {
|
|
"id": "msv_01a1789f6e9604bd5f49bb08e1",
|
|
"kind": "standalone",
|
|
"status": "needs_setup",
|
|
"usage": {}
|
|
}
|
|
}
|
|
],
|
|
"evidence": {
|
|
"id": "msv_01a1789f6e9604bd5f49bb08e1",
|
|
"kind": "standalone",
|
|
"status": "needs_setup",
|
|
"usage": {}
|
|
}
|
|
},
|
|
{
|
|
"no": 13,
|
|
"title": "백업 옵션 구매와 첫 백업 확인",
|
|
"verdict": "partial",
|
|
"note": "백업 옵션 주문·승인·활성화는 실제 확인. 수동 백업 실행은 사이트가 초안(미배포)이라 정기 실행기가 옵션을 site_not_deployed 로 중지해 Agent 백업까지 가지 않음(설계대로) — Webmaker 에서 페이지를 저장·배포한 뒤 다시 수행. 판정은 검증기의 시간 초과를 운영자가 DB 상태(옵션 paused: site_not_deployed)로 확인해 부분 확인으로 정정",
|
|
"steps": [
|
|
{
|
|
"name": "백업 옵션 주문(대상 사이트 지정) → 입금 확인 → 승인",
|
|
"ok": true,
|
|
"detail": {
|
|
"orderNo": "AW-20261026-0004",
|
|
"approved": "approved"
|
|
}
|
|
},
|
|
{
|
|
"name": "백업 화면(옵션 보유 여부)",
|
|
"ok": true,
|
|
"detail": {}
|
|
},
|
|
{
|
|
"name": "옵션 활성화(확인 필수) → 첫 백업 예정",
|
|
"ok": true,
|
|
"detail": {
|
|
"status": "active"
|
|
}
|
|
},
|
|
{
|
|
"name": "지금 백업 실행 → 실제 Agent 가 사이트 파일·데이터를 묶어 저장(완료 대기 120초)",
|
|
"ok": false,
|
|
"error": "백업 완료 대기 시간 초과"
|
|
}
|
|
],
|
|
"evidence": {
|
|
"optionState": {
|
|
"status": "paused",
|
|
"paused_reason": "site_not_deployed",
|
|
"updated_at": "2026-10-26T14:32:11.943Z"
|
|
},
|
|
"siteLifecycle": "draft",
|
|
"lastJob": {
|
|
"status": "failed",
|
|
"error": "대상 서버 또는 Agent 가 필요합니다"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"no": 14,
|
|
"title": "백업 복원과 외부 사이트 확인",
|
|
"verdict": "not_verified",
|
|
"note": "복원 승인(3단계)·외부 사이트 확인은 공개 DNS 와 복원 대상 배포본 필요(흐름 6 선행)",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 15,
|
|
"title": "관리형 사이트 서버 이전과 외부 확인",
|
|
"verdict": "not_verified",
|
|
"note": "관리 서버가 1대뿐이라 서버 간 이전 미수행",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 16,
|
|
"title": "외부 배포 사이트 생성과 배포",
|
|
"verdict": "not_verified",
|
|
"note": "외부 Linux 서버 없음",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 17,
|
|
"title": "사용량 경고와 한도 동작 확인",
|
|
"verdict": "not_verified",
|
|
"note": "실제 사용량이 한도에 이르려면 운영 트래픽·시간 경과 필요",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 18,
|
|
"title": "상품 축소 보류와 정리 후 적용",
|
|
"verdict": "not_verified",
|
|
"note": "축소 보류는 실제 사용 중 리소스가 필요(로컬 E2E 확인)",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 19,
|
|
"title": "사이트 수 반환과 대표 메일의 독립 전환",
|
|
"verdict": "not_verified",
|
|
"note": "사이트 수 반환·독립 전환은 흐름 10 활성화(외부 DNS) 뒤 가능",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 20,
|
|
"title": "사이트 소유권 이전",
|
|
"verdict": "not_verified",
|
|
"note": "두 번째 소유자 그룹의 심사 절차를 포함해 로컬 E2E 로 확인, 실환경 미수행",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 21,
|
|
"title": "중지, 해지, 보존 예정일 표시",
|
|
"verdict": "not_verified",
|
|
"note": "보존 예정일 표시는 시간 경과 필요(로컬 E2E 확인)",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 22,
|
|
"title": "HAL 우선 배포 후 HAL을 통한 전체 모듈 배포",
|
|
"verdict": "verified_real",
|
|
"note": "HAL 부트스트랩 → 첫 Agent → HAL 작업으로 portal·webmaker·arimail·agent 배포, 실제 버전 0.1.1·건강 ok",
|
|
"steps": [
|
|
{
|
|
"name": "HAL 릴리스·모듈 목표/실제 버전(배포 영수증)",
|
|
"ok": true,
|
|
"detail": {
|
|
"running": {
|
|
"complete": true,
|
|
"firstInstall": false,
|
|
"releaseVersion": "0.1.1",
|
|
"mainCommit": "3951be5836a753e60f11d6b363025059fcf6d448",
|
|
"artifactSha256": "e7741899cd7387b0155c9d3bf8ff14cc4026880db999c9d59347744390415e84",
|
|
"halRunningVersion": "0.1.1",
|
|
"firstAgent": "ag_01a178829f1c3d88381d2c0c75",
|
|
"manualInstallLocked": true
|
|
},
|
|
"targets": [
|
|
{
|
|
"module": "agent",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "arimail",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "backup",
|
|
"target": null,
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "hal",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "observability",
|
|
"target": null,
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "portal",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "webmaker",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "HAL 을 통한 모듈 배포 작업(module.deploy) 결과",
|
|
"ok": true,
|
|
"detail": [
|
|
{
|
|
"label": "portal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "hal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "portal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "portal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "agent 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "arimail 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "hal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "agent 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "arimail 0.1.1 배포",
|
|
"status": "failed"
|
|
},
|
|
{
|
|
"label": "webmaker 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "portal 0.1.1 배포",
|
|
"status": "done"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"evidence": {
|
|
"rel": {
|
|
"running": {
|
|
"complete": true,
|
|
"firstInstall": false,
|
|
"releaseVersion": "0.1.1",
|
|
"mainCommit": "3951be5836a753e60f11d6b363025059fcf6d448",
|
|
"artifactSha256": "e7741899cd7387b0155c9d3bf8ff14cc4026880db999c9d59347744390415e84",
|
|
"halRunningVersion": "0.1.1",
|
|
"firstAgent": "ag_01a178829f1c3d88381d2c0c75",
|
|
"manualInstallLocked": true
|
|
},
|
|
"targets": [
|
|
{
|
|
"module": "agent",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "arimail",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "backup",
|
|
"target": null,
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "hal",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "observability",
|
|
"target": null,
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "portal",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
},
|
|
{
|
|
"module": "webmaker",
|
|
"target": "0.1.1",
|
|
"actual": "0.1.1",
|
|
"health": "ok"
|
|
}
|
|
]
|
|
},
|
|
"jobs": [
|
|
{
|
|
"label": "portal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "hal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "portal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "portal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "agent 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "arimail 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "hal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "agent 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "arimail 0.1.1 배포",
|
|
"status": "failed"
|
|
},
|
|
{
|
|
"label": "webmaker 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "portal 0.1.1 배포",
|
|
"status": "done"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"no": 23,
|
|
"title": "실패 작업의 재시도와 되돌리기",
|
|
"verdict": "not_verified",
|
|
"note": "실패 작업 재시도·되돌리기는 배포 중 실제로 2회 발생(백업 실패→재시도 성공, 마이그레이션 실패→되돌리기) — 기록은 VERSION_HISTORY·이 문서의 배포 경과 참고",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 24,
|
|
"title": "운영자 승인, 감사 기록, 고객 알림의 일치",
|
|
"verdict": "partial",
|
|
"note": "",
|
|
"steps": [
|
|
{
|
|
"name": "고객 감사 기록(order.approve) · 알림 · 운영자 주문 상태 일치",
|
|
"ok": true,
|
|
"detail": {
|
|
"auditEntries": 0,
|
|
"notifications": 6,
|
|
"status": "approved"
|
|
}
|
|
},
|
|
{
|
|
"name": "HAL 감사 기록(deploy.module)",
|
|
"ok": true,
|
|
"detail": 10
|
|
}
|
|
],
|
|
"evidence": {
|
|
"a": {
|
|
"auditEntries": 0,
|
|
"notifications": 6,
|
|
"status": "approved"
|
|
},
|
|
"halDeployAudit": 10
|
|
}
|
|
},
|
|
{
|
|
"no": 25,
|
|
"title": "HAL, 로그인, 비밀정보 관리, 인증서 기반의 재해복구 훈련",
|
|
"verdict": "not_verified",
|
|
"note": "재해복구 훈련은 다른 호스트 복원이 필요(로컬 E2E 부분 확인)",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 26,
|
|
"title": "새로 고침, 재로그인, HAL 재시작 후 진행 작업 상태 유지",
|
|
"verdict": "verified_real",
|
|
"note": "",
|
|
"steps": [
|
|
{
|
|
"name": "HAL 재시작 전: 운영자 세션·작업 수·서버 등록",
|
|
"ok": true,
|
|
"detail": {
|
|
"jobs": 23,
|
|
"servers": 1
|
|
}
|
|
},
|
|
{
|
|
"name": "systemctl restart ariweb-hal → 건강 회복 → 같은 세션으로 작업 수·서버 유지",
|
|
"ok": true,
|
|
"detail": {
|
|
"uptimeSec": 1,
|
|
"sessionKept": true,
|
|
"jobs": 23,
|
|
"servers": 1,
|
|
"agentOnline": true
|
|
}
|
|
},
|
|
{
|
|
"name": "Agent 가 재접속(heartbeat) 해 서버 ready 유지",
|
|
"ok": true,
|
|
"detail": [
|
|
{
|
|
"name": "srv1953374 (ariweb.net)",
|
|
"status": "ready",
|
|
"lastSeen": "2026-10-26T14:33:13.381Z"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"evidence": {
|
|
"before": {
|
|
"jobs": 23,
|
|
"servers": 1
|
|
},
|
|
"after": {
|
|
"uptimeSec": 1,
|
|
"sessionKept": true,
|
|
"jobs": 23,
|
|
"servers": 1,
|
|
"agentOnline": true
|
|
},
|
|
"ag": [
|
|
{
|
|
"name": "srv1953374 (ariweb.net)",
|
|
"status": "ready",
|
|
"lastSeen": "2026-10-26T14:33:13.381Z"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"no": 27,
|
|
"title": "마지막 사이트 수·용량·메일함 동시 요청 시 하나만 성공",
|
|
"verdict": "not_verified",
|
|
"note": "동시 요청 경합은 로컬 E2E 로 확인, 실환경 미수행",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 28,
|
|
"title": "외부 Linux 서버 Agent 연결·배포·재배포·제거·실패 정리",
|
|
"verdict": "not_verified",
|
|
"note": "외부 Linux 서버 없음",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 29,
|
|
"title": "HAL 장애 중 기존 서비스 유지와 신규 변경 제한 표시",
|
|
"verdict": "not_verified",
|
|
"note": "HAL 장애 상태 표시는 로컬 E2E 로 확인(흐름 26 에서 재시작 중 복구만 실환경 확인)",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 30,
|
|
"title": "모듈 업데이트, 일부 서버 실패, 대상별 되돌리기와 상태 조정",
|
|
"verdict": "partial",
|
|
"note": "모듈 갱신(수정 artifact 재등록 → HAL 작업으로 agent·hal 갱신) 4건 완료 확인 · 일부 서버 실패·대상별 되돌리기는 서버 1대뿐이라 미수행",
|
|
"steps": [],
|
|
"evidence": [
|
|
{
|
|
"label": "hal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "agent 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "hal 0.1.1 배포",
|
|
"status": "done"
|
|
},
|
|
{
|
|
"label": "agent 0.1.1 배포",
|
|
"status": "done"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"no": 31,
|
|
"title": "긴급 복구의 승인 부족·만료 자격·허용 범위 밖 작업 거부와 정상 복구",
|
|
"verdict": "not_verified",
|
|
"note": "긴급 복구 절차는 로컬 E2E 로 확인",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 32,
|
|
"title": "Source 옵션 만료 후 30일 read-only, clone·export와 삭제 완료",
|
|
"verdict": "not_verified",
|
|
"note": "Source 옵션 30일 만료는 시간 경과 필요",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 33,
|
|
"title": "메일 서비스의 사이트 대표→독립 전환 후 항목 유지",
|
|
"verdict": "not_verified",
|
|
"note": "흐름 19 와 같은 외부 DNS 선행 조건",
|
|
"steps": [],
|
|
"evidence": null
|
|
},
|
|
{
|
|
"no": 34,
|
|
"title": "일시 중지·해지 예약·보존·삭제 단계의 표시 일치",
|
|
"verdict": "not_verified",
|
|
"note": "시간 경과 필요(로컬 E2E 확인)",
|
|
"steps": [],
|
|
"evidence": null
|
|
}
|
|
],
|
|
"bugs": [],
|
|
"test": {
|
|
"alice": "alice-mvpcu283@check.ariweb.net",
|
|
"site": "s_01a1789f690cb9115f0330d2e8",
|
|
"mailDomain": "check-mvpcu283.ariweb.net",
|
|
"order": "o_01a1789f68c3298aec8ad337e8"
|
|
}
|
|
} |