server: port: 8011 spring: application: name: guardia-mall datasource: url: ${DB_URL:jdbc:postgresql://localhost:5432/mall_db} username: ${DB_USER:mall_user} password: ${DB_PASS:mall_pass2026} driver-class-name: org.postgresql.Driver # UIWS 이식: 부팅 시 91_uiws_port.sql(업무 9테이블 + mall_account 2FA ALTER) 멱등 적용. # 전부 IF NOT EXISTS / ADD COLUMN IF NOT EXISTS / ON CONFLICT DO NOTHING → mode:always 재실행 안전. # schema.sql 은 deploy_server 가 psql 로 별도 적용(비멱등 시드 충돌 회피 위해 여기 미포함). sql: init: mode: ${SQL_INIT_MODE:always} schema-locations: classpath:db/91_uiws_port.sql,classpath:db/92_uiws_system.sql,classpath:db/93_auth_otp.sql,classpath:db/104_seed_ai_config.sql,classpath:db/202_ai_provider_claude.sql continue-on-error: true servlet: multipart: max-file-size: 20MB max-request-size: 20MB mybatis: mapper-locations: classpath:mapper/**/*.xml # ** : 하위 mapper/uiws/*.xml(UIWS 이식) 포함 configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl springdoc: api-docs: path: /api/mall/docs swagger-ui: path: /api/mall/swagger mall: # 외부 게이트웨이 어댑터 선택 — 기본 mock(개발/데모 외부호출 0). 운영 시 환경변수로 오버라이드. payment: provider: ${MALL_PAYMENT_PROVIDER:mock} # mock | stripe tax: provider: ${MALL_TAX_PROVIDER:mock} # mock | taxjar | avalara address: provider: ${MALL_ADDRESS_PROVIDER:mock} # mock | google | smarty sms: provider: ${MALL_SMS_PROVIDER:mock} # mock | twilio email: provider: ${MALL_EMAIL_PROVIDER:mock} # mock | sendgrid # ── UIWS 이식: 2FA(운영 로그인) + 첨부 업로드 설정 (mall.uiws.*) ────────────── uiws: auth: twofa-enabled: ${UIWS_2FA:true} # off=운영 로그인도 단일 JWT(회귀 0). 고객(USER)은 항상 미적용. verify-token-validity-seconds: 300 # 1차 통과 후 verify-token 5분 email-code-validity-seconds: 300 # 이메일 인증코드 5분 max-login-fail: 5 # 실패 5회 시 운영 계정 잠금 mail: mode: ${UIWS_MAIL_MODE:log} # LogMailSender 폴백(외부 API 0). smtp 는 설정 시만. upload: upload-dir: ${UIWS_UPLOAD_DIR:./uploads/uiws} guardia: itsm-url: ${ITSM_URL:http://localhost:9001} erp-url: ${ERP_URL:http://localhost:8003} crm-url: ${CRM_URL:http://localhost:8004} ocr-url: ${OCR_URL:http://localhost:8005} ollama-url: ${OLLAMA_URL:http://localhost:11434} ollama-text-model: ${OLLAMA_TEXT_MODEL:llama3.2:1b} # 로컬 임베디드 DuckDB 학습 저장소 파일(솔루션 격리). 경로 미가용/드라이버 부재 시 자동 비활성(no-op). mall: learning: duckdb-path: ${MALL_LEARNING_DUCKDB:/opt/guardia-mall/data/mall_learning.duckdb} # 중앙 guardia-rag(온프레미스 전용) — 최신 AI 기법 경유. 미가용 시 Mall 로컬 폴백(degraded) rag: base-url: ${RAG_URL:http://127.0.0.1:8020} timeout-ms: ${RAG_TIMEOUT_MS:120000} enabled: ${RAG_ENABLED:true} solution: mall crypto: secret: ${CRYPTO_SECRET:guardia-mall-aes-256-gcm-master-key-2026-zioinfo} jwt: secret: ${JWT_SECRET:guardia-mall-jwt-secret-2026-minimum-256bit-key-zioinfo} expiration: 86400000 logging: level: com.zioinfo.mall: DEBUG org.mybatis: WARN