# Cloud Backup Implementation Plan (Complete) ## 1. Frontend Implementation (Flutter) - [x] **ApiService Updates**: Added `uploadBackup` and `downloadBackup` methods to interact with the backend (endpoints `/backups/upload` and `/backups/download`). - [x] **LocalKeyBackupService Refactor**: - [x] Updated `createEncryptedBackup` to accept `includeKeys` and `includeMessages` flags. - [x] Added `uploadToCloud` method which **defaults to Messages Only** (no keys) for security. - [x] Added `restoreFromCloud` method to fetch and decrypt backups. - [x] **UI Overhaul (LocalBackupScreen)**: - [x] Added "Cloud Mode" vs "Local Mode" toggle. - [x] Implemented "Zero Knowledge" warning UI when Cloud Mode is active (keys excluded by default). - [x] Added visual cues for "Secure Mode". - [x] Integrated `uploadToCloud` and `restoreFromCloud` calls with progress indicators and error handling. ## 2. Backend Implementation (Go) - [x] **Database Schema**: Created migration `000003_e2ee_backup_recovery.up.sql` for: - `cloud_backups` table (stores encrypted blobs). - `backup_preferences` table. - `user_devices` table. - `sync_codes` table. - `recovery_guardians` and `recovery_sessions` tables (for future social recovery). - [x] **API Endpoints**: - `POST /backups/upload`: Accepts encrypted blob, metadata, and version. - `GET /backups/download`: Retrieves latest backup. - `GET /backups/download/:backup_id`: Retrieves specific backup. - [x] **Data Models**: Defined `CloudBackup`, `UploadBackupRequest`, `DownloadBackupResponse` structs matching frontend expectations. - [x] **Handler Logic**: Implemented "blind storage" logic - backend stores opaque blobs and does not attempt decryption. ## 3. Deployment Status (Pending) - [x] **Compilation**: Successfully compiled `sojorn-api-linux` and `migrate-linux` binaries locally. - [ ] **Upload**: Failed to upload binaries to VPS (`194.238.28.122`) due to SSH authentication failure ("Permission denied") with provided credentials. - [ ] **Migration**: Database migration failed from local machine due to port 5432 being closed/filtered. Needs to be run from the VPS. - [ ] **Restart**: Service restart pending successful SSH access. ## 4. Next Steps Once SSH access is restored (verify password or add public key): 1. **Upload Binaries**: `scp sojorn-api-linux migrate-linux root@194.238.28.122:/root/` 2. **Run Migration**: `ssh root@... "./migrate-linux -path ... up"` 3. **Restart Service**: `ssh root@... "systemctl restart sojorn-api"`