{
  "solution": "GUARDiA Mall",
  "doc_type": "운영자지침서",
  "out": "C:/GUARDiA/workspace/guardia-mall/doc/mall_운영자지침서_v1.pptx",
  "subtitle": "지오정보기술 / GUARDiA Platform / 2026",
  "design": {"primary":"1F3A5F","accent":"2E86C1","text":"222222","font_ko":"맑은 고딕"},
  "sections": [
    {"type":"table","title":"1. 설치 / 배포 정보",
      "headers":["항목","값"],
      "rows":[
        ["백엔드 포트","8011 (단일 JAR)"],
        ["프론트 개발 포트","3010"],
        ["데이터베이스","mall_db (전용 계정 mall_user)"],
        ["AI","Ollama 11434 (온프레미스)"],
        ["ITSM 연동","9001"],
        ["기동 방식","systemd 서비스 (단일 JAR)"],
        ["배포","Gitea push → webhook → Jenkins/deploy_server → systemd 재기동 → health 검증"]
      ]},
    {"title":"2. 환경설정", "bullets":[
      "DB 연결: application.yml의 PostgreSQL(mall_db) 데이터소스 설정(자격증명은 환경/시크릿으로 주입).",
      "스키마 초기화: sql.init.schema-locations = 91_uiws_port.sql · 92_uiws_system.sql (멱등·continue-on-error).",
      "AI: Ollama 엔드포인트(11434)·모델·타임아웃·폴백 설정. 미가용 시 degraded 폴백.",
      "게이트웨이 어댑터: 결제/세금/주소/SMS/이메일은 기본 mock, 운영 시 외부 연동 키 주입.",
      "보안: 자격증명·비밀번호·내부 IP는 설정 파일/응답/로그에 평문 노출 금지(시크릿 관리)."
    ]},
    {"title":"3. 시스템관리 (권한관리) 운영", "bullets":[
      "접근: /admin/uiws/system/* (ADMIN 전용 — 사이드바 + 백엔드 RBAC 이중 가드).",
      "권한관리(roles): 역할 등록/수정/다중삭제. 역할별 메뉴권한(role-menus)에서 읽기/쓰기 매핑(쓰기 ON 시 읽기 자동 ON).",
      "공통코드(codes): 코드그룹 단위로 코드값을 행 편집 후 그룹 전체 1회 저장(그룹 저장은 values 전량 반영).",
      "메뉴관리(menus)·부서관리(depts): 2-depth 트리 구성. 거래처관리(companies): 거래처 목록·다중삭제.",
      "API: /api/system/* (RBAC ADMIN/MANAGER), /api/public/* (로그인 전 룩업 permitAll)."
    ]},
    {"title":"4. 운영자 계정 / 인증 운영", "bullets":[
      "운영자 가입 승인: 신규 가입은 approved=false(승인 대기). 관리자 사용자관리(/api/admin/users)에서 승인 처리.",
      "승인 게이트: 운영(ADMIN/MANAGER) 계정만 approved 검사. approved=NULL(기존·고객)은 게이트 미적용.",
      "2FA: 1차 인증 후 2FA 토큰(purpose=2fa) 단계. 미완료 토큰으로 보호 API 접근은 차단.",
      "비밀번호 초기화: 임시비번은 BCrypt 저장 + 잠금/실패카운트 해제. 응답·로그에 임시비번 미포함.",
      "계정 열거 방지: 아이디찾기 마스킹·초기화 대상 미존재도 success 처리."
    ]},
    {"title":"5. 백업 / 복구", "bullets":[
      "DB 백업: mall_db 정기 덤프(pg_dump) — 도메인·UIMS·tb_uiws_* 전체 포함.",
      "복구: 백업 복원 후 sql.init 멱등 스크립트로 후행 테이블/컬럼 정합 보정(continue-on-error).",
      "단일 JAR 산출물·설정은 배포 파이프라인(Gitea)으로 재현 가능.",
      "복구 검증: 헬스 체크 + 핵심 화면(로그인·주문·시스템관리) 스모크 점검."
    ]},
    {"title":"6. 모니터링 / 헬스", "bullets":[
      "헬스 체크: 8011 health 엔드포인트로 기동 상태 점검(배포 후 자동 검증).",
      "AI 상태: Ollama(11434) 가용성 — 미가용 시 degraded 폴백 로그 확인.",
      "감사로그: 주요 운영 행위·권한 변경 기록 조회로 추적성 확보.",
      "로그: 스택트레이스 미노출(friendlyError) — 운영 로그는 별도 채널에서 점검."
    ]},
    {"title":"7. 장애 대응 / 보안 운영", "bullets":[
      "기동 실패: systemd 상태·DB 연결·schema-locations(91/92 sql) 적용 여부 점검.",
      "테이블 누락(relation does not exist): 멱등 sql.init(mode/continue-on-error) 재적용으로 후행 테이블 보정.",
      "권한 오작동(403): 사이드바 가드 + /api/system RBAC 양쪽 확인(ADMIN/MANAGER).",
      "보안 불변: IP/SSH/비밀번호/임시비번/내부 자격증명 응답·로그 미노출. 외부 API 호출 0(온프레미스).",
      "회귀 방지: 고객 쇼핑·주문·결제 경로는 운영자 보조/시스템관리 변경과 분리(미접촉)."
    ]}
  ]
}
