server:
  port: 8080

spring:
  application:
    name: webrtc-signal-server

  # ============ 持久化 ============
  # 存储模式：jpa=使用 MySQL（生产）；memory=纯内存（测试/演示）
  config:
    activate:
      on-profile: default
  storage:
    mode: ${STORAGE_MODE:jpa}

  # MySQL 数据源（敏感信息全部走环境变量，禁止硬编码）
  datasource:
    url: ${DB_URL:jdbc:mysql://175.178.213.60:33306/webrtc_signal?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true}
    username: ${DB_USERNAME:root}
    password: ${DB_PASSWORD:fanhuitong}
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      # 首次部署自动建表；生产可改为 validate 并改用 Flyway/Liquibase 管理 schema
      ddl-auto: ${JPA_DDL_AUTO:update}
    show-sql: false
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQLDialect
        jdbc:
          time_zone: UTC

  # Redis：在线状态、频控计数、nonce 去重、踢线广播
  data:
    redis:
      host: ${REDIS_HOST:175.178.213.60}
      port: ${REDIS_PORT:26379}
      password: ${REDIS_PASSWORD:fanhuitong}
      database: ${REDIS_DATABASE:15}
      timeout: 3000ms
      lettuce:
        pool:
          max-active: 16
          max-idle: 8
          min-idle: 2
          max-wait: 2000ms

redis:
  # 频控/nonce 等计数键前缀与默认 TTL（秒）
  key-prefix: "webrtc:"
  online-key-prefix: "webrtc:online:"
  flush-key-prefix: "webrtc:flush:"

security:
  jwt:
    # 开发环境固定默认密钥（至少 32 字节），避免随机密钥导致重启后所有 token 失效。
    # 【生产环境必须通过环境变量 JWT_SECRET 覆盖为强随机值】
    secret: ${JWT_SECRET:dev-only-fixed-jwt-secret-please-change-32b+}
    issuer: webrtc-signal-server
    # 访问令牌有效期（秒），默认 15 分钟
    access-token-ttl-seconds: 900
    # 刷新令牌有效期（秒），默认 7 天
    refresh-token-ttl-seconds: 604800
    # 被控端设备访问令牌有效期（秒），默认 15 分钟
    device-token-ttl-seconds: 900
    # 允许的时钟偏移（秒）
    clock-skew-seconds: 60

  device:
    # 设备激活（provision）共享密钥：被控端为系统签名应用，内置同一密钥用于 HMAC 签名。
    # 【生产环境必须通过环境变量 DEVICE_PROVISION_SECRET 覆盖】
    provision-secret: ${DEVICE_PROVISION_SECRET:dev-device-provision-secret-change-me}
    # 激活请求时间戳允许的偏移（秒），用于防重放
    provision-skew-seconds: 300
    # 是否启用 SN 白名单：启用后仅允许已导入白名单的 SN 激活
    sn-allowlist-enabled: ${DEVICE_SN_ALLOWLIST_ENABLED:false}

  account:
    # 是否开放自助注册接口
    registration-enabled: ${ACCOUNT_REGISTRATION_ENABLED:true}
    # 登录失败锁定阈值与锁定时长（秒）
    max-failed-attempts: 5
    lock-duration-seconds: 900
    # 单账号最大并发会话数，超出时踢掉最旧会话
    max-concurrent-sessions: 5

  # 后台管理员配置（独立于普通用户体系，使用单独数据库表 admin_account）
  admin:
    # 初始管理员引导：当管理员表为空时，按以下用户名/密码自动创建首个管理员。
    # 可通过环境变量 ADMIN_BOOTSTRAP_USERNAME / ADMIN_BOOTSTRAP_PASSWORD 覆盖。
    # 若两者均留空，则不自动创建，需通过管理接口建立首个管理员。
    bootstrap-username: ${ADMIN_BOOTSTRAP_USERNAME:admin}
    bootstrap-password: ${ADMIN_BOOTSTRAP_PASSWORD:admin123456}
    # 管理员令牌有效期（秒），默认 1 小时
    token-ttl-seconds: 3600

  websocket:
    # WebSocket 允许的来源，逗号分隔；生产环境应收敛为具体域名
    allowed-origins: ${WS_ALLOWED_ORIGINS:*}

  # TURN 短期凭证（RFC 7635 风格）：为 PeerConnection 提供中继能力
  turn:
    # 是否启用 TURN 凭证发放
    enabled: ${TURN_ENABLED:false}
    # TURN 共享密钥（HMAC key），【生产环境必须通过环境变量 TURN_SHARED_SECRET 覆盖】
    shared-secret: ${TURN_SHARED_SECRET:}
    # TURN 服务器地址，逗号分隔，如 turn:turn.ttstd.com:3478?transport=udp
    urls: ${TURN_URLS:}
    # 短期凭证有效期（秒）
    ttl-seconds: ${TURN_TTL_SECONDS:3600}

  # 配对码有效期（秒），默认 10 分钟
  pairing:
    ttl-seconds: ${PAIRING_TTL_SECONDS:600}

logging:
  level:
    com.ttstd.signaling: DEBUG
    org.springframework.web.socket: DEBUG
