🎉 Version 2.3.0 - Backup & Restore System
This release introduces a comprehensive backup and restore system with scheduled backups, automatic retention management, and complete data portability.
✨ New Features
🔐 Complete Backup & Restore System
- Encrypted Backups: AES-256-GCM encryption with PBKDF2 key derivation
- Complete Data Export: Database + secrets + metadata in a single encrypted file
- Password Protection: User-defined passwords for backup encryption (not stored anywhere)
- Portable Backups: Move backups between different servers and Docker installations
- Automatic Restart: Application automatically restarts after restore (production/Docker)
⏰ Scheduled Backups
- Configurable Intervals: Hourly, Daily, or Weekly backup schedules
- Automatic Execution: Background scheduler checks every 60 seconds for due backups
- Retention Management: Automatically keeps N most recent scheduled backups
- Separate Tracking: Manual vs scheduled backups tracked separately
- Persistent Settings: Backup schedule configuration stored in database
📦 Backup Management UI
- Dedicated Settings Tab: New Backup tab in Settings page
- Backup List: View, download, and manage all existing backups
- One-Click Operations: Create, restore, download, and delete backups
- Progress Indicators: Loading states and status messages for all operations
- Backup Metadata: View timestamp, size, type (manual/scheduled), and app version
🔧 System Management
- Manual Restart Endpoint: API endpoint for graceful application restart
- Backup Password Salvage: Preserves backup passwords when recovering from malformed secrets
- Defensive Error Handling: Multiple layers of error handling for file operations
🛠️ Technical Improvements
Backend
- New
BackupSchedulerservice for automatic scheduled backups - New
BackupSettingsdatabase model for schedule persistence - Enhanced
LifecycleServicewith exit code 42 for launcher-managed restarts - Backup files stored in
backups/manual/andbackups/scheduled/directories - Rate limiting on backup/restore/restart endpoints
Frontend
- React Query hooks with optimistic updates
- Zod schemas for backup settings validation
- Typed API client functions for all backup operations
- Themed components matching existing UI design
Security
- Double encryption: Service API keys encrypted in DB, then encrypted again in backup
- Password-based backup access with PBKDF2 key derivation
- Rate limiting protection on sensitive endpoints
- No backup passwords stored or logged
📚 Documentation
- BACKUP_RESTORE.md: Comprehensive 664-line guide covering:
- Feature overview and usage instructions
- Security considerations and best practices
- Troubleshooting common issues
- API usage examples
- Migration workflows between servers
🔄 Database Changes
New BackupSettings model:
```prisma
model BackupSettings {
id Int @id @default(1)
enabled Boolean @default(false)
intervalType BackupIntervalType @default(DISABLED)
intervalValue Int @default(24)
retentionCount Int @default(7)
lastRunAt DateTime?
nextRunAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedat
}
enum BackupIntervalType {
DISABLED
HOURLY
DAILY
WEEKLY
}
```
🐛 Bug Fixes
- Fixed TypeScript production build errors in authentication hooks
- Moved 401 error handling to useEffect to comply with React rules
- Fixed backup password preservation when recovering from invalid JSON
- Removed redundant optional chaining in user display components
- Added explicit return types to prevent type inference issues
📋 API Endpoints
New endpoints added:
- `GET /api/backup` - List all backups
- `POST /api/backup/create` - Create manual backup
- `POST /api/backup/restore` - Restore from uploaded file
- `POST /api/backup/restore-from-file` - Restore from server-side backup
- `GET /api/backup/:id/download` - Download backup by ID
- `DELETE /api/backup/:id` - Delete backup
- `GET /api/backup/settings` - Get backup settings
- `PUT /api/backup/settings` - Update backup settings
- `POST /api/system/restart` - Manual restart endpoint
🔧 Breaking Changes
None. This is a purely additive release with full backward compatibility.
🐳 Docker Images
Published to:
- Docker Hub: `khak1s/arr-dashboard:2.3.0`, `khak1s/arr-dashboard:latest`
- GitHub Container Registry: `ghcr.io/kha-kis/arr-dashboard:2.3.0`, `ghcr.io/kha-kis/arr-dashboard:latest`
Both `linux/amd64` and `linux/arm64` platforms supported.
📥 Installation
Docker (Recommended)
```bash
docker pull khak1s/arr-dashboard:2.3.0
docker run -d
--name arr-dashboard
-p 3000:3000
-v /path/to/data:/app/data
khak1s/arr-dashboard:2.3.0
```
Unraid
Update the template to version 2.3.0 or use the Community Applications auto-update feature.
🙏 Contributors
- @Kha-kis
- AI-assisted development with Claude Code
Full Changelog: v2.2.0...v2.3.0