POSA_LEAKSMS/SYSTEM_OVERVIEW.md
cw2007 fb3630d868 docs: 문서 현행화(leak_ 접두사·경로 스크럽) + 코드 투어 + settings deny 수정
- 전 운영 문서 테이블명 leak_ 접두사 반영, 삭제된 마이그레이션 참조 정리,
  구경로 raspi_leck_detecter→<WEB_DIR> 스크럽(DEPLOYMENT_PLAN).
- docs/DEPLOYMENT_PLAN_RPI4x3.md(신규): 3대 Pi + 신규 서버 배포 로드맵.
- .tours/architect-full-system.tour(신규): 19스텝 전체 아키텍처 투어.
- README.md(루트, 0바이트였음): 시스템 인덱스.
- .claude/settings.local.json: /doctor 지적 deny 규칙 5건 수정
  (파이프 4건 와일드카드형, 포크밤 삭제) + 죽은 allow 항목 3건 정리.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01821XP36Q6t9eWKTPSEumnC
2026-07-02 18:52:15 +09:00

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 + 온도/습도 (leak_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 — 신규 설치는 이 파일 하나로 완결(테이블 전체 leak_ 접두사).
  • 대시보드: dashboard.php — leak_sensor_status/leak_sensor_metric/leak_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 (공백 없음).
  • 스키마(가산·멱등): leak_sensor_log.is_leak / leak_sensor_status.is_leak 컬럼, event_type 의 leak_alert/leak_recovery, leak_incident(사고 추적) + leak_photo(사진 메타) 테이블을 다시 추가했습니다. leak_sensor_metric(SHT30)은 그대로 보존합니다.
  • 수신: api/sensor_data.php 가 누수 이벤트를 받아 leak_sensor_log/leak_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(경보 후에만).

운영 적용 절차 (신규 설치)

  1. sql/schema_sht30.sql 1회 실행 — 이 파일 하나로 완결(누수 요소 포함, 테이블 전체 leak_ 접두사). (구버전 무접두 테이블 대상 마이그레이션 파일들은 v2607 테이블 리네임과 함께 폐기되었습니다.)
  2. 아래 서버 파일을 (재)배포: api/sensor_data.php, api/photo_upload.php, sms_send.php, dashboard.php, config.php.
  3. 쓰기 가능한 php/var/photos/ 디렉터리 확보(웹서버 사용자 쓰기 권한; 없으면 업로드 시 자동 생성 시도).
  4. 1번 모듈 raspberry_pi4/config_local.py 의 API_URL/PHOTO_UPLOAD_URL 을 이 통합 서버로, API_KEY 를 서버 config.local.php 의 API_KEY 와 동일하게 설정.