3번째 Pi(신규 지점, 누수+카메라)를 코드 수정 없이 배포 가능하게: - raspberry_pi4/config.py: config_local.py 에서 SENSORS 오버라이드 허용 + fail-closed 형식 검증(id 1..255/gpio/name, 중복 금지) — 오설정으로 기본 sensor_id 1 로 조용히 기동해 타 지점 상태를 덮어쓰는 사고 방지. - REPORT_INTERVAL 3600→600: 서버 HEARTBEAT_TIMEOUT_SEC(1200) 절반 — 기존 하트비트 오탐(매시간 오프라인/복귀 SMS) 해소. - php/config.php LEAK_SENSOR_IDS 상수(기본 [1], 1..255 정규화·빈값 복귀). - php/dashboard.php: 누수 카드 sensor_id===1 하드코딩 → LEAK_SENSOR_IDS 루프. - php/api/sensor_data.php: periodic 보고 전면 skip_log(누수 노드 증가 시 이벤트 로그 창 보존) + CORS 헤더 제거(서버간 POST 전용, 도메인 지문 노출 차단). - test_connection.py(양 모듈): 하드코딩 sensor_id 제거→기기 SENSORS 기반, 서명 200 실패 시 exit 1(setup.sh 원샷 게이트용). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01821XP36Q6t9eWKTPSEumnC
67 lines
3.4 KiB
PHP
67 lines
3.4 KiB
PHP
<?php
|
|
// =============================================================================
|
|
// config.local.example.php - v2606 (SHT30 온습도) 운영 설정 예시
|
|
//
|
|
// 1. 이 파일을 config.local.php로 복사합니다.
|
|
// 2. 실제 운영 값으로 교체합니다.
|
|
// 3. config.local.php는 서버에만 보관하고 공유하지 않습니다.
|
|
// =============================================================================
|
|
|
|
return [
|
|
'DB_HOST' => 'localhost',
|
|
'DB_PORT' => 3306,
|
|
'DB_NAME' => 'your_db_name',
|
|
'DB_USER' => 'your_db_user',
|
|
'DB_PASS' => 'your_db_password',
|
|
|
|
'API_KEY' => 'replace-with-long-random-secret',
|
|
|
|
// 요청 서명은 HMAC-SHA256(키=API_KEY, 메시지=요청본문 바이트)이며 X-Signature 헤더로
|
|
// 전송된다. 레거시 키-접두 sha256 폴백은 기본 비활성이고, 운영(STM32 HMAC 전용)에서는
|
|
// 반드시 false 로 둔다. 과거 RPi(레거시) 클라이언트가 아직 남아 있을 때만 true 로 켠다.
|
|
'ALLOW_LEGACY_BODY_SIGNATURE' => false,
|
|
|
|
'SMS_USER_ID' => 'your-cafe24-sms-user-id',
|
|
'SMS_SECURE' => 'your-cafe24-sms-secure-key',
|
|
'SMS_SENDER' => '01000000000',
|
|
'SMS_RECIPIENTS' => [
|
|
'01000000000',
|
|
],
|
|
|
|
'ADMIN_USER' => 'admin',
|
|
'ADMIN_PASSWORD_HASH' => '$2y$10$replace.with.password_hash.output',
|
|
// Base32 TOTP secret. MUST be left EMPTY here and set to a UNIQUE generated value in
|
|
// config.local.php. Empty '' => admin_mfa_configured() is false => login is DISABLED
|
|
// (fail-closed) until a real secret is set. NEVER put a literal Base32 string in this
|
|
// example file: any non-empty Base32-ish value (even "REPLACE_WITH_...") decodes to a
|
|
// usable, publicly-known TOTP secret and silently enables MFA on a known seed.
|
|
// Generate a unique secret on the server only:
|
|
// php -r "require 'php/admin_security.php'; echo admin_totp_secret().PHP_EOL;"
|
|
'ADMIN_TOTP_SECRET' => '',
|
|
// Temporary bootstrap token for setup_mfa.php. Remove or empty after MFA enrollment.
|
|
'MFA_SETUP_TOKEN' => 'replace-with-temporary-random-token',
|
|
|
|
// 누수 모듈 sensor_id 목록 — 대시보드 누수 상태 카드 표시 대상 (기본 [1]).
|
|
// 신규 누수 지점(예: Pi-C, sensor_id 3) 투입 시: [1, 3]
|
|
'LEAK_SENSOR_IDS' => [1],
|
|
|
|
// 온습도 임계 경보 (서버 판정 → SMS). 운영 환경에 맞게 조정.
|
|
'METRIC_TEMP_HIGH_C' => 27, // 고온 임계(℃)
|
|
'METRIC_TEMP_LOW_C' => 10, // 저온 임계(℃)
|
|
'METRIC_RH_HIGH' => 60, // 고습 임계(%)
|
|
'METRIC_RH_LOW' => -1, // 저습 경보 비활성(RH 는 항상 ≥0 → 절대 발화 안 함)
|
|
'METRIC_DEWPOINT_MARGIN_C' => 0, // 결로(이슬점) 경보 비활성(0 이면 판정 분기 스킵)
|
|
'METRIC_ALERT_COOLDOWN_SEC' => 1800, // 동일 종류 경보 재발송 억제(초, 기본 30분)
|
|
|
|
// 미복귀 경보 2차(야간) 에스컬레이션 수신자. 비우면 비활성(opt-in).
|
|
'SMS_RECIPIENTS_TIER2' => [],
|
|
'ESCALATE_AFTER_SEC' => 1800, // 경보 미복귀 30분 후 2차 통지
|
|
// 아래는 기본값으로 동작(필요 시에만 override):
|
|
// SMS_BALANCE_WARN_THRESHOLD(30건), HEALTH_SMS_HOUR(9시),
|
|
// STUCK_DETECT_SAMPLES(6), SMS_RETRY_OFFLINE(true)
|
|
|
|
'SMS_LOG_RETENTION_DAYS' => 365,
|
|
'SENSOR_LOG_RETENTION_DAYS' => 365,
|
|
'SENSOR_METRIC_RETENTION_DAYS' => 365,
|
|
'ADMIN_AUDIT_RETENTION_DAYS' => 365,
|
|
];
|