Files
BAMS/ARCHITECTURE.md

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