187 lines
6.5 KiB
Markdown
187 lines
6.5 KiB
Markdown
# BAMS Architecture
|
|
|
|
## Overview
|
|
|
|
BAMS (Backup Appliance Management System) is a comprehensive management platform for backup appliances, providing unified control over storage, tape libraries, iSCSI targets, and Bacula integration.
|
|
|
|
## System Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ Cockpit Web UI │
|
|
│ (Cockpit Plugin) │
|
|
└──────────────────────┬──────────────────────────────────┘
|
|
│ HTTP/REST API
|
|
│
|
|
┌──────────────────────▼──────────────────────────────────┐
|
|
│ BAMS Backend Service (Go) │
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐│
|
|
│ │ Disk │ │ Tape │ │ iSCSI │ │ Bacula ││
|
|
│ │ Service │ │ Service │ │ Service │ │ Service ││
|
|
│ └────┬─────┘ └────┬─────┘ └────┬──────┘ └────┬────┘│
|
|
└───────┼─────────────┼──────────────┼──────────────┼─────┘
|
|
│ │ │ │
|
|
┌───────▼─────┐ ┌─────▼─────┐ ┌─────▼──────┐ ┌─────▼─────┐
|
|
│ LVM │ │ mtx │ │ SCST │ │ systemd │
|
|
│ ZFS │ │ sg_lib │ │ iSCSI │ │ bacula-sd│
|
|
└─────────────┘ └───────────┘ └────────────┘ └───────────┘
|
|
```
|
|
|
|
## Components
|
|
|
|
### 1. Backend Service (Go)
|
|
|
|
**Location**: `backend/`
|
|
|
|
**Structure**:
|
|
- `main.go` - Entry point, HTTP server setup
|
|
- `internal/api/` - REST API handlers and routing
|
|
- `internal/services/` - Business logic services
|
|
- `disk/` - Disk repository management (LVM/ZFS)
|
|
- `tape/` - Tape library management
|
|
- `iscsi/` - iSCSI target management (SCST)
|
|
- `bacula/` - Bacula integration
|
|
- `logs/` - Logging and diagnostics
|
|
- `audit/` - Audit logging
|
|
- `internal/config/` - Configuration management
|
|
- `internal/logger/` - Logging utilities
|
|
- `internal/utils/` - Helper functions
|
|
|
|
**Key Features**:
|
|
- RESTful API with JSON responses
|
|
- Graceful shutdown handling
|
|
- Request validation
|
|
- Error recovery middleware
|
|
- CORS support
|
|
|
|
### 2. Cockpit Plugin (Frontend)
|
|
|
|
**Location**: `cockpit/`
|
|
|
|
**Files**:
|
|
- `manifest.json` - Plugin metadata
|
|
- `index.html` - Main UI structure
|
|
- `bams.js` - JavaScript application logic
|
|
|
|
**Features**:
|
|
- Dashboard with real-time monitoring
|
|
- Storage repository management
|
|
- Tape library operations
|
|
- iSCSI target configuration
|
|
- Bacula status and control
|
|
- Log viewer
|
|
|
|
### 3. Configuration
|
|
|
|
**Location**: `configs/`
|
|
|
|
**Files**:
|
|
- `bams.service` - Systemd service file
|
|
- `config.yaml.example` - Configuration template
|
|
- `polkit.rules` - Polkit authorization rules
|
|
|
|
## Data Flow
|
|
|
|
### Disk Repository Creation
|
|
|
|
1. User creates repository via UI
|
|
2. Frontend sends POST to `/api/v1/disk/repositories`
|
|
3. Backend validates input
|
|
4. Disk service creates LVM volume or ZFS zvol
|
|
5. Repository metadata stored
|
|
6. Response returned to UI
|
|
|
|
### Tape Operations
|
|
|
|
1. User triggers inventory/load/unload
|
|
2. Frontend sends request to API
|
|
3. Tape service executes `mtx` commands
|
|
4. Results parsed and returned
|
|
5. UI updates display
|
|
|
|
### iSCSI Target Management
|
|
|
|
1. User creates/updates target
|
|
2. Backend validates IQN, portals, initiators
|
|
3. SCST configuration generated
|
|
4. Configuration applied via `scstadmin`
|
|
5. Status returned to UI
|
|
|
|
## Security
|
|
|
|
- **Authentication**: PAM/system users via Cockpit
|
|
- **Authorization**: Polkit rules for privileged operations
|
|
- **Audit Logging**: All configuration changes logged
|
|
- **Input Validation**: All user input validated
|
|
- **Error Handling**: Panic recovery middleware
|
|
|
|
## API Endpoints
|
|
|
|
### Dashboard
|
|
- `GET /api/v1/dashboard` - System overview
|
|
|
|
### Disk Repositories
|
|
- `GET /api/v1/disk/repositories` - List repositories
|
|
- `POST /api/v1/disk/repositories` - Create repository
|
|
- `GET /api/v1/disk/repositories/{id}` - Get repository
|
|
- `DELETE /api/v1/disk/repositories/{id}` - Delete repository
|
|
|
|
### Tape Library
|
|
- `GET /api/v1/tape/library` - Library status
|
|
- `POST /api/v1/tape/inventory` - Run inventory
|
|
- `GET /api/v1/tape/drives` - List drives
|
|
- `POST /api/v1/tape/drives/{id}/load` - Load tape
|
|
- `POST /api/v1/tape/drives/{id}/unload` - Unload tape
|
|
- `GET /api/v1/tape/slots` - List slots
|
|
|
|
### iSCSI Targets
|
|
- `GET /api/v1/iscsi/targets` - List targets
|
|
- `POST /api/v1/iscsi/targets` - Create target
|
|
- `GET /api/v1/iscsi/targets/{id}` - Get target
|
|
- `PUT /api/v1/iscsi/targets/{id}` - Update target
|
|
- `DELETE /api/v1/iscsi/targets/{id}` - Delete target
|
|
- `POST /api/v1/iscsi/targets/{id}/apply` - Apply configuration
|
|
- `POST /api/v1/iscsi/targets/{id}/luns` - Add LUN
|
|
- `DELETE /api/v1/iscsi/targets/{id}/luns/{lun}` - Remove LUN
|
|
- `GET /api/v1/iscsi/sessions` - List sessions
|
|
|
|
### Bacula
|
|
- `GET /api/v1/bacula/status` - SD status
|
|
- `GET /api/v1/bacula/config` - Get config
|
|
- `POST /api/v1/bacula/config` - Generate config
|
|
- `POST /api/v1/bacula/inventory` - Run inventory
|
|
- `POST /api/v1/bacula/restart` - Restart SD
|
|
|
|
### Logs & Diagnostics
|
|
- `GET /api/v1/logs/{service}` - Get logs
|
|
- `GET /api/v1/logs/{service}/stream` - Stream logs (WebSocket)
|
|
- `GET /api/v1/diagnostics/bundle` - Download support bundle
|
|
|
|
## Deployment
|
|
|
|
1. Build backend: `make build`
|
|
2. Install service: `make install`
|
|
3. Configure: Edit `/etc/bams/config.yaml`
|
|
4. Start service: `systemctl start bams`
|
|
5. Access via Cockpit web interface
|
|
|
|
## Dependencies
|
|
|
|
- **Go 1.21+**
|
|
- **Cockpit 300+**
|
|
- **SCST** (iSCSI target framework)
|
|
- **mtx** (tape library control)
|
|
- **LVM tools** (for LVM repositories)
|
|
- **ZFS tools** (for ZFS repositories, optional)
|
|
- **Bacula** (for backup integration)
|
|
|
|
## Future Enhancements
|
|
|
|
- WebSocket support for real-time log streaming
|
|
- Multi-tenant support
|
|
- High Availability
|
|
- Tape encryption management
|
|
- Cloud tiering
|
|
- Policy-based tape lifecycle
|
|
|