# Tasks: simple-deployment

## Implementation Tasks

### 1. Create deployment script structure
- [x] Create `scripts/` directory in project root if it doesn't exist
- [x] Create `scripts/deploy.sh` with proper shebang and execution permissions
- [x] Add basic script structure with functions for connection, upload, and error handling
- **Validates**: Script file exists and is executable

### 2. Implement prerequisite checks
- [x] Check for existence and non-empty state of `public/` directory
- [x] Verify `rsync` is installed and available in PATH
- [x] Check that `SSH_USER` and `SSH_HOST` environment variables are set
- [x] Display clear error messages for any missing prerequisites
- **Validates**: Script exits early with helpful errors when prerequisites are missing

### 3. Implement SSH/rsync connection logic
- [x] Configure rsync to connect using SSH_USER and SSH_HOST
- [x] Support configurable SSH_PORT (defaults to 22)
- [x] Support configurable REMOTE_ROOT (defaults to /httpsdocs)
- [x] Use SSH key-based authentication for secure, password-less access
- **Validates**: Script can establish SSH connection with correct credentials

### 4. Implement file sync functionality
- [x] Use rsync command to sync `public/` contents to remote directory
- [x] Configure sync to preserve file permissions and timestamps (-a flag)
- [x] Enable compression during transfer (-z flag)
- [x] Implement mirror behavior with --delete flag (removes remote files not present locally)
- [x] Handle all file types appropriately
- **Validates**: All files from public/ are correctly synced to the remote directory and old files are removed

### 5. Add progress and status reporting
- [x] Display connection status messages
- [x] Show sync progress through rsync verbose output
- [x] Report sync completion with summary
- [x] Ensure SSH keys or passwords are never displayed in output
- **Validates**: User receives clear feedback during deployment process

### 6. Implement error handling
- [x] Catch connection failures with descriptive error messages
- [x] Handle partial upload failures gracefully
- [x] Provide actionable error messages for common failure scenarios
- [x] Set appropriate exit codes (0 for success, non-zero for failures)
- **Validates**: Script handles errors gracefully and provides useful feedback

### 7. Add script documentation
- [x] Add header comments explaining script purpose and usage
- [x] Document required environment variables (SSH_USER, SSH_HOST, SSH_PORT, REMOTE_ROOT)
- [x] Include example usage in comments
- [x] Add inline comments for rsync command options
- **Validates**: Script is self-documenting for future maintenance

### 8. Update project documentation
- [x] Add deployment section to README.md or create DEPLOYMENT.md
- [x] Document environment variable setup process
- [x] Provide example deployment workflow (build → deploy)
- [x] Include troubleshooting tips for common issues
- **Validates**: User documentation exists and covers deployment process

### 9. Test deployment script
- [x] Test with missing prerequisites (no public/, no rsync, no SSH_USER/SSH_HOST)
- [x] Test with SSH authentication issues
- [x] Test successful deployment with valid credentials and SSH keys
- [x] Verify synced files match local public/ directory
- [x] Verify remote files are deleted when removed locally (mirror behavior)
- **Validates**: Script behaves correctly in success and failure scenarios

### 10. Create .gitignore entry for environment files
- [x] Ensure .env files are ignored if user creates them locally
- [x] Verify credentials cannot be accidentally committed
- **Validates**: Git ignores any credential-containing files

## Dependency Notes
- Tasks 1-2 must complete before task 3
- Tasks 3-4 must complete before task 5
- Task 6 can be implemented in parallel with tasks 3-5
- Tasks 7-8 can be done after core implementation (tasks 1-6)
- Task 9 requires all implementation tasks (1-6) to be complete
- Task 10 can be done at any time

## Testing Strategy
Manual testing is sufficient for this change:
1. Test prerequisite checks by intentionally removing prerequisites
2. Test with invalid credentials to verify error handling
3. Test successful deployment to production server
4. Verify all files are present and correct on server after deployment
5. Test script output for clarity and absence of credential exposure
