2번 모듈 신규(raspberry_pi4_sht30/): SHT30 온습도 → cafe24, raw-body X-Signature HMAC, 폐쇄망 오프라인 설치(vendor/install), systemd, CRC/포맷 자가점검. firmware sht30_fw wire 포맷과 byte-parity 검증. 1번 모듈 통합(raspberry_pi4/): 누수+카메라를 동일 서버로. 레거시 sha256(key+json) body-sig → X-Signature HMAC 전환, 사진 canonical=device_id|sensor_id|log_id|timestamp. 서버 통합(php/): api/sensor_data.php 누수 이벤트 수신, api/photo_upload.php 신규(HMAC·finfo·서버생성 파일명·nonce 멱등·sensor 결속), photo.php 인증 사진서빙, dashboard.php 누수 패널+사진, sms_send.php 누수 SMS, config.php 태그/요약. DB: sql/migration_add_leak.sql(가산·멱등), schema_sht30.sql 통합 스키마. 보안 하드닝(외부 펜테스트 대비, 확정 CRITICAL/HIGH 0): cron_heartbeat api_key fail-closed, setup_mfa 부트스트랩 토큰 post-enrollment 잠금, var/ PHP 실행차단, HSTS. 문서/테스트: SYSTEM_OVERVIEW.md, security_hardening_test.php 갱신. 참고: 사용자 요청으로 세션 외 기존 미커밋 변경도 함께 포함. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.4 KiB
5.4 KiB
시스템 전체 구성 — 하나의 모니터링 시스템 (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-SignatureHMAC 으로 전환했습니다(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 서버에 누수 통합)
- 기존 서버에서
sql/migration_add_leak.sql1회 실행(가산·멱등 — 운영 데이터 보존, 재실행 안전). 신규(통합) 설치는sql/schema_sht30.sql하나만 실행하면 됩니다(이미 누수 요소 포함). - 아래 서버 파일을 (재)배포:
api/sensor_data.php,api/photo_upload.php,sms_send.php,dashboard.php,config.php,sql/migration_add_leak.sql. - 쓰기 가능한
php/var/photos/디렉터리 확보(웹서버 사용자 쓰기 권한; 없으면 업로드 시 자동 생성 시도). - 1번 모듈
raspberry_pi4/config_local.py의API_URL/PHOTO_UPLOAD_URL을 이 통합 서버로,API_KEY를 서버config.local.php의API_KEY와 동일하게 설정.