# 릴리스 노트 — Web Configurator **v1.11.16** - **배포일**: 2026-06-23 - **대상**: 디바이스 BSP 이미지 포함용 (DP World Smart Solutions · IoT 디바이스) - **패키지**: 내부 git 태그 `v1.11.16` (커밋 히스토리가 없는 **클린 스냅샷**) - **이전 버전**: v1.11.15 --- ## 1. 한눈에 보기 이번 릴리스는 **배포 패키지 정비 릴리스**입니다. 앱 기능·디바이스 계약·UI는 v1.11.15와 동일하며, 다음 두 가지를 정비했습니다. 1. **MemoryMax 상향** (`48M → 128M`) — 운영 중 OOM-kill 위험 제거. 2. **BSP 통합 가이드 정비** — 네트워크-적용 하드닝 스크립트의 권장 통합 방식을 **"펌웨어 원본 스크립트 직접 교체(BSP 베이킹)"** 를 1차 방식으로 재구성. - Python 3 **표준 라이브러리(stdlib)만** 사용 — 외부 pip 패키지 없음 - systemd 유닛 포함, nginx 설정은 optional sample → **이미지에 바로 포함 가능** - 기존 디바이스 DB는 **부팅 시 자동 변환**(1회, 멱등) — 수동 작업 불필요 --- ## 2. 주요 변경 (v1.11.15 → v1.11.16) | 항목 | 변경 | |---|---| | **MemoryMax** | `web-configurator.service` 의 `MemoryMax` 를 **48M → 128M** 로 상향. 48M는 support-bundle(진단 zip, 메모리 빌드)과 UI 동시 사용 시 실측 피크 ~40-50MB로 OOM-kill 위험이 있었음. 128M = 실피크 ~2.5x 여유 + 누수 방지 캡 유지 (장비 RAM 3.4GB 대비 3.7%). | | **BSP 통합 방식 1차 = 직접 교체** | 네트워크-적용 하드닝본을 **`/usr/bin/dpworld-network-apply.sh` 원본 이름으로 교체 설치**하는 것을 BSP 베이킹의 기본 방식으로 명시. `.service.d` override 드롭인은 **라이브 디바이스 후적용(over-the-top) fallback** 으로 강등. (자세히 `BSP-INTEGRATION.md` §7 + `docs/firmware-boot-hardening.md`) | | 패키지 구성 정리 | 배포물을 repo 루트(flat)로 정리, 내부 전용 참조/링크 정돈. 런타임 코드 변경 없음. | > 앱 코드 자체는 **v1.11.15와 동일**합니다 (UI/기능 무변경). 본 릴리스는 배포 단위의 > 메모리 정책 + 통합 가이드 정비입니다. --- ## 3. 네트워크-적용 하드닝 — 통합 방식 (중요) 디바이스 펌웨어는 다음 base 구성을 제공합니다(firmware-native): - `dpworld-network-apply.service` / `dpworld-network-seed.service` (유닛) - `/usr/bin/dpworld-network-apply.sh` (base 스크립트) 이 base 스크립트에는 WiFi 국가 코드 변경 시 `modprobe -r wlan` 으로 모듈을 라이브 재로드하는 경로가 있어, QCA6490(cnss_pci)에서 **PMU 워치독 재부팅 루프**를 유발한 이력이 있습니다. 본 패키지의 `dpworld-network-apply-hardened.sh` 가 이 문제를 제거한 **완전 대체본**입니다. **① 권장 — BSP 베이킹(직접 교체):** 펌웨어 이미지를 빌드하는 협력사는 `deploy/dpworld-network-apply-hardened.sh` 의 내용을 **`/usr/bin/dpworld-network-apply.sh` 원본 이름으로 설치**(펌웨어 원본 교체)하면 됩니다. base 서비스/시드 유닛이 이미 그 경로를 호출하므로 apply·`--boot` 모두 자동으로 하드닝 동작을 탑니다. **드롭인은 베이킹하지 않습니다.** **② Fallback — 라이브 후적용(override):** 이미 구워진 디바이스에 펌웨어 교체 없이 얹을 때만, 하드닝본을 별도 파일로 두고 `dpworld-network-apply.service.d/` + `dpworld-network-seed.service.d/` 드롭인으로 ExecStart를 교체합니다. (우리 개발용 `scripts/deploy.ps1` 가 이 방식을 사용) → 단계별 절차는 `docs/firmware-boot-hardening.md` "펌웨어 베이킹 (BSP) — 원본 교체 방법" 참조. --- ## 4. 호환성 · 주의사항 - **디바이스 적용 시점**: dpworldapp 재시작 시 새 계약값으로 config가 재적용됩니다. - **nginx optional**: `deploy/nginx.conf`는 BSP에서 `:80` reverse proxy를 제공할 때 쓰는 sample입니다. `scripts/deploy.ps1`는 nginx를 설치/수정하지 않으며, 디바이스가 앱을 `:9090`으로 직접 접근하면 없어도 됩니다. sample을 쓸 경우 `proxy_pass`를 앱 포트 `:9090`으로 맞추세요. - **런타임 의존성**: python3 stdlib만 필요 (RDEPENDS 목록은 `BSP-INTEGRATION.md` 참조). 외부 패키지 없음. - **dpworldapp**(텔레메트리 바이너리)는 firmware-native. --- ## 5. 배포 방법 (BSP) 1. **패키지 입수**: 내부 git 태그 `v1.11.16` (또는 동봉 스냅샷) 2. **레시피 작성**: `BSP-INTEGRATION.md`의 샘플 bitbake recipe + 설치 경로표 사용 - `src/` → `/opt/web-configurator/src/` - `deploy/*.service` → systemd 유닛 디렉토리 - `deploy/dpworld-network-apply-hardened.sh` → **`/usr/bin/dpworld-network-apply.sh`** (펌웨어 원본 교체, §3 ①) - `deploy/nginx.conf` → optional nginx sample site config - `web-configurator.service` enable 3. **검증**: 이미지 부팅 후 `systemctl status web-configurator` + `curl http://127.0.0.1:9090/` --- ## 6. 품질/검증 - v1.11.16 변경은 **앱 로직 무변경** — systemd 서비스 메모리 캡(MemoryMax) + 문서/주석/버전 문자열뿐입니다. 기능 동등 기준선 **v1.11.15**는 내부 테스트 스위트(Python + 프런트 `.mjs`)로 검증되었습니다. - 테스트 스위트는 내부 저장소에서 관리되며 **본 배포물에는 포함되지 않습니다**. - 패키지는 **커밋 히스토리 없음**(`git archive` 스냅샷) + 내부 분석/개발 자료 제외 (`DELIVERABLE-MANIFEST.txt` 참조). --- ## 7. 롤백 - BSP recipe의 버전 핀(태그/SRCREV)을 **v1.11.15**로 되돌리면 이전 버전 배포. - 마이그레이션은 **멱등 + 변경 전 자동 백업**(config_safety)으로 보호됩니다. --- ## 버전 이력 (요약) | 버전 | 일자 | 요약 | |---|---|---| | **v1.11.16** | 2026-06-23 | MemoryMax 48M→128M + BSP 베이킹(직접 교체) 가이드 1차 정비 (앱 기능 무변경) | | v1.11.15 | 2026-06-23 | 사이드바 System 그룹 monitor 아이콘 정리 | | v1.11.14 | 2026-06-23 | 사이드바 부모 그룹(System=Dashboard+Log / Firmware) 재편 | | v1.11.11 | 2026-06-23 | config 쓰기 경로를 디바이스 config-reader 계약에 정렬 + 자동 마이그레이션 | | v1.11.10 | 2026-06-20 | 전체 코드리뷰 fix (37건) |