Major architectural overhaul: dependency injection, monitoring, and operational improvements
This commit represents a comprehensive refactoring and enhancement of Baktainer:
## Core Architecture Improvements
- Implemented comprehensive dependency injection system with DependencyContainer
- Fixed critical singleton instantiation bug that was returning Procs instead of service instances
- Replaced problematic Concurrent::FixedThreadPool with custom SimpleThreadPool implementation
- Achieved 100% test pass rate (121 examples, 0 failures) after fixing 30+ failing tests
## New Features Implemented
### 1. Backup Rotation & Cleanup (BackupRotation)
- Configurable retention policies by age, count, and disk space
- Automatic cleanup with comprehensive statistics tracking
- Empty directory cleanup and space monitoring
### 2. Backup Encryption (BackupEncryption)
- AES-256-CBC and AES-256-GCM encryption support
- Key derivation from passphrases or direct key input
- Encrypted backup metadata storage
### 3. Operational Monitoring Suite
- **Health Check Server**: HTTP endpoints for monitoring (/health, /status, /metrics)
- **Web Dashboard**: Real-time monitoring dashboard with auto-refresh
- **Prometheus Metrics**: Integration with monitoring systems
- **Backup Monitor**: Comprehensive metrics tracking and performance alerts
### 4. Advanced Label Validation (LabelValidator)
- Schema-based validation for all 12+ Docker labels
- Engine-specific validation rules
- Helpful error messages and warnings
- Example generation for each database engine
### 5. Multi-Channel Notifications (NotificationSystem)
- Support for Slack, Discord, Teams, webhooks, and log notifications
- Event-based notifications for backups, failures, warnings, and health issues
- Configurable notification thresholds
## Code Organization Improvements
- Extracted responsibilities into focused classes:
- ContainerValidator: Container validation logic
- BackupOrchestrator: Backup workflow orchestration
- FileSystemOperations: File I/O with comprehensive error handling
- Configuration: Centralized environment variable management
- BackupStrategy/Factory: Strategy pattern for database engines
## Testing Infrastructure
- Added comprehensive unit and integration tests
- Fixed timing-dependent test failures
- Added RSpec coverage reporting (94.94% coverage)
- Created test factories and fixtures
## Breaking Changes
- Container class constructor now requires dependency injection
- BackupCommand methods now use keyword arguments
- Thread pool implementation changed from Concurrent to SimpleThreadPool
## Configuration
New environment variables:
- BT_HEALTH_SERVER_ENABLED: Enable health check server
- BT_HEALTH_PORT/BT_HEALTH_BIND: Health server configuration
- BT_NOTIFICATION_CHANNELS: Comma-separated notification channels
- BT_ENCRYPTION_ENABLED/BT_ENCRYPTION_KEY: Backup encryption
- BT_RETENTION_DAYS/COUNT: Backup retention policies
This refactoring improves maintainability, testability, and adds enterprise-grade monitoring and operational features while maintaining backward compatibility for basic usage.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-14 22:58:26 -04:00
|
|
|
#!/usr/bin/env ruby
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require_relative 'lib/baktainer'
|
|
|
|
|
|
|
|
# Health check server runner
|
|
|
|
class HealthServerRunner
|
|
|
|
def initialize
|
|
|
|
@dependency_container = Baktainer::DependencyContainer.new.configure
|
|
|
|
@logger = @dependency_container.get(:logger)
|
|
|
|
@health_server = @dependency_container.get(:health_check_server)
|
|
|
|
end
|
|
|
|
|
|
|
|
def start
|
|
|
|
port = ENV['BT_HEALTH_PORT'] || 8080
|
|
|
|
bind = ENV['BT_HEALTH_BIND'] || '0.0.0.0'
|
|
|
|
|
|
|
|
@logger.info("Starting health check server on #{bind}:#{port}")
|
|
|
|
@logger.info("Health endpoints available:")
|
|
|
|
@logger.info(" GET / - Dashboard")
|
|
|
|
@logger.info(" GET /health - Health check")
|
|
|
|
@logger.info(" GET /status - Detailed status")
|
|
|
|
@logger.info(" GET /backups - Backup information")
|
|
|
|
@logger.info(" GET /containers - Container discovery")
|
|
|
|
@logger.info(" GET /config - Configuration (sanitized)")
|
|
|
|
@logger.info(" GET /metrics - Prometheus metrics")
|
|
|
|
|
|
|
|
begin
|
2025-07-14 23:15:26 -04:00
|
|
|
# Use Rack to run the Sinatra app
|
|
|
|
require 'rack'
|
|
|
|
require 'puma'
|
|
|
|
|
|
|
|
# Start Puma server with Rack
|
|
|
|
server = Puma::Server.new(@health_server)
|
|
|
|
server.add_tcp_listener(bind, port.to_i)
|
|
|
|
server.run.join
|
Major architectural overhaul: dependency injection, monitoring, and operational improvements
This commit represents a comprehensive refactoring and enhancement of Baktainer:
## Core Architecture Improvements
- Implemented comprehensive dependency injection system with DependencyContainer
- Fixed critical singleton instantiation bug that was returning Procs instead of service instances
- Replaced problematic Concurrent::FixedThreadPool with custom SimpleThreadPool implementation
- Achieved 100% test pass rate (121 examples, 0 failures) after fixing 30+ failing tests
## New Features Implemented
### 1. Backup Rotation & Cleanup (BackupRotation)
- Configurable retention policies by age, count, and disk space
- Automatic cleanup with comprehensive statistics tracking
- Empty directory cleanup and space monitoring
### 2. Backup Encryption (BackupEncryption)
- AES-256-CBC and AES-256-GCM encryption support
- Key derivation from passphrases or direct key input
- Encrypted backup metadata storage
### 3. Operational Monitoring Suite
- **Health Check Server**: HTTP endpoints for monitoring (/health, /status, /metrics)
- **Web Dashboard**: Real-time monitoring dashboard with auto-refresh
- **Prometheus Metrics**: Integration with monitoring systems
- **Backup Monitor**: Comprehensive metrics tracking and performance alerts
### 4. Advanced Label Validation (LabelValidator)
- Schema-based validation for all 12+ Docker labels
- Engine-specific validation rules
- Helpful error messages and warnings
- Example generation for each database engine
### 5. Multi-Channel Notifications (NotificationSystem)
- Support for Slack, Discord, Teams, webhooks, and log notifications
- Event-based notifications for backups, failures, warnings, and health issues
- Configurable notification thresholds
## Code Organization Improvements
- Extracted responsibilities into focused classes:
- ContainerValidator: Container validation logic
- BackupOrchestrator: Backup workflow orchestration
- FileSystemOperations: File I/O with comprehensive error handling
- Configuration: Centralized environment variable management
- BackupStrategy/Factory: Strategy pattern for database engines
## Testing Infrastructure
- Added comprehensive unit and integration tests
- Fixed timing-dependent test failures
- Added RSpec coverage reporting (94.94% coverage)
- Created test factories and fixtures
## Breaking Changes
- Container class constructor now requires dependency injection
- BackupCommand methods now use keyword arguments
- Thread pool implementation changed from Concurrent to SimpleThreadPool
## Configuration
New environment variables:
- BT_HEALTH_SERVER_ENABLED: Enable health check server
- BT_HEALTH_PORT/BT_HEALTH_BIND: Health server configuration
- BT_NOTIFICATION_CHANNELS: Comma-separated notification channels
- BT_ENCRYPTION_ENABLED/BT_ENCRYPTION_KEY: Backup encryption
- BT_RETENTION_DAYS/COUNT: Backup retention policies
This refactoring improves maintainability, testability, and adds enterprise-grade monitoring and operational features while maintaining backward compatibility for basic usage.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-14 22:58:26 -04:00
|
|
|
rescue Interrupt
|
|
|
|
@logger.info("Health check server stopped")
|
|
|
|
rescue => e
|
|
|
|
@logger.error("Health check server error: #{e.message}")
|
|
|
|
raise
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Start the server if this file is run directly
|
|
|
|
if __FILE__ == $0
|
|
|
|
server = HealthServerRunner.new
|
|
|
|
server.start
|
|
|
|
end
|