## Dashboard Improvements
### 1. Add Time to Next Backup Display
- Add new `/next-backup` endpoint with cron schedule parsing
- Display time until next backup in human-readable format (e.g., "16 hours")
- Show formatted next backup time (e.g., "07:00am")
- Add next backup info to System Health card with schedule details
- Include format_time_until helper for readable time formatting
### 2. Reorganize Dashboard Layout
- Move "Discovered Containers" section above "Recent Backups"
- Improve workflow by showing monitored containers before backup history
- Better logical flow for users checking system status
### 3. Add Pagination to Recent Backups
- Implement client-side pagination with 10 backups per page
- Add pagination controls with Previous/Next buttons and page info
- Show "Page X of Y" information when multiple pages exist
- Hide pagination when 10 or fewer backups exist
- Maintain all existing backup display functionality
### 4. Load Historical Backups on Startup
- BackupMonitor now scans existing .meta files on initialization
- Loads historical backup data from metadata files into backup history
- Estimates duration for historical backups based on file size
- Maintains chronological order and 1000-record memory limit
- Dashboard now shows complete backup history immediately
### Technical Changes
- Add loadNextBackupTime() function with auto-refresh
- Implement displayBackupsPage() with pagination logic
- Add CSS classes for pagination styling
- Update refreshAll() to include next backup time
- Remove duplicate loadRecentBackups functions
- Add proper error handling for all new endpoints
Dashboard now provides comprehensive backup monitoring with improved
user experience and complete historical data visibility.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Handle both string and hash formats for container.info['State']
- Add fallback to container.json['State'] when needed
- Fix "Container not running" error when containers are actually running
- Support multiple Docker API response formats
The Docker API gem can return State as either:
- A simple string: "running"
- A hash: {"Status": "running", "Running": true, ...}
This fix ensures compatibility with different Docker daemon versions
and API response formats.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Move get_recent_backups, get_failed_backups, and get_container_backup_history methods to public section
- Remove duplicate methods that were incorrectly placed in private section
- Health check server endpoints now fully functional
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add get_recent_backups method to return recent backup history
- Add get_failed_backups method to return failed backup history
- Add get_container_backup_history method for container-specific history
- All methods are thread-safe with mutex synchronization
- Methods return data in reverse chronological order (newest first)
This fixes the 'undefined method get_recent_backups' error in health endpoints.
- Replace Sinatra run! calls with direct Puma::Server usage
- Use Rack-compatible approach to avoid Sinatra::Wrapper issues
- Remove problematic set method calls and run! method calls
- Both integrated and standalone health servers now use same Puma/Rack approach
- Remove outdated baktainer/logger require from main file
This should resolve the undefined method errors with Sinatra::Wrapper.
- Replace hardcoded timestamps with regex patterns in integration tests
- Use dynamic file discovery instead of exact filenames in unit tests
- Change timestamp pattern from specific values to \d{10} regex for 10-digit unix timestamps
- Update backup file assertions to use Dir.glob and pattern matching
- Ensure tests are robust across different execution environments and times
This resolves intermittent test failures caused by timestamp variations
between test runs and different execution contexts.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement complete test suite with 63 examples (49 unit + 14 integration tests)
- Add RSpec, FactoryBot, WebMock, and SimpleCov testing dependencies
- Create mocked integration tests eliminating need for real Docker containers
- Fix SQLite method signature to accept login/password parameters
- Enhance container discovery to handle nil labels gracefully
- Add test coverage reporting and JUnit XML output for CI
- Update GitHub Actions workflow to run tests before Docker builds
- Add Ruby 3.3 setup with gem caching for faster CI execution
- Create CI test script and comprehensive testing documentation
- Ensure Docker builds only proceed when all tests pass
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>