cập nhật lại README và INSTALL
This commit is contained in:
@@ -1,36 +1,83 @@
|
||||
# IPCam Orange Pi Dashboard
|
||||
|
||||
Dashboard giám sát camera IP gọn nhẹ chạy trên Orange Pi, dựa trên MediaMTX:
|
||||
Dashboard giám sát camera IP chạy gọn trên duy nhất một thiết bị `Orange Pi 5`, dùng `MediaMTX` làm media server, `FastAPI` làm backend và `React` làm frontend.
|
||||
|
||||
- Live View (WebRTC WHEP) dạng grid, auto reconnect, lazy load
|
||||
- Playback fMP4 theo camera + ngày (file list + HTML5 video)
|
||||
- Settings: quản lý camera trực tiếp trong `mediamtx.yml` + lịch ghi hình
|
||||
## Mô hình triển khai khuyến nghị
|
||||
|
||||
Toàn bộ hệ thống chạy trên cùng một máy:
|
||||
|
||||
- Thiết bị: `Orange Pi 5`
|
||||
- RAM: `8GB` hoặc `16GB`
|
||||
- Lưu trữ: `SSD/NVMe >= 256GB`
|
||||
- Hệ điều hành: Debian/Ubuntu cho Orange Pi
|
||||
- Thành phần chạy cùng máy:
|
||||
- `MediaMTX`
|
||||
- `FastAPI backend`
|
||||
- `Frontend React build static`
|
||||
- Thư mục recordings
|
||||
|
||||
Mô hình này phù hợp khi cần một hộp camera nội bộ gọn nhẹ, dễ bảo trì và không phụ thuộc thêm server khác.
|
||||
|
||||
## Tính năng chính
|
||||
|
||||
- Live View qua `WebRTC/WHEP`, dạng grid, tự reconnect, lazy load
|
||||
- Playback file ghi hình `fMP4` theo camera và ngày
|
||||
- Settings để:
|
||||
- thêm/xóa camera trực tiếp vào `mediamtx.yml`
|
||||
- bật/tắt ghi hình
|
||||
- chỉnh lịch ghi hình
|
||||
- cấu hình API/WebRTC URL của MediaMTX
|
||||
- restart container MediaMTX
|
||||
|
||||
## Cấu trúc thư mục
|
||||
|
||||
- `src/`: frontend React
|
||||
- `api/`: backend FastAPI
|
||||
- `.trae/documents/`: tài liệu yêu cầu/kiến trúc
|
||||
- `mediamtx/`: Dockerfile, `docker-compose.yml`, `mediamtx.yml`
|
||||
- `.trae/documents/`: tài liệu yêu cầu và kiến trúc
|
||||
|
||||
## Luồng hệ thống
|
||||
|
||||
```text
|
||||
IP Camera -> MediaMTX -> FastAPI Backend -> Frontend Dashboard
|
||||
|
|
||||
-> recordings tren SSD/NVMe
|
||||
```
|
||||
|
||||
## Yêu cầu phần cứng
|
||||
|
||||
- `Orange Pi 5` RAM `8GB` hoặc `16GB`
|
||||
- Ổ lưu trữ `>= 256GB`
|
||||
- Khuyến nghị dùng `NVMe SSD` thay vì thẻ nhớ để ghi hình ổn định hơn
|
||||
- Nếu ghi nhiều camera hoặc giữ file lâu ngày, nên dùng `512GB` hoặc `1TB`
|
||||
|
||||
## Yêu cầu phần mềm
|
||||
|
||||
- Python `3.9+` (khuyến nghị `3.10+`)
|
||||
- Node.js `20+`
|
||||
- Docker và Docker Compose plugin cho MediaMTX
|
||||
- Nginx hoặc Apache nếu muốn serve frontend static qua web server
|
||||
|
||||
## Backend API
|
||||
|
||||
- `GET /api/health`
|
||||
- `GET /api/config`
|
||||
- `POST /api/config/basic` (cập nhật thông số `config.json`)
|
||||
- `GET /api/paths` (proxy trạng thái từ MediaMTX)
|
||||
- `POST /api/recording` (bật/tắt ghi hình ngay)
|
||||
- `POST /api/scheduler/enabled` / `POST /api/scheduler/schedule`
|
||||
- `POST /api/config/basic`
|
||||
- `GET /api/paths`
|
||||
- `POST /api/recording`
|
||||
- `POST /api/scheduler/enabled`
|
||||
- `POST /api/scheduler/schedule`
|
||||
- `GET /api/mediamtx/config`
|
||||
- `POST /api/mediamtx/cameras` (body: `{ "rtsp_url": "..." }`)
|
||||
- `POST /api/mediamtx/cameras`
|
||||
- `DELETE /api/mediamtx/cameras/{name}`
|
||||
- `POST /api/mediamtx/recording` (ghi `pathDefaults.record` vào `mediamtx.yml`)
|
||||
- `POST /api/mediamtx/restart` (restart container `mediamtx`)
|
||||
- `POST /api/mediamtx/recording`
|
||||
- `POST /api/mediamtx/restart`
|
||||
- `GET /api/recordings?camera=cam1&date=YYYY-MM-DD`
|
||||
- `GET /videos/<camera>/<file>.fmp4`
|
||||
|
||||
## Chạy dev (máy dev)
|
||||
## Chạy development
|
||||
|
||||
### 1) Chạy backend
|
||||
### Backend
|
||||
|
||||
```bash
|
||||
python3 -m venv api/.venv
|
||||
@@ -39,30 +86,32 @@ pip install -r api/requirements.txt
|
||||
python3 -m api.run
|
||||
```
|
||||
|
||||
### 2) Chạy frontend
|
||||
### Frontend
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Frontend dev server đã được cấu hình proxy `/api` và `/videos` sang `http://localhost:8008`.
|
||||
Frontend dev server đã proxy sẵn `/api` và `/videos` sang `http://localhost:8008`.
|
||||
|
||||
## Cấu hình
|
||||
|
||||
Backend chỉ dùng file `api/data/config.json` (không đọc `.env`).
|
||||
Frontend dùng `.env` chỉ với `VITE_DEV_BACKEND_URL` và `VITE_API_BASE_URL`.
|
||||
Backend chỉ đọc `api/data/config.json`.
|
||||
Frontend chỉ dùng `.env` cho môi trường dev với `VITE_DEV_BACKEND_URL` và `VITE_API_BASE_URL`.
|
||||
|
||||
Các key quan trọng trong `config.json`:
|
||||
|
||||
- `mediamtx_api_url`: ví dụ `http://127.0.0.1:9997`
|
||||
- `mediamtx_webrtc_url`: ví dụ `http://127.0.0.1:8889`
|
||||
- `mediamtx_api_user`: username API (nếu bật auth trong MediaMTX)
|
||||
- `mediamtx_api_pass`: password API (nếu bật auth trong MediaMTX)
|
||||
- `recordings_dir`: ví dụ `./mediamtx/recordings` (cùng máy) hoặc đường dẫn mount NFS/SMB
|
||||
- `api_port`: cổng chạy backend (mặc định `8008`)
|
||||
- `cameras`: danh sách camera được đồng bộ từ `mediamtx.yml` (`name` + `rtsp_url`)
|
||||
- `mediamtx_api_user`: username API nếu bật auth
|
||||
- `mediamtx_api_pass`: password API nếu bật auth
|
||||
- `recordings_dir`: đường dẫn recordings trên SSD/NVMe
|
||||
- `api_port`: cổng backend, mặc định `8008`
|
||||
- `cameras`: danh sách camera đồng bộ từ `mediamtx.yml`
|
||||
- `schedule`: lịch ghi hình
|
||||
|
||||
Ví dụ `config.json`:
|
||||
Ví dụ:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -82,6 +131,14 @@ Ví dụ `config.json`:
|
||||
}
|
||||
```
|
||||
|
||||
## Triển khai
|
||||
## Triển khai production
|
||||
|
||||
Xem hướng dẫn chi tiết trong `INSTALL.md`.
|
||||
Kịch bản production chuẩn cho project này:
|
||||
|
||||
- `Orange Pi 5` là máy duy nhất chạy cả dashboard và MediaMTX
|
||||
- MediaMTX chạy local trên chính Orange Pi
|
||||
- Backend FastAPI chạy local trên chính Orange Pi
|
||||
- Frontend build ra `dist/` và được serve local
|
||||
- Recordings lưu vào SSD/NVMe gắn trực tiếp với Orange Pi
|
||||
|
||||
Hướng dẫn cài đặt chi tiết xem trong `INSTALL.md`.
|
||||
|
||||
Reference in New Issue
Block a user