Skip to content

Commit 0e2fea7

Browse files
authored
Merge pull request #3 from jorgedlcruz/features/v0.1.3
Features/v0.1.3
2 parents a1c184d + 1f8a04f commit 0e2fea7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+4205
-672
lines changed

CONTAINER.md

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Container Deployment Guide
22

3-
This guide covers building and running VBR Connect as a container using Podman or Docker.
3+
This guide covers building and running Veeam Single-UI as a container using Podman or Docker.
44

55
## Prerequisites
66

@@ -11,12 +11,12 @@ This guide covers building and running VBR Connect as a container using Podman o
1111
## Build the Container
1212

1313
```bash
14-
podman build -t vbr-connect-mvp:latest .
14+
podman build -t veeam-single-ui:latest .
1515
```
1616

1717
Or with Docker:
1818
```bash
19-
docker build -t vbr-connect-mvp:latest .
19+
docker build -t veeam-single-ui:latest .
2020
```
2121

2222
## Run the Container
@@ -25,20 +25,20 @@ docker build -t vbr-connect-mvp:latest .
2525

2626
```bash
2727
podman run -d \
28-
--name vbr-connect --replace \
28+
--name veeam-single-ui --replace \
2929
-p 3000:3000 \
3030
-e VEEAM_API_URL="https://your-vbr-server:9419" \
3131
-e VEEAM_USERNAME="your-username" \
3232
-e VEEAM_PASSWORD="your-password" \
3333
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
34-
vbr-connect-mvp:latest
34+
veeam-single-ui:latest
3535
```
3636

3737
### Full Run with All Products
3838

3939
```bash
4040
podman run -d \
41-
--name vbr-connect --replace \
41+
--name veeam-single-ui --replace \
4242
-p 3000:3000 \
4343
-e VEEAM_API_URL="https://your-vbr-server:9419" \
4444
-e VEEAM_USERNAME="your-username" \
@@ -50,7 +50,7 @@ podman run -d \
5050
-e VBM_USERNAME="your-vbm-username" \
5151
-e VBM_PASSWORD="your-vbm-password" \
5252
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
53-
vbr-connect-mvp:latest
53+
veeam-single-ui:latest
5454
```
5555

5656
## Environment Variables
@@ -106,19 +106,19 @@ NODE_TLS_REJECT_UNAUTHORIZED=0
106106
Run with environment file:
107107
```bash
108108
podman run -d \
109-
--name vbr-connect --replace \
109+
--name veeam-single-ui --replace \
110110
-p 3000:3000 \
111111
--env-file .env.local \
112-
vbr-connect-mvp:latest
112+
veeam-single-ui:latest
113113
```
114114

115115
With Docker:
116116
```bash
117117
docker run -d \
118-
--name vbr-connect --rm \
118+
--name veeam-single-ui --rm \
119119
-p 3000:3000 \
120120
--env-file .env.local \
121-
vbr-connect-mvp:latest
121+
veeam-single-ui:latest
122122
```
123123

124124
**Important Notes:**
@@ -130,22 +130,22 @@ docker run -d \
130130

131131
### View logs
132132
```bash
133-
podman logs vbr-connect
133+
podman logs veeam-single-ui
134134
```
135135

136136
### Stop container
137137
```bash
138-
podman stop vbr-connect
138+
podman stop veeam-single-ui
139139
```
140140

141141
### Start container
142142
```bash
143-
podman start vbr-connect
143+
podman start veeam-single-ui
144144
```
145145

146146
### Remove container
147147
```bash
148-
podman rm vbr-connect
148+
podman rm veeam-single-ui
149149
```
150150

151151
## Access the Application
@@ -159,16 +159,16 @@ Scan the container image for vulnerabilities using Trivy:
159159

160160
```bash
161161
# Export image and scan (workaround for podman socket issues)
162-
podman save localhost/vbr-connect-mvp:latest -o /tmp/vbr-connect-mvp.tar
163-
trivy image --input /tmp/vbr-connect-mvp.tar
162+
podman save localhost/veeam-single-ui:latest -o /tmp/veeam-single-ui.tar
163+
trivy image --input /tmp/veeam-single-ui.tar
164164

165165
# Alternative: Scan directly if podman socket is available
166-
trivy image localhost/vbr-connect-mvp:latest
166+
trivy image localhost/veeam-single-ui:latest
167167
```
168168

169169
To scan only for vulnerabilities (faster):
170170
```bash
171-
trivy image --scanners vuln --input /tmp/vbr-connect-mvp.tar
171+
trivy image --scanners vuln --input /tmp/veeam-single-ui.tar
172172
```
173173

174174
## Image Details
@@ -182,15 +182,15 @@ trivy image --scanners vuln --input /tmp/vbr-connect-mvp.tar
182182
## Troubleshooting
183183

184184
### Container won't start
185-
1. Check logs: `podman logs vbr-connect`
185+
1. Check logs: `podman logs veeam-single-ui`
186186
2. Verify environment variables are set correctly
187187
3. Ensure VBR API URL is accessible from container
188188
4. Check if required environment variables (VEEAM_*) are present
189189

190190
### API connection errors
191191
1. Verify network connectivity:
192192
```bash
193-
podman exec vbr-connect ping your-vbr-server
193+
podman exec veeam-single-ui ping your-vbr-server
194194
```
195195
2. Check if `NODE_TLS_REJECT_UNAUTHORIZED=0` is set for self-signed certificates
196196
3. Verify credentials are correct and have appropriate permissions
@@ -203,7 +203,7 @@ trivy image --scanners vuln --input /tmp/vbr-connect-mvp.tar
203203
### Port conflicts
204204
If port 3000 is already in use, map to a different port:
205205
```bash
206-
podman run -d --name vbr-connect --replace -p 8080:3000 ... vbr-connect-mvp:latest
206+
podman run -d --name veeam-single-ui --replace -p 8080:3000 ... veeam-single-ui:latest
207207
```
208208
Then access at http://localhost:8080
209209

@@ -214,22 +214,22 @@ Then access at http://localhost:8080
214214
4. For VRO, ensure domain prefix is correct (e.g., `DOMAIN\username`)
215215

216216
### Build failures
217-
1. Ensure you're in the `vbr-connect-mvp` directory
217+
1. Ensure you're in the `veeam-single-ui` directory
218218
2. Check Docker/Podman daemon is running
219219
3. Verify internet connectivity for npm package downloads
220220
4. Clear build cache:
221221
```bash
222-
podman build --no-cache -t vbr-connect-mvp:latest .
222+
podman build --no-cache -t veeam-single-ui:latest .
223223
```
224224

225225
### Performance issues
226226
1. Check container resource limits:
227227
```bash
228-
podman stats vbr-connect
228+
podman stats veeam-single-ui
229229
```
230230
2. Allocate more resources if needed:
231231
```bash
232-
podman run -d --name vbr-connect --memory=2g --cpus=2 ...
232+
podman run -d --name veeam-single-ui --memory=2g --cpus=2 ...
233233
```
234234
3. Monitor Veeam API response times
235235
4. Consider adjusting auto-refresh intervals in the application

README.md

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
A Next.js 15 application providing a unified monitoring dashboard for Veeam Data Protection products through an intuitive web interface.
44

5-
![VBR Connect Walkthrough](https://jorgedelacruz.uk/wp-content/uploads/2025/12/ezgif-656c493097a494bd.gif)
5+
![Veeam Single-UI Walkthrough](https://jorgedelacruz.uk/wp-content/uploads/2026/01/ezgif-668cdc4ebc95a18c.gif)
66

77
## Features
88

@@ -13,8 +13,10 @@ A Next.js 15 application providing a unified monitoring dashboard for Veeam Data
1313
- **Transferred Data Widget**: Visual representation of data transfer rates over time
1414
- **Real-time Statistics**: Active jobs, success rate, storage usage, protected VMs, and data processed
1515
- **Malware Detection**: Recent malware scan events and alerts
16-
- **Recent Sessions**: Overview of the latest backup sessions with status and details, defaulting to "BackupJob" type for clarity
17-
- **Time Range Selection**: 7-day and 30-day views for historical analysis
16+
- **Recent Sessions**: Overview of the latest backup sessions with status and details
17+
- **Time Range Dropdown**: Quick selection for 7-day, 14-day, and 30-day views
18+
- **Export Capability**: Export filtered session data to CSV or JSON format
19+
- **Type Filtering**: Auto-filters to "BackupJob" type for clarity
1820

1921
#### Jobs Management
2022
- **Comprehensive Jobs Table**: All backup jobs with status, type, and schedule information
@@ -51,8 +53,12 @@ A Next.js 15 application providing a unified monitoring dashboard for Veeam Data
5153
- **Rich Metadata**: Access detailed info including vCenter, Datacenter, Cluster, Guest OS, and DNS names
5254
- **Advanced Filtering**: Faceted filtering by protection status, platform, and state
5355
- **Protected Data**:
54-
- **Rich Grid View**: Detailed list of all protected workloads
55-
- **Calendar View**: Toggleable monthly calendar view for restore points visualization, highlighting available recovery points by date
56+
- **Rich Grid View**: Detailed list of all protected workloads with sortable columns
57+
- **HexGrid Visualization**: Toggleable hexagonal protection map with RPO-based coloring
58+
- Green (Protected within RPO), Orange (Unprotected/Outside RPO)
59+
- Hover effects and click-to-detail dialog
60+
- Filters by type and status with search capability
61+
- **Calendar View**: Toggleable monthly calendar view for restore points visualization
5662
- **Restore Points**: Deep dive into restore points with derived type (Full/Incremental) and size data
5763
- **Physical & Cloud Infrastructure**:
5864
- **Protection Groups**: Monitor physical agent deployment and status
@@ -76,18 +82,29 @@ A Next.js 15 application providing a unified monitoring dashboard for Veeam Data
7682
- **Job Type Support**: Multiple M365 job types and configurations
7783
- **Calendar View**: Interactive calendar for visualizing restore points availability
7884
- **Organizations**: Track multiple M365 organizations and their storage usage
85+
- **Backup Infrastructure**:
86+
- **Backup Proxies**: Status, CPU/Memory usage, version, roles, and actions (rescan, maintenance mode)
87+
- **Backup Repositories**: Capacity visualization, retention settings, immutability, encryption status
7988

8089
### Administration & Branding
8190
- **Licensing**:
82-
- Detailed VBR license report generation
83-
- Instance and capacity usage breakdown
84-
- PDF/HTML report download capabilities
91+
- **Tabbed Interface**: Toggle between VBR and VB365 license views
92+
- **VBR License**: Detailed license report generation with PDF/HTML download
93+
- **VB365 License**: Licensed users table with revoke capability
94+
- **Instance and Capacity Usage**: Breakdown by workload type
95+
- **PDF Report Generation**: Download license overview reports
8596
- **Theme Customizer**:
8697
- **Color Presets**: Blue, Green, Orange, Red, Violet, Yellow, and Default
8798
- **Radius Control**: Adjust UI corner roundness (0 to 1.0rem)
8899
- **Scaling**: Adjust font and element scaling (90% to 110%)
89100
- **Mode**: Seamless Dark/Light mode switching
90101
- **Cookie Persistence**: Theme settings persist across sessions via server-side cookies
102+
- **Identity Management**:
103+
- **User Directory**: View and filter users with metadata
104+
- **Security Settings**:
105+
- **MFA Enforcement**: Toggle with real-time API sync
106+
- **Service Accounts**: Per-user management with role assignment
107+
- **RBAC Roles**: View and manage role-based permissions
91108

92109
### Kasten K10
93110
- **Coming Soon**: Kubernetes backup platform monitoring
@@ -99,7 +116,10 @@ A Next.js 15 application providing a unified monitoring dashboard for Veeam Data
99116
- **Secure API Proxy**: Server-side API calls protect credentials from client exposure
100117
- **Interactive Visualizations**: Charts and graphs using Recharts library
101118
- **Data Tables**: Sortable, filterable tables with TanStack Table
119+
- **Standardized Headers**: Consistent column toggle and search across all tables
120+
- **Column Visibility**: Hide/show columns via dropdown menu
102121
- **Toast Notifications**: User-friendly error and success messages
122+
- **Environment-Based Visibility**: VBM, VRO sections auto-hide when not configured
103123

104124
## Getting Started
105125

@@ -191,6 +211,10 @@ See [CONTAINER.md](./CONTAINER.md) for detailed instructions on building and run
191211
- `/api/v1/license/capacity` - License capacity details
192212
- `/api/v1/malware-detection` - Malware events
193213
- `/api/v1/security/best-practices` - Security best practices
214+
- `/api/v1/security/settings` - MFA and security settings
215+
- `/api/v1/accounts/users` - User accounts management
216+
- `/api/v1/roles` - RBAC role definitions
217+
- `/api/v1/roles/{id}/permissions` - Role permissions
194218
- `/api/v1/backupObjects` - Backup objects lookup
195219
- `/api/v1/backups/{id}` - Backup details
196220
- `/api/v1/backups/{id}/backupFiles` - Backup files (sizes)
@@ -218,7 +242,11 @@ See [CONTAINER.md](./CONTAINER.md) for detailed instructions on building and run
218242
- `/v8/ProtectedSites` - Protected Sites inventory
219243
- `/v8/ProtectedTeams` - Protected Teams inventory
220244
- `/v8/RestorePoints` - Global restore point search
221-
- `/v8/License` - License status
245+
- `/v8/License` - License status and info
246+
- `/v8/LicensedUsers` - Licensed user management (GET/DELETE)
247+
- `/v8/Proxies` - Backup proxy servers
248+
- `/v8/BackupRepositories` - Backup repository management
249+
- `/v8/Reports/GenerateLicenseOverview` - PDF report generation
222250
- `/v8/Health` - API service health
223251

224252
## Project Structure
@@ -240,6 +268,10 @@ See [CONTAINER.md](./CONTAINER.md) for detailed instructions on building and run
240268
│ │ │ └── security/ # Security best practices
241269
│ │ ├── vro/ # VRO API routes
242270
│ │ └── vbm/ # VBM API routes
271+
│ │ ├── LicensedUsers/ # Licensed user management
272+
│ │ ├── Proxies/ # Proxy servers
273+
│ │ ├── Reports/ # PDF report generation
274+
│ │ └── ... # Other VBM endpoints
243275
│ ├── vbr/ # VBR monitoring pages
244276
│ │ ├── dashboard/ # VBR dashboard with stats
245277
│ │ ├── jobs/ # Jobs list and details
@@ -248,7 +280,14 @@ See [CONTAINER.md](./CONTAINER.md) for detailed instructions on building and run
248280
│ │ ├── protected-data/ # Restore points & calendar view
249281
│ │ └── page.tsx # Redirects to dashboard
250282
│ ├── vro/ # VRO monitoring page
251-
│ ├── vbm/ # VBM monitoring page
283+
│ ├── vbm/ # VBM monitoring pages
284+
│ │ ├── dashboard/ # VBM dashboard with stats
285+
│ │ ├── jobs/ # M365 backup jobs list
286+
│ │ ├── protected-items/ # Protected objects view
287+
│ │ ├── organizations/ # M365 organizations
288+
│ │ └── infrastructure/ # Backup infrastructure
289+
│ │ ├── proxies/ # Backup proxies page
290+
│ │ └── repositories/ # Backup repositories page
252291
│ ├── k10/ # K10 placeholder page
253292
│ ├── layout.tsx # Root layout with sidebar & theme provider
254293
│ └── page.tsx # Home (redirects to /vbr/dashboard)
@@ -269,6 +308,7 @@ See [CONTAINER.md](./CONTAINER.md) for detailed instructions on building and run
269308
│ ├── job-details-header.tsx # Job details header component
270309
│ ├── vbr-restore-points-calendar.tsx # VBR Calendar View
271310
│ ├── vbm-restore-points-calendar.tsx # VBM Calendar View
311+
│ ├── hexgrid-protection-view.tsx # HexGrid protection visualization
272312
│ └── ... # Various data tables
273313
├── lib/
274314
│ ├── api/

app/actions/identity-actions.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"use server"
2+
3+
import { revalidatePath } from "next/cache"
4+
import { veeamApi } from "@/lib/api/veeam-client"
5+
6+
export async function deleteUserAction(id: string) {
7+
try {
8+
await veeamApi.deleteUser(id)
9+
revalidatePath("/administration/identity")
10+
revalidatePath("/administration/identity/users")
11+
return { success: true }
12+
} catch (error) {
13+
const message = error instanceof Error ? error.message : "Failed to delete user"
14+
console.warn("Delete user:", message)
15+
return { success: false, error: message }
16+
}
17+
}
18+
19+
export async function resetMFAAction(id: string) {
20+
try {
21+
await veeamApi.resetMFA(id)
22+
return { success: true }
23+
} catch (error) {
24+
const message = error instanceof Error ? error.message : "Failed to reset MFA"
25+
console.warn("Reset MFA:", message)
26+
return { success: false, error: message }
27+
}
28+
}
29+
30+
export async function toggleServiceAccountAction(id: string, isServiceAccount: boolean) {
31+
try {
32+
await veeamApi.changeServiceAccountMode(id, isServiceAccount)
33+
revalidatePath("/administration/identity/users")
34+
return { success: true }
35+
} catch (error) {
36+
const message = error instanceof Error ? error.message : "Failed to update service account status"
37+
console.warn("Toggle service account:", message)
38+
return { success: false, error: message }
39+
}
40+
}
41+
42+
export async function updateMFAAction(enabled: boolean) {
43+
try {
44+
await veeamApi.updateSecuritySettings({ mfaEnabled: enabled })
45+
revalidatePath("/administration/identity/users")
46+
return { success: true }
47+
} catch (error) {
48+
const message = error instanceof Error ? error.message : "Failed to update MFA settings"
49+
console.warn("Update MFA settings:", message)
50+
return { success: false, error: message }
51+
}
52+
}

0 commit comments

Comments
 (0)