<<<<<<< HEAD
A comprehensive surveillance management system that serves as a unified frontend for multiple Frigate NVR servers, providing centralized camera monitoring, event management, and recording search capabilities.
- Technical Documentation - Detailed technical architecture, integration guides, and implementation details
- 🔗 Multi-Frigate Server Support: Connect and manage multiple Frigate servers from a single interface
- 📹 Live Camera Monitoring: Real-time JPEG streams from all connected Frigate cameras
- 🎯 Event Detection: View and search events detected by Frigate's AI across all servers
- 📼 Recording Search: Search and playback recordings by time, camera, or detection type
- 🎨 Custom Views: Create drag-and-drop camera layouts with customizable grids
- 🔐 User Authentication: Secure login system with admin and user roles
- 🐳 Docker Deployment: Production-ready containerized deployment
- 📊 Centralized Management: Single pane of glass for all your Frigate installations
- ⚡ Real-time Updates: Live event notifications and status monitoring
ExaVMS 2.0 acts as a frontend orchestrator for multiple Frigate servers:
- Backend: Node.js + Express API server that proxies requests to Frigate servers
- Frontend: React application providing unified UI for camera management
- Storage: SQLite database for user management and view configurations
- Integration: RESTful communication with Frigate's API endpoints
┌─────────────────┐ ┌─────────────────┐
│ ExaVMS Web │────│ ExaVMS API │
│ Frontend │ │ (Node.js) │
└─────────────────┘ └─────────────────┘
│
┌─────────┼─────────┐
│ │ │
┌───────▼───┐ ┌───▼───┐ ┌───▼───┐
│ Frigate │ │Frigate│ │Frigate│
│ Server 1 │ │Server │ │Server │
│ │ │ 2 │ │ N │
└──────────┘ └───────┘ └───────┘
- Multiple Frigate servers (v0.13+) running and accessible
- Docker and Docker Compose (for deployment)
- Node.js 18+ (for development)
-
Deploy with Docker:
# Make the deploy script executable (Linux/Mac) chmod +x deploy.sh # Run the deployment script ./deploy.sh
Or manually:
# Build and start services docker compose build docker compose up -d -
Access the application:
- Web Interface: http://localhost:8080
- API: http://localhost:8081
- Admin:
admin/admin123 - User:
usuario/usuario123
# Install dependencies
npm install
# Start development server
npm run devThe application will be available at http://localhost:5000
The system uses SQLite with automatic initialization. Default data includes:
- Admin user (admin/admin123)
- Regular user (usuario/usuario123)
- Test server (http://10.1.1.251:5000)
ExaVMS integrates with Frigate servers through their REST API:
GET /api/config- Camera configurationGET /api/events- Detection events with filteringGET /api/recordings- Recorded footage with searchGET /api/{camera}/latest.jpg- Live JPEG streams
- Multi-server aggregation: Events and recordings from all servers in one view
- Real-time filtering: By camera, object type, confidence, and time range
- Unified search: Cross-server recording search capabilities
- Live streaming: Direct access to Frigate's live camera feeds
├── client/ # React frontend
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── contexts/ # React contexts
│ │ ├── hooks/ # Custom hooks
│ │ ├── lib/ # Utilities
│ │ └── pages/ # Page components
├── server/ # Express backend
│ ├── auth.ts # Authentication setup
│ ├── db.ts # Database connection
│ ├── index.ts # Server entry point
│ ├── init.ts # Database initialization
│ └── routes.ts # API routes
├── shared/ # Shared types/schemas
├── docker-compose.yml # Docker deployment config
├── Dockerfile # Client container
├── Dockerfile.server # Server container
└── deploy.sh # Deployment script
POST /api/auth/login- User loginPOST /api/auth/logout- User logoutGET /api/auth/me- Get current user
GET /api/hosts- List all hostsPOST /api/hosts- Add new hostPUT /api/hosts/:id- Update hostDELETE /api/hosts/:id- Delete hostGET /api/hosts/:id/cameras- Get cameras from host
GET /api/views- List all viewsPOST /api/views- Create new viewPUT /api/views/:id- Update viewDELETE /api/views/:id- Delete viewGET /api/views/:id/share- Get share tokenPOST /api/views/:id/share- Create share token
GET /api/search/events- Search events across hosts
- web: Nginx serving the React frontend (port 8080)
- api: Express.js backend API (port 8081)
NODE_ENV: Environment (development/production)PORT: Server port (default: 8080)SESSION_SECRET: Session secret keyDATABASE_URL: SQLite database path
VITE_API_BASE: API base URL (default: /api)
# Check service status
docker compose ps
# View logs
docker compose logs -f
# Restart services
docker compose restart# Reset database
docker compose down
docker volume rm exavms_db_data
docker compose up -dEdit docker-compose.yml to change exposed ports if needed.
- Backend:
/api/hostsCRUD with ping validation - UI: Hosts management page
- Authentication system
- Backend:
/api/viewsCRUD - UI: Drag-drop grid editor with react-grid-layout
- Video: HLS player with hls.js
- Backend:
/api/views/:id/share - UI: Share dialogs and public viewer
- Security: JWT-based tokens
- Backend:
/api/search/eventsfan-out - UI: Unified event search across hosts
29de7b82829a438bec1a22d7eea081145e3b73e1