# 05 — 기존 누수 노드에 온습도(SHT30) 추가 마이그레이션 (USB 원샷) 이미 **설치·하드닝 완료**된 누수 전용 노드(Pi-A id=1, Pi-C id=3)를 **누수+온습도 결합 노드**로 전환하는 현장 마이그레이션 패키지. 신규 설치(02/04 폴더)와 달리 기존 누수 서비스·하드닝은 건드리지 않고 SHT30 온습도 서비스만 얹는다. **하나의 USB 로 두 노드 모두 사용 가능** (sensor_id·위치·API 키를 기존 설정에서 자동 추출). ## 전제 - 노드: Raspberry Pi 4, Raspberry Pi OS Bookworm, harden_pi.sh 적용 완료 (SSH 꺼짐 → 현장 모니터+키보드 작업, USB 반입) - 누수 서비스(leak-sensor) 정상 동작 중, `config_local.py` 존재 - 하드웨어: SHT30 을 I2C(3.3V, SDA=GPIO2, SCL=GPIO3)에 배선 (배선도: `deploy/02_pi_a_leak_id1/WIRING.html` 하단 SHT30 절 참고) ## 1. 빌드 PC에서 USB 준비 (인터넷 필요, 1회) ```bash cd deploy/05_migration_leak_add_sht30/sht30 bash vendor.sh # debs/ + wheelhouse/ 오프라인 번들 생성 ``` `05_migration_leak_add_sht30/` 폴더 **통째로** USB 에 복사. 번들 포함 확인: `sht30/debs/*.deb`, `sht30/wheelhouse/` 가 있어야 현장에서 네트워크 없이 설치된다(없으면 migrate.sh 가 경고 후 확인을 요구). ## 2. 현장 노드에서 실행 — 콘솔 전용 절차 (한 번에) 하드닝된 노드는 GUI·SSH 가 없다. 모니터+키보드 콘솔에서 아래 순서 그대로. USB 는 **FAT32 포맷 권장** (exFAT/NTFS 드라이버는 노드에 없을 수 있음). ```bash # ① 콘솔 로그인: 사용자 pi (하드닝 후에도 로컬 콘솔 로그인은 살아 있음) # ② USB 꽂고 장치 이름 확인 — 콘솔은 자동 마운트가 없다 lsblk -f # 보통 sda1 로 보임 (SIZE·FSTYPE=vfat 으로 USB 인지 확인. SD 루트는 mmcblk0) # ③ 수동 마운트 sudo mkdir -p /mnt/usb sudo mount /dev/sda1 /mnt/usb # ②에서 확인한 장치명으로 # ④ 마이그레이션 실행 (USB에서 직접 실행 — noexec 이어도 bash 호출이라 무관) cd /mnt/usb/05_migration_leak_add_sht30 sudo bash migrate.sh # ⑤ 스크립트가 끝에 안내하는 내용 확인: # - "마이그레이션 완료" + 서비스 실행 중 → ⑥으로 # - "재부팅 하세요" (I2C 첫 활성화) → ⑥ 후 sudo reboot # ⑥ USB 분리 cd / sudo umount /mnt/usb # 뽑기 전 반드시 umount ``` 재부팅한 경우 부팅 후 자동 시작 확인: ```bash systemctl status sht30-sensor # active (running) 이면 완료 journalctl -u sht30-sensor -n 20 # 10분 주기 보고 로그 확인 ``` 문제 시(서비스 fail 등) SSH 가 없으므로 같은 콘솔에서 `journalctl -u sht30-sensor -e` 로 원인 확인 — 롤백 절차는 아래 참고. migrate.sh 가 자동으로: 1. 기존 누수 설치 경로 탐지(leak-sensor.service → `/home/pi/raspberry_pi4` 폴백) 2. 기존 `config_local.py` 에서 API_URL·API_KEY·위치·sensor_id 추출 → `/home/pi/sht30/config_local.py` 자동 생성(**동일 sensor_id**, 10분 주기, 600 권한) 3. 오프라인 설치(I2C 활성화, venv, smbus2 등) — `sht30/install.sh` 재사용 4. systemd `sht30-sensor` 등록·기동(샌드박스 유닛 그대로) 5. I2C 인식(0x44/0x45)·서비스 상태 검증 I2C 를 처음 켠 노드는 마지막에 **재부팅 안내**가 나온다 → `sudo reboot` (서비스는 부팅 시 자동 시작). ## 3. 확인 - 노드: `systemctl status sht30-sensor`, `journalctl -u sht30-sensor -n 20` - 서버 대시보드(실시간 현황): 해당 번호 센서 카드에 **누수·온습도 칩이 함께** 표시되고 온도/습도 수치·24h 스파크라인이 보이면 정상 - 서버 `config.local.php`: `'METRIC_SENSOR_IDS' => [1, 2, 3]` 에 해당 id 포함 확인 ## 롤백 ```bash sudo systemctl disable --now sht30-sensor sudo rm /etc/systemd/system/sht30-sensor.service && sudo systemctl daemon-reload sudo rm -rf /home/pi/sht30 ``` 누수 서비스는 처음부터 독립이므로 영향 없다. ## 폴더 구성 ``` 05_migration_leak_add_sht30/ ├── README.md 이 문서 ├── migrate.sh 원샷 마이그레이션 스크립트 (sudo bash migrate.sh) └── sht30/ SHT30 서비스 페이로드 (02/04 의 sht30 모듈과 동일 소스) ├── install.sh I2C·venv·오프라인 패키지 설치 (migrate.sh 가 호출) ├── vendor.sh 빌드 PC용 오프라인 번들 생성 → debs/ wheelhouse/ ├── config_local.example.py 참고용 — 실파일은 migrate.sh 가 자동 생성 ├── sht30_sensor.py / sht30_driver.py / wire.py ├── test_sensor.py / test_connection.py └── systemd/sht30-sensor.service (경로는 migrate.sh 가 치환) ```