mirror of
https://github.com/Dvorinka/beszel.git
synced 2026-06-03 21:02:56 +00:00
294 lines
10 KiB
Markdown
294 lines
10 KiB
Markdown
# Beszel + Uptime Kuma Integration - Implementation Summary
|
|
|
|
## Overview
|
|
Successfully integrated Uptime Kuma's monitoring functionality into Beszel's architecture. The integration follows Beszel's design patterns and uses its existing tech stack (PocketBase, Go, React, TailwindCSS).
|
|
|
|
## Completed Implementation
|
|
|
|
### 1. Database Layer
|
|
**Files:**
|
|
- `@/beszel/internal/entities/monitor/monitor.go` - Monitor entity types
|
|
- `@/beszel/internal/migrations/1_add_monitor_collections.go` - Database migrations
|
|
|
|
**Collections Created:**
|
|
- `monitors` - Monitor configurations (HTTP, TCP, Ping, DNS, etc.)
|
|
- `monitor_heartbeats` - Check results history
|
|
- `monitor_alerts` - Alert configurations (schema ready)
|
|
- `status_pages` - Status page configs (schema ready)
|
|
|
|
### 2. Backend Monitoring Engine
|
|
**Files:**
|
|
- `@/beszel/internal/hub/monitors/checks/checker.go` - Monitor check implementations
|
|
- `@/beszel/internal/hub/monitors/scheduler.go` - Background check scheduler
|
|
- `@/beszel/internal/hub/monitors/api.go` - REST API handlers
|
|
|
|
**Monitor Types Implemented:**
|
|
- HTTP/HTTPS - Website monitoring with status code checks
|
|
- TCP - Port connectivity checks
|
|
- Ping - Host reachability via TCP fallback (ICMP requires root)
|
|
- DNS - DNS resolution with multiple record types (A, AAAA, MX, TXT, etc.)
|
|
- Keyword - HTTP response body keyword search
|
|
- JSON Query - HTTP response JSON path validation
|
|
|
|
**Scheduler Features:**
|
|
- 20-second minimum check interval
|
|
- Configurable retries with intervals
|
|
- Automatic heartbeat recording
|
|
- Uptime statistics calculation
|
|
- Old heartbeat cleanup (30-day retention)
|
|
- Event hooks for monitor lifecycle
|
|
|
|
### 3. API Endpoints
|
|
**Base Path:** `/api/beszel/monitors`
|
|
|
|
| Endpoint | Method | Description |
|
|
|----------|--------|-------------|
|
|
| `/` | GET | List all monitors |
|
|
| `/` | POST | Create new monitor |
|
|
| `/:id` | GET | Get monitor details |
|
|
| `/:id` | PATCH | Update monitor |
|
|
| `/:id` | DELETE | Delete monitor |
|
|
| `/:id/check` | POST | Manual check |
|
|
| `/:id/pause` | POST | Pause monitor |
|
|
| `/:id/resume` | POST | Resume monitor |
|
|
| `/:id/stats` | GET | Uptime statistics |
|
|
| `/:id/heartbeats` | GET | Recent heartbeats |
|
|
|
|
### 4. Frontend Components
|
|
**Files:**
|
|
- `@/beszel/internal/site/src/lib/monitors.ts` - API client and types
|
|
- `@/beszel/internal/site/src/components/monitors-table/monitors-table.tsx` - Monitor table UI
|
|
- `@/beszel/internal/site/src/components/routes/home.tsx` - Updated split dashboard view
|
|
|
|
**Features:**
|
|
- Real-time monitor status display
|
|
- Uptime visualization (24h/7d/30d)
|
|
- Response time tracking
|
|
- Pause/Resume controls
|
|
- Manual check triggers
|
|
- Search/filter functionality
|
|
- Edit/Delete actions
|
|
|
|
### 5. Dashboard Layout
|
|
The dashboard is now split into two sections:
|
|
|
|
```
|
|
┌─────────────────────────────────────────────┐
|
|
│ Beszel Header / Navbar │
|
|
├─────────────────────────────────────────────┤
|
|
│ DEVICE MONITORING (Primary) │
|
|
│ ┌───────────────────────────────────────┐ │
|
|
│ │ Systems Table - All connected devices │ │
|
|
│ │ [CPU] [Mem] [Disk] [Net] [Status] │ │
|
|
│ └───────────────────────────────────────┘ │
|
|
├─────────────────────────────────────────────┤
|
|
│ WEBSITE & SERVICE MONITORING (Secondary) │
|
|
│ ┌───────────────────────────────────────┐ │
|
|
│ │ Monitors Table - Websites & APIs │ │
|
|
│ │ [Name] [Type] [Status] [Uptime] [↑↓] │ │
|
|
│ └───────────────────────────────────────┘ │
|
|
├─────────────────────────────────────────────┤
|
|
│ Footer │
|
|
└─────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 6. Hub Integration
|
|
**Updated:**
|
|
- `@/beszel/internal/hub/hub.go`
|
|
|
|
**Integration Points:**
|
|
- Monitor scheduler initialization on startup
|
|
- API route registration
|
|
- Event hooks for monitor CRUD operations
|
|
- Cron job for heartbeat cleanup
|
|
|
|
### 7. Notification System
|
|
**Files:**
|
|
- `@/beszel/internal/entities/notification/notification.go` - Entity types
|
|
- `@/beszel/internal/hub/notifications/dispatcher.go` - Notification dispatcher
|
|
- `@/beszel/internal/hub/notifications/providers/` - Provider implementations
|
|
|
|
**Providers:**
|
|
- Email (SMTP with TLS support)
|
|
- Webhook (custom HTTP requests)
|
|
- Discord (rich embeds with color coding)
|
|
- Slack (attachments with fields)
|
|
- Telegram (Markdown messages)
|
|
- Gotify (self-hosted push notifications)
|
|
- Pushover (mobile push notifications)
|
|
|
|
**Features:**
|
|
- Automatic notification on DOWN/UP status changes
|
|
- Provider caching for performance
|
|
- Notification event logging
|
|
- Per-monitor notification linking
|
|
|
|
## Next Steps (Pending)
|
|
|
|
1. **Testing** - Unit and integration tests
|
|
|
|
### 8. Notification System Frontend
|
|
**Files:**
|
|
- `@/beszel/internal/site/src/lib/notifications.ts` - API client and types
|
|
- `@/beszel/internal/site/src/components/notifications/notification-settings-dialog.tsx` - Provider configuration dialog
|
|
|
|
**Features:**
|
|
- Create/edit notification providers for each type
|
|
- Test notification sending
|
|
- Default provider toggle
|
|
|
|
### 9. Status Pages
|
|
**Files:**
|
|
- `@/beszel/internal/entities/statuspage/statuspage.go` - Entity types
|
|
- `@/beszel/internal/hub/statuspages/api.go` - API handlers
|
|
- `@/beszel/internal/site/src/lib/statuspages.ts` - API client
|
|
- `@/beszel/internal/site/src/components/status-pages/status-pages-table.tsx` - Management table
|
|
- `@/beszel/internal/site/src/components/status-pages/status-page-dialog.tsx` - Creation/editing dialog
|
|
|
|
**Features:**
|
|
- Public status pages with custom slugs
|
|
- Light/dark/auto theme support
|
|
- Custom logo and favicon
|
|
- Uptime percentage display (24h, 7d, 30d)
|
|
- Public/private toggle
|
|
- Monitor grouping and sorting
|
|
- Form validation with zod
|
|
|
|
### 10. Domain Locker Integration
|
|
**Files:**
|
|
- `@/beszel/internal/entities/domain/domain.go` - Domain entity types
|
|
- `@/beszel/internal/hub/domains/whois/lookup.go` - WHOIS lookup service
|
|
- `@/beszel/internal/hub/domains/scheduler.go` - Domain expiry scheduler
|
|
- `@/beszel/internal/hub/domains/api.go` - Domain API handlers
|
|
- `@/beszel/internal/site/src/lib/domains.ts` - API client
|
|
- `@/beszel/internal/site/src/components/domains-table/` - Table and dialog components
|
|
|
|
**Features Ported:**
|
|
- WHOIS lookup with multiple fallback methods (RDAP, native WHOIS, WhoisXML API)
|
|
- Domain expiry monitoring with days-until calculation
|
|
- SSL certificate expiry tracking
|
|
- DNS records (NS, MX, TXT)
|
|
- IPv4/IPv6 address resolution
|
|
- Host geolocation (country, ISP)
|
|
- Registrar recognition with improved parsing
|
|
- Domain valuation (purchase price, current value, renewal cost)
|
|
- Auto-renew flag
|
|
- Tags and notes
|
|
- Favicon fetching
|
|
- Change history tracking
|
|
- Alert settings (days before expiry, SSL alerts)
|
|
- Status badges (active, expiring, expired, unknown, paused)
|
|
- Daily scheduled checks
|
|
|
|
**Dashboard Integration:**
|
|
- Third dashboard section: Device → Website → Domain monitoring
|
|
- WHOIS auto-lookup when adding domains
|
|
- Refresh button for manual updates
|
|
|
|
### 11. Calendar View
|
|
**Files:**
|
|
- `@/beszel/internal/site/src/components/calendar/calendar-view.tsx` - Calendar component
|
|
- `@/beszel/internal/hub/incidents/api.go` - Calendar events API
|
|
|
|
**Features:**
|
|
- Monthly calendar view
|
|
- Domain expiry dates
|
|
- SSL certificate expiry dates
|
|
- Incident history
|
|
- Color-coded events by urgency
|
|
- Legend for event types
|
|
|
|
### 12. CSV Export
|
|
**Files:**
|
|
- `@/beszel/internal/hub/export/csv.go` - CSV export handlers
|
|
|
|
**Features:**
|
|
- Export domains with full details
|
|
- Export monitors with uptime stats
|
|
- Export incidents with resolution data
|
|
- Automatic filename with date
|
|
|
|
### 13. Incident Management
|
|
**Files:**
|
|
- `@/beszel/internal/entities/incident/incident.go` - Incident types
|
|
- `@/beszel/internal/hub/incidents/api.go` - Incident API
|
|
- `@/beszel/internal/site/src/lib/incidents.ts` - API client
|
|
|
|
**Features:**
|
|
- Create/acknowledge/resolve/close workflow
|
|
- Severity levels (critical, high, medium, low)
|
|
- Assignment to users
|
|
- Incident updates and notes
|
|
- Status change tracking
|
|
- MTTR (Mean Time To Resolve) calculation
|
|
- Statistics dashboard
|
|
|
|
### 14. Push Notifications
|
|
**Files:**
|
|
- `@/beszel/internal/hub/notifications/push.go` - Push service
|
|
- `@/beszel/internal/site/src/hooks/use-push-notifications.ts` - Frontend hook
|
|
- `@/beszel/internal/site/public/sw.js` - Service worker
|
|
|
|
**Features:**
|
|
- Browser push notification support
|
|
- VAPID key management
|
|
- Subscribe/unsubscribe
|
|
- Test notifications
|
|
- Action buttons on notifications
|
|
|
|
### 15. PWA Support
|
|
**Files:**
|
|
- `@/beszel/internal/site/public/manifest.json` - App manifest
|
|
- `@/beszel/internal/site/public/sw.js` - Service worker
|
|
|
|
**Features:**
|
|
- Installable web app
|
|
- Offline support with caching
|
|
- Background sync
|
|
- App icons for all sizes
|
|
- Standalone display mode
|
|
- Theme color support
|
|
|
|
### 16. Testing
|
|
- Unit tests for check implementations
|
|
- Integration tests for API endpoints
|
|
- Frontend component tests
|
|
- E2E test scenarios
|
|
|
|
## Building & Running
|
|
|
|
```bash
|
|
# Build the Go backend
|
|
cd beszel
|
|
go build
|
|
|
|
# Install frontend dependencies
|
|
cd internal/site
|
|
npm install
|
|
|
|
# Build frontend
|
|
npm run build
|
|
|
|
# Run the application
|
|
./beszel serve
|
|
```
|
|
|
|
The monitor collections will be created automatically on first run via the migration system.
|
|
|
|
## Architecture Notes
|
|
|
|
- **Database:** Uses PocketBase's existing SQLite with collections
|
|
- **Auth:** Leverages Beszel's existing user authentication
|
|
- **Permissions:** Respects role-based access (readonly users can't modify)
|
|
- **Real-time:** Uses TanStack Query for frontend data fetching with polling
|
|
- **Styling:** Follows Beszel's TailwindCSS + shadcn/ui design system
|
|
- **Internationalization:** Uses Lingui for i18n (same as Beszel)
|
|
|
|
## Code Quality
|
|
|
|
All code follows:
|
|
- Go best practices (error handling, context usage)
|
|
- React patterns (hooks, memo, Suspense)
|
|
- Beszel's existing code style
|
|
- TypeScript type safety (where applicable)
|