You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
7.6 KiB
166 lines
7.6 KiB
|
1 month ago
|
# IoT Web Configurator
|
||
|
|
|
||
|
|
> **파트너 전달 안내 (한글)** — 먼저 이 순서로 보세요:
|
||
|
|
> [`RELEASE-NOTES.md`](RELEASE-NOTES.md) (이번 버전·변경·주의·배포) →
|
||
|
|
> [`BSP-INTEGRATION.md`](BSP-INTEGRATION.md) (설치 경로·샘플 recipe·의존성) →
|
||
|
|
> [`DELIVERABLE-MANIFEST.txt`](DELIVERABLE-MANIFEST.txt) (패키지 구성).
|
||
|
|
|
||
|
|
IoT 디바이스 설정을 위한 웹 인터페이스를 제공하는 경량 Python stdlib HTTP 서버입니다.
|
||
|
|
원래 Java Spring Boot 애플리케이션이었으나, 순수 Python(stdlib만 사용)으로 재작성되어
|
||
|
|
메모리 사용량이 ~436 MB에서 10–30 MB로 줄었습니다. 모든 설정은 디바이스 내
|
||
|
|
SQLite 데이터베이스(`board_config` 테이블)에 저장됩니다.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 저장소 구조
|
||
|
|
|
||
|
|
| 경로 | 설명 |
|
||
|
|
|---|---|
|
||
|
|
| `src/` | 애플리케이션 소스 — 서버, DB 매니저, 유효성 검사기, 로그 매니저, 네트워크 적용 엔진(`src/network/`), 펌웨어 OTA(`src/firmware/`), Wi-Fi AP(`src/network/ap_*`), 프론트엔드 SPA(`src/static/js/pages/` 하위 ~18개 페이지 모듈) |
|
||
|
|
| `docs/` | 설계 문서, 사양서, 운영 가이드 (`docs/DEPLOY.md` 참조) |
|
||
|
|
| `scripts/` | 라이브 배포 도구 (`deploy.ps1`) |
|
||
|
|
| `CHANGELOG.md` | 버전 변경 이력 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 로컬 실행
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# From the repo root
|
||
|
|
python src/server.py
|
||
|
|
```
|
||
|
|
|
||
|
|
서버는 기본적으로 `0.0.0.0:8080`에 바인딩됩니다 (로컬 개발용). 환경 변수로 재정의할 수 있습니다:
|
||
|
|
|
||
|
|
| 변수 | 기본값 | 설명 |
|
||
|
|
|---|---|---|
|
||
|
|
| `HOST` | `0.0.0.0` | 바인딩 주소 |
|
||
|
|
| `PORT` | `8080` | 수신 포트 |
|
||
|
|
| `DB_PATH` | `/home/root/db/dynamic_data.db` | SQLite 데이터베이스 경로 |
|
||
|
|
| `LOG_DIR` | `/opt/log/dpworldapp` | 로그 파일 디렉터리 |
|
||
|
|
|
||
|
|
> **포트 안내:** `8080`은 로컬 개발 환경에서만 사용하는 기본값입니다. 디바이스에서는
|
||
|
|
> systemd 유닛(`deploy/web-configurator.service`)이 `PORT=9090`으로 설정하므로,
|
||
|
|
> 배포된 configurator는 **9090** 포트에서 수신합니다 — [docs/DEPLOY.md](docs/DEPLOY.md) §7 참조.
|
||
|
|
|
||
|
|
예시:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
PORT=8888 DB_PATH=./dev_data.db python src/server.py
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 배포
|
||
|
|
|
||
|
|
디바이스 배포는 `scripts/deploy.ps1` (PowerShell, Windows 개발 호스트)을 사용합니다.
|
||
|
|
전체 절차는 **[docs/DEPLOY.md](docs/DEPLOY.md)** 를 참조하세요. 다음 내용을 다룹니다:
|
||
|
|
|
||
|
|
- 버전 정책(`vMAJOR.MINOR.PATCH`) 및 릴리즈 절차
|
||
|
|
- 사전 요건 및 사용 방법
|
||
|
|
- 스크립트 동작 순서 (아카이브 → 전송 → 백업 → 교체 → 버전 스탬프 → 재시작 → 검증)
|
||
|
|
- 배포 검증 및 디바이스에서 `DEPLOYED_VERSION` 확인
|
||
|
|
- 롤백 (`-Rollback` 플래그)
|
||
|
|
- 디바이스 아키텍처 (포트, 경로, 서비스 이름)
|
||
|
|
- 문제 해결
|
||
|
|
|
||
|
|
빠른 참조:
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
.\scripts\deploy.ps1 192.168.55.56 # deploy a tagged release
|
||
|
|
.\scripts\deploy.ps1 192.168.55.56 -Rollback # restore last backup
|
||
|
|
```
|
||
|
|
|
||
|
|
`deploy.ps1`은 nginx를 설치하거나 수정하지 않습니다. `deploy/nginx.conf`는
|
||
|
|
`:80` 리버스 프록시를 통해 앱을 노출하는 제품을 위한 선택적 BSP 샘플일 뿐이며,
|
||
|
|
디바이스는 `:9090`으로 앱에 직접 접근할 수도 있습니다.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## API 엔드포인트
|
||
|
|
|
||
|
|
### 디바이스 설정
|
||
|
|
|
||
|
|
| 메서드 | 경로 | 설명 |
|
||
|
|
|---|---|---|
|
||
|
|
| `GET` | `/setting/get-device` | 디바이스 설정 읽기 (비어있으면 204 반환) |
|
||
|
|
| `POST` | `/setting/device` | 디바이스 설정 저장 |
|
||
|
|
| `GET` | `/setting/get-protocol` | 프로토콜 설정 읽기 (비어있으면 204 반환) |
|
||
|
|
| `POST` | `/setting/protocol` | 프로토콜 설정 저장 |
|
||
|
|
| `GET` | `/api/mac` | WiFi MAC 주소 읽기 |
|
||
|
|
|
||
|
|
### 로그 관리
|
||
|
|
|
||
|
|
| 메서드 | 경로 | 설명 |
|
||
|
|
|---|---|---|
|
||
|
|
| `GET` | `/setting/log-files` | 로그 파일 목록 조회 (크기, 수정 일시, 유형) |
|
||
|
|
| `GET` | `/setting/log-stats` | 로그 디렉터리 통계 |
|
||
|
|
| `POST` | `/setting/log-download` | 선택한 파일을 tar.gz로 다운로드 |
|
||
|
|
| `POST` | `/setting/log-compress` | 비활성 로그 파일 수동 압축 |
|
||
|
|
| `POST` | `/setting/log-delete` | 선택한 로그 파일 삭제 |
|
||
|
|
| `GET` | `/setting/kernel-bundle` | 커널 로그 번들 `.tar.gz` 다운로드 (journalctl 텍스트 내보내기 + `/opt/log` 커널 로그 + 부팅 이력 + pstore) — v1.1.0에서 추가 |
|
||
|
|
|
||
|
|
### 대시보드 / 모니터링
|
||
|
|
|
||
|
|
| 메서드 | 경로 | 설명 |
|
||
|
|
|---|---|---|
|
||
|
|
| `GET` | `/api/health` | 서버 상태 (가동 시간, DB 백엔드) |
|
||
|
|
| `GET` | `/api/system-status` | 홈 대시보드 페이로드 — 최상위 키: `core_app`, `communication`, `network`, `system` (v1.0.x~); `hardware_modules` GNSS + WiFi 펌웨어 (v1.2.0에서 추가); `dpworldapp_status` 7단계 시작 추적기 + 5-상태 결과 + 런타임 설정 필드 6개 (v1.3.0에서 추가) |
|
||
|
|
| `GET` | `/api/support-bundle` | 진단 zip (상태 + 마스킹된 설정 + 최근 로그 + OS 진단) |
|
||
|
|
| `POST` | `/api/action/test-connections` | 설정된 서버 엔드포인트 TCP 프로브 |
|
||
|
|
| `POST` | `/api/action/restart-dpworldapp` | systemctl을 통해 dpworldapp 재시작 |
|
||
|
|
|
||
|
|
### 네트워크 적용 엔진 (v1.6.0+)
|
||
|
|
|
||
|
|
30초 watchdog를 사용하여 OS 상의 네트워크 설정을 적용/검증/롤백합니다.
|
||
|
|
전체 내용: **[docs/network-apply-engine-guide.md](docs/network-apply-engine-guide.md)**.
|
||
|
|
|
||
|
|
| 메서드 | 경로 | 설명 |
|
||
|
|
|---|---|---|
|
||
|
|
| `GET` | `/api/network/state` | 라이브 인터페이스 + drift + watchdog + 최종 적용 + `country_pending` |
|
||
|
|
| `GET` | `/api/network/drift` | 전역 미적용 변경 수 (경량) |
|
||
|
|
| `GET` | `/api/network/apply/status?id=<apply_id>` | 진행 중인 적용 폴링 (confirm TTL도 이 요청으로 갱신) |
|
||
|
|
| `GET` | `/api/network/journal?limit=<n>` | 적용 저널 tail |
|
||
|
|
| `GET` | `/api/network/config` | 유효한 `net_config` 읽기 (watchdog 킬스위치) |
|
||
|
|
| `POST` | `/api/network/apply` | 네트워크 필드 적용 (또는 `dry_run`) — 비동기, `apply_id` 반환 |
|
||
|
|
| `POST` | `/api/network/apply/confirm` | TTL 내에 eth1 단절성 적용 확인 |
|
||
|
|
| `POST` | `/api/network/rollback` | 이전 적용 스냅샷으로 롤백 |
|
||
|
|
| `POST` | `/api/network/config` | `net_config` watchdog 키 쓰기 |
|
||
|
|
|
||
|
|
### Wi-Fi AP
|
||
|
|
|
||
|
|
현장 프로비저닝을 위한 Soft-AP(`ap0`) 관리. 전체 내용:
|
||
|
|
**docs/wifi-ap-guide.md**.
|
||
|
|
|
||
|
|
| 메서드 | 경로 | 설명 |
|
||
|
|
|---|---|---|
|
||
|
|
| `GET` | `/api/network/ap/status` | AP 런타임 상태 |
|
||
|
|
| `POST` | `/api/network/ap/config` | `ap_config` 쓰기 |
|
||
|
|
| `POST` | `/api/network/ap/apply` | AP 설정 적용 (ap0 시작/중지) |
|
||
|
|
|
||
|
|
### 펌웨어 OTA
|
||
|
|
|
||
|
|
dpworldapp 펌웨어 채널을 통한 업로드 → 사전 검증 → 플래시 → 복원 확인 흐름.
|
||
|
|
전체 내용: **docs/firmware-ota-guide.md**.
|
||
|
|
|
||
|
|
| 메서드 | 경로 | 설명 |
|
||
|
|
|---|---|---|
|
||
|
|
| `GET` | `/api/firmware/status` | 현재 OTA 상태 스냅샷 |
|
||
|
|
| `POST` | `/api/firmware/preflight` | 업로드 전 사전 검증 |
|
||
|
|
| `POST` | `/api/firmware/upload` | 펌웨어 ZIP 업로드 |
|
||
|
|
| `POST` | `/api/firmware/flash` | 플래시 실행 |
|
||
|
|
| `POST` | `/api/firmware/restore-check` | 플래시 후 복원 검증 |
|
||
|
|
|
||
|
|
> 서브시스템 내부 구조 (상태 머신, byte-exact 렌더링, 부팅 강화)는
|
||
|
|
> [docs/architecture.md](docs/architecture.md) 및 위에 링크된 서브시스템별 가이드에 문서화되어 있습니다.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 기술 스택
|
||
|
|
|
||
|
|
- Python 3.10 (stdlib만 사용 — 외부 의존성 없음)
|
||
|
|
- SQLite3 (기본 설정 저장소)
|
||
|
|
- 멀티스레드 HTTP 서버 (`ThreadingMixIn`)
|
||
|
|
- Vanilla ES-module SPA 프론트엔드 (빌드 단계 없음) — **Two Faces** 사용자/고급 보기 전환 기능을 포함한 ~18개 페이지 모듈 (`src/static/js/view-mode.js`)
|
||
|
|
- 주요 서브시스템: 네트워크 적용 엔진, Wi-Fi AP, 펌웨어 OTA (API 섹션 및 서브시스템별 가이드 참조)
|