85 lines
2.4 KiB
Markdown
85 lines
2.4 KiB
Markdown
# Database Persistence
|
|
|
|
## Overview
|
|
|
|
AtlasOS now supports SQLite-based database persistence for configuration and state management. The database layer is optional - if no database path is provided, the system operates in in-memory mode (data is lost on restart).
|
|
|
|
## Configuration
|
|
|
|
Set the `ATLAS_DB_PATH` environment variable to enable database persistence:
|
|
|
|
```bash
|
|
export ATLAS_DB_PATH=/var/lib/atlas/atlas.db
|
|
./atlas-api
|
|
```
|
|
|
|
If not set, the system defaults to `data/atlas.db` in the current directory.
|
|
|
|
## Database Schema
|
|
|
|
The database includes tables for:
|
|
|
|
- **users** - User accounts and authentication
|
|
- **audit_logs** - Audit trail with indexes for efficient querying
|
|
- **smb_shares** - SMB/CIFS share configurations
|
|
- **nfs_exports** - NFS export configurations
|
|
- **iscsi_targets** - iSCSI target configurations
|
|
- **iscsi_luns** - iSCSI LUN mappings
|
|
- **snapshot_policies** - Automated snapshot policies
|
|
|
|
## Current Status
|
|
|
|
✅ **Database Infrastructure**: Complete
|
|
- SQLite database connection and migration system
|
|
- Schema definitions for all entities
|
|
- Optional database mode (falls back to in-memory if not configured)
|
|
|
|
⏳ **Store Migration**: In Progress
|
|
- Stores currently use in-memory implementations
|
|
- Database-backed implementations can be added incrementally
|
|
- Pattern established for migration
|
|
|
|
## Migration Pattern
|
|
|
|
To migrate a store to use the database:
|
|
|
|
1. Add database field to store struct
|
|
2. Update `New*Store()` to accept `*db.DB` parameter
|
|
3. Implement database queries in CRUD methods
|
|
4. Update `app.go` to pass database to store constructor
|
|
|
|
Example pattern:
|
|
|
|
```go
|
|
type UserStore struct {
|
|
db *db.DB
|
|
mu sync.RWMutex
|
|
// ... other fields
|
|
}
|
|
|
|
func NewUserStore(db *db.DB, auth *Service) *UserStore {
|
|
// Initialize with database
|
|
}
|
|
|
|
func (s *UserStore) Create(...) (*User, error) {
|
|
// Use database instead of in-memory map
|
|
_, err := s.db.Exec("INSERT INTO users ...")
|
|
// ...
|
|
}
|
|
```
|
|
|
|
## Benefits
|
|
|
|
- **Persistence**: Configuration survives restarts
|
|
- **Audit Trail**: Historical audit logs preserved
|
|
- **Scalability**: Can migrate to PostgreSQL/MySQL later
|
|
- **Backup**: Simple file-based backup (SQLite database file)
|
|
|
|
## Next Steps
|
|
|
|
1. Migrate user store to database (highest priority for security)
|
|
2. Migrate audit log store (for historical tracking)
|
|
3. Migrate storage service stores (SMB/NFS/iSCSI)
|
|
4. Migrate snapshot policy store
|
|
5. Add database backup/restore utilities
|