# 시스템 전체 구성 — 하나의 모니터링 시스템 (Module 1 + Module 2 → cafe24 서버 → 대시보드) 서버실 모니터링은 **두 개의 Raspberry Pi 4 센서 모듈**이 각각 cafe24 서버로 측정/이벤트를 보고하고, 서버가 이를 저장·판정(SMS)·**대시보드 표시**하는 하나의 시스템입니다. ``` ┌─────────────────────────────┐ │ 1번 모듈 (누수 + 카메라) │ GPIO 누수감지 + Pi Camera 촬영 │ raspberry_pi4/ │──┐ leak_alert / leak_recovery + 사진 업로드 │ Raspberry Pi 4 + Python │ │ X-Signature(HMAC-SHA256) + photo_upload.php └─────────────────────────────┘ │ ▼ HTTPS POST ┌─────────────────────────────┐ ┌──────────────────────────────┐ │ 2번 모듈 (온습도 SHT30) │ │ cafe24 서버 (php/) │ │ raspberry_pi4_sht30/ │─►│ api/sensor_data.php (수신) │ │ Raspberry Pi 4 + Python │ │ api/photo_upload.php (사진) │ └─────────────────────────────┘ │ → MySQL 저장 / 임계·누수 SMS │ HTTPS POST │ → dashboard.php (통합 대시보드)│ X-Signature(HMAC-SHA256) └──────────────────────────────┘ ``` 두 모듈 모두 동일한 raw-body `X-Signature`(HMAC-SHA256) 서명으로 **같은 서버**에 보고합니다(통합 완료). ## 모듈 매핑 | 구분 | 폴더 | 보드 | 센서 | sensor_id | 서버 보고 | |---|---|---|---|---|---| | **1번 모듈** | `raspberry_pi4/` | Raspberry Pi 4 | e-con 5C-08 누수 + Pi Camera | 1 | `leak_alert`/`leak_recovery`/`periodic` + `photo_upload.php` | | **2번 모듈** | `raspberry_pi4_sht30/` | Raspberry Pi 4 | SHT30 온습도 (I2C) | 2 | `startup`/`periodic` + 온도/습도 (`sensor_metric`) | 두 모듈 모두: - 비밀값은 `config_local.py`(미커밋)에만 — `cp config_local.example.py config_local.py` 후 채움. - 폐쇄망(air-gapped) 설치 지원 — `vendor.sh`(빌드 머신) → 번들 전송 → `install.sh`(오프라인). - `systemd` 유닛으로 부팅 자동 실행. - "업로드 + config_local 채우기 + install.sh + systemd enable" 만 하면 운영 가능. ## 서버 (cafe24 `php/`) - 웹 루트(예): `public_html/raspi_leck_detecter/` — `docs/INSTALL_PI_SERVER.md` 참고. - DB 스키마: `sql/schema_sht30.sql` (신규) 또는 `sql/migration_drop_leak.sql` (전환). - 대시보드: `dashboard.php` — `sensor_status`/`sensor_metric`/`sms_log` 표시, 기본 차트 sensor 2. - 인증: `X-Signature = HMAC-SHA256(API_KEY, raw_body)`. 모든 모듈의 `API_KEY` = 서버 `config.local.php` 의 `API_KEY`. --- ## ✅ 1번 모듈(누수) 서버 통합 상태 — 단일 서버로 통합 완료 (Option 2 구현됨) 이전에 "운영 전 결정 필요"로 남겨 두었던 두 선택지 중 **2번(단일 서버로 통합)** 을 구현했습니다. 이제 **두 모듈 모두** 이 repo 의 `php/` 서버로 동일한 `X-Signature`(HMAC-SHA256) 서명으로 보고하고, 하나의 대시보드(`dashboard.php`)에서 **누수 상태/사진 + 온습도**를 함께 봅니다. 구현 내용: - **서명 통일:** 1번 모듈을 raw-body `X-Signature` HMAC 으로 전환했습니다(2번 모듈과 동일 스킴). 본문 JSON 을 고정 필드 순서 문자열로 만들어 그 바이트에 서명하고 그대로 POST 합니다. (구버전의 `sha256(API_KEY + 정렬 JSON)` body-field 서명은 폐기 — 서버 기본 설정이 거부.) 사진 업로드 서명 canonical = `device_id|sensor_id|log_id|timestamp` (공백 없음). - **스키마(가산·멱등):** `sensor_log.is_leak` / `sensor_status.is_leak` 컬럼, `event_type` 의 `leak_alert`/`leak_recovery`, `leak_incident`(사고 추적) + `leak_photo`(사진 메타) 테이블을 다시 추가했습니다. `sensor_metric`(SHT30)은 그대로 보존합니다. - **수신:** `api/sensor_data.php` 가 누수 이벤트를 받아 `sensor_log`/`sensor_status` 갱신, `leak_incident` 개시/종료, `leak_alert` 응답에 `log_id` 반환. SHT30 측정 경로는 100% 유지. - **사진:** 새 `api/photo_upload.php` (서명·신선도·MIME(finfo)·크기 상한·서버 생성 무작위 파일명). - **SMS:** `sms_send.php` 에 `send_leak_alert_sms`(쿨다운) / `send_leak_recovery_sms`(경보 후에만). ### 운영 적용 절차 (기존 SHT30 서버에 누수 통합) 1. 기존 서버에서 **`sql/migration_add_leak.sql` 1회 실행**(가산·멱등 — 운영 데이터 보존, 재실행 안전). 신규(통합) 설치는 `sql/schema_sht30.sql` 하나만 실행하면 됩니다(이미 누수 요소 포함). 2. 아래 서버 파일을 (재)배포: `api/sensor_data.php`, `api/photo_upload.php`, `sms_send.php`, `dashboard.php`, `config.php`, `sql/migration_add_leak.sql`. 3. **쓰기 가능한 `php/var/photos/`** 디렉터리 확보(웹서버 사용자 쓰기 권한; 없으면 업로드 시 자동 생성 시도). 4. 1번 모듈 `raspberry_pi4/config_local.py` 의 `API_URL`/`PHOTO_UPLOAD_URL` 을 이 통합 서버로, `API_KEY` 를 서버 `config.local.php` 의 `API_KEY` 와 동일하게 설정.