{
  "solution": "zioinfo-esn",
  "doc_type": "운영자지침서",
  "out": "C:/GUARDiA/workspace/zioinfo-esn/doc/zioinfo-esn_운영자지침서_v2.pptx",
  "subtitle": "설치·운영·권한관리(RBAC) / 지오정보기술 / 2026",
  "design": {"primary":"1F3A5F","accent":"2E86C1","text":"222222","font_ko":"맑은 고딕"},
  "sections": [
    {"type":"table", "title":"1. 설치 / 배포 정보", "headers":["항목","값"], "rows":[
      ["서비스","zioinfo-esn (단일 JAR · esn-1.0.0)"],
      ["백엔드 포트","8015"],
      ["프론트(개발)","Vite 3014"],
      ["빌드","Maven (Java 17) · React 빌드 → backend static 번들"],
      ["배포","Gitea webhook → 자동 배포 파이프라인"],
      ["DB","PostgreSQL / esn_db"]
    ]},
    {"title":"2. 환경 설정 (환경변수)", "bullets":[
      "DB_URL / DB_USER : PostgreSQL esn_db 접속 (비밀번호는 환경변수로 주입, 문서 미기재)",
      "OLLAMA_URL : 온프레미스 Ollama 엔드포인트(기본 11434) · 텍스트 모델 llama3.2:1b",
      "ITSM_URL : ITSM 연계(기본 9001)",
      "JWT_SECRET : JWT 서명 키(운영 시 환경변수로 교체 · 문서/코드 노출 금지)",
      "메일 설정 미구성 시 2FA 인증코드는 LogMailSender 폴백으로 로그 기록"
    ], "note":"자격증명·비밀번호·시크릿 값은 본 문서에 기재하지 않음"},
    {"title":"3. DB 스키마 / 마이그레이션", "bullets":[
      "부팅 시 멱등 적용: sql.init mode:always, continue-on-error",
      "적용 순서: schema.sql → 90_uiws_system.sql → 91_uiws_port.sql",
      "90_uiws_system.sql: 권한관리 10테이블 + 시드(역할 ADMIN/MANAGER/USER, ZIOINFO 회사, ROOT 부서)",
      "91_uiws_port.sql: 업무 9테이블 + esn_user 2FA 컬럼 ALTER",
      "전 구문 IF NOT EXISTS / ON CONFLICT DO NOTHING → 재배포 안전(중복 무해)",
      "UIMS 테이블은 tb_uiws_* 프리픽스 → 기존 esn_*(ESL) 충돌 없음"
    ]},
    {"title":"4. 권한관리(RBAC) 운영 — 신규", "bullets":[
      "시스템관리 메뉴는 esn_role ∈ {ADMIN, MANAGER}에게만 노출",
      "역할관리: 역할 등록·수정·다중삭제(검색·페이징)",
      "메뉴권한: 역할별 메뉴 읽기/쓰기 토글 → 전체 저장(쓰기 ON 시 읽기 자동 ON)",
      "메뉴·공통코드·부서·거래처 관리(CRUD)",
      "신규 가입자 승인: 승인 전 로그인 차단 → ADMIN 승인 처리 필요"
    ]},
    {"title":"5. 백업 / 복구", "bullets":[
      "PostgreSQL esn_db 정기 백업(pg_dump) 권장 — ESL 운영데이터 + UIMS 업무데이터 포함",
      "스키마는 멱등 부팅으로 자동 재생성되나 데이터는 별도 백업 필요",
      "복구 시 DB 복원 후 서비스 재기동 → 스키마 보강 SQL 멱등 재적용으로 정합 유지"
    ]},
    {"type":"table", "title":"6. 모니터링 / 헬스", "headers":["항목","확인 방법"], "rows":[
      ["헬스체크","GET /actuator/health (show-details: never)"],
      ["서비스 기동","8015 포트 응답 확인"],
      ["AI 상태","Ollama 11434 가용성 · 미가용 시 폴백 동작 확인"],
      ["DB 연결","Hikari pool(max 3) 포화 여부 모니터링"]
    ]},
    {"title":"7. 장애 대응", "bullets":[
      "AI 응답 없음: Ollama 미가용/RAM 부족 가능 → 폴백 동작으로 핵심 기능 유지, 모델/리소스 점검",
      "테이블 없음(relation does not exist): 보강 SQL(90/91) 멱등 재적용 후 재기동",
      "DB 연결 포화: Hikari max-pool=3 — 동시 부하 시 풀 상향 검토",
      "2FA 메일 미발송: 메일 설정 확인, 미설정 시 LogMailSender 로그에서 코드 확인",
      "계정 잠금 누적: 권한관리에서 사용자 잠금 해제"
    ]},
    {"title":"8. 보안 운영", "bullets":[
      "외부 API 호출 0 — Ollama·메일(내부)만 사용",
      "자격증명·비밀번호·내부IP·JWT 시크릿은 응답/로그/문서에 노출 금지",
      "2FA verify-token(purpose=2fa)은 보호 API 접근 불가 — 우회 차단 가드 유지",
      "RBAC 변경 API는 ADMIN/MANAGER 한정(백엔드 403) · 비밀번호 BCrypt 저장",
      "회원가입 승인대기·아이디찾기 마스킹·스택트레이스 미노출 정책 준수"
    ]}
  ]
}
