'mysql:host=localhost;dbname=move_detect;charset=utf8mb4', 'db_user' => 'CHANGEME', 'db_pass' => 'CHANGEME', 'snapshot_dir' => __DIR__ . '/storage/snapshots', // Every key App\Config reads is listed, defaults included. They all have `?? default` // fallbacks, so an omitted key is silently absent rather than an error — an operator // who never sees it here cannot know the knob exists. 'nonce_ttl' => 86400, 'timestamp_window' => 300, 'rate_limit_per_min' => 60, 'ingest_ip_rate_limit_per_min' => 300, // PIPA retention: worker snapshots are purged after this many days (0 disables). 'snapshot_retention_days' => 7, 'event_retention_days' => 0, // 0 = 이벤트 기록 영구 보존 (안전사고 기록; 스냅샷만 만료) // --- 통보 (tools/dispatch_alerts.php) -------------------------------------------- // 대시보드의 외부 접속 주소. 알림 메시지의 사건 링크에 쓰인다. 비어 있으면 디스패처가 // 실행을 거부한다 — 열리지 않는 링크가 담긴 알림을 보내는 것보다 낫다. 'public_base_url' => '', // 예: 'https://example.com/move_detect' // 위급/높음 이벤트가 이 시간(초) 동안 미확인이면 unacked_escalation 이벤트를 발행한다. 'escalate_after_seconds' => 300, // 장치 건전성 판정 (App\Alert\DeviceHealthWatch). 엣지는 이 두 이벤트를 스스로 못 낸다 — // 죽은 노드는 자기가 죽었다고 신고할 수 없다. 하트비트의 부재로만 관측된다. 'device_stale_seconds' => 180, // 이만큼 무소식이면 device_fault 'degraded_sustain_seconds' => 300, // 성능 저하가 이만큼 지속되면 monitoring_degraded 'degraded_fps_ratio' => 0.6, // target_fps 의 이 비율 미만이면 저하 'target_fps' => 12.0, // 엣지 TARGET_FPS 와 맞출 것 // 통보 메시지의 시각 표기 기준. 대시보드는 브라우저 시각을 쓰지만 알림 메일은 PHP 가 // 만들고, 공유호스팅은 date.timezone 이 UTC 인 경우가 흔하다 — 콘솔이 13:01 로 보여준 // 넘어짐을 메일이 04:01 로 적으면 응급 대응에서 그대로 사고가 된다. 'timezone' => 'Asia/Seoul', // --- 보존 / 용량 ------------------------------------------------------------------ // 하트비트 시계열 보존일. 장치당 하루 약 2,880행이 쌓인다 (tools/prune.php 가 정리). 'metric_retention_days' => 30, // 스냅샷 볼륨 여유 공간 하한(MB). 밑돌면 device_fault 로 알린다. 0 = 검사 안 함. 'storage_min_free_mb' => 200, ];