# Storage Configuration Guide Sharey supports multiple storage backends for maximum flexibility. You can choose between cloud storage (Backblaze B2) or local filesystem storage. ## 🔄 How to Choose Storage Type ### **Quick Method: Edit config.json** 1. Open your `config.json` file 2. Find the `"storage"` section 3. Change `"backend"` to either `"local"` or `"b2"` ```json { "storage": { "backend": "local" // Change this to "local" or "b2" } } ``` ### **Interactive Method** ```bash python src/config_util.py set # Interactive setup python src/config_util.py validate # Verify configuration python test_storage.py # Test the backend ``` ### **Environment Variable Method** ```bash export STORAGE_BACKEND=local # or "b2" ``` ## 📊 Storage Backend Comparison | Feature | **Local Storage** | **B2 Cloud Storage** | |---------|------------------|-------------------| | **Setup Difficulty** | ✅ Easy | ⚠️ Requires B2 account | | **Cost** | ✅ Free | 💰 ~$0.005/GB/month | | **Speed** | ✅ Very fast | ⚠️ Network dependent | | **Reliability** | ⚠️ Single machine | ✅ Cloud redundancy | | **Scalability** | ⚠️ Disk space limited | ✅ Unlimited | | **Best for** | Development, self-hosting | Production, scaling | ## Storage Backends ### 1. Backblaze B2 (Cloud Storage) - ✅ **Best for production deployments** - ✅ **Scalable and reliable** - ✅ **No local disk space requirements** - ❌ **Requires B2 account and credentials** ### 2. Local Filesystem - ✅ **No external dependencies** - ✅ **Fast access** - ✅ **No cloud costs** - ❌ **Limited by local disk space** - ❌ **Not suitable for distributed deployments** ## Configuration Details ## Configuration Details ### Option 1: config.json (Recommended) ```json { "storage": { "backend": "b2", // "b2" or "local" "local_path": "storage" // Path for local storage (only used if backend is "local") }, "b2": { "application_key_id": "your_key_id_here", "application_key": "your_application_key_here", "bucket_name": "your_bucket_name_here" } } ``` ### Option 2: Environment Variables ```bash # Storage configuration export STORAGE_BACKEND=local export STORAGE_LOCAL_PATH=./my_storage # B2 configuration (only needed if using B2) export B2_APPLICATION_KEY_ID=your_key_id_here export B2_APPLICATION_KEY=your_application_key_here export B2_BUCKET_NAME=your_bucket_name_here ``` ## 🚀 Quick Start Guide ### **For Development/Testing (Local Storage)** ```bash # 1. Edit config.json { "storage": { "backend": "local" } } # 2. Test it python test_storage.py # 3. Start the app python run.py ``` Files will be stored in the `storage/` directory. ### **For Production (B2 Cloud Storage)** ```bash # 1. Get B2 credentials from backblaze.com # 2. Edit config.json { "storage": { "backend": "b2" }, "b2": { "application_key_id": "your_key_id", "application_key": "your_key", "bucket_name": "your_bucket" } } # 3. Test it python test_storage.py # 4. Start the app python run.py ``` ## Setup Examples ### Using Local Storage 1. **Edit config.json:** ```json { "storage": { "backend": "local", "local_path": "storage" } } ``` 2. **Start the application:** ```bash python run.py ``` The application will automatically create the `storage` directory and subdirectories as needed. ### Using Backblaze B2 1. **Create a B2 account** at [backblaze.com](https://www.backblaze.com/b2/) 2. **Create a bucket** and application key with read/write permissions 3. **Edit config.json:** ```json { "storage": { "backend": "b2" }, "b2": { "application_key_id": "your_actual_key_id", "application_key": "your_actual_key", "bucket_name": "your_bucket_name" } } ``` 4. **Start the application:** ```bash python run.py ``` ## Interactive Configuration Use the configuration utility for easy setup: ```bash # Configure storage interactively python src/config_util.py set # Validate your configuration python src/config_util.py validate # Show current configuration python src/config_util.py show ``` ## Testing Storage Test your storage configuration: ```bash # Test storage backend python test_storage.py ``` This will: - ✅ Initialize the storage backend - ✅ Upload a test file - ✅ Download and verify the file - ✅ Test file operations (exists, size, list) - ✅ Clean up test files ## Migration Between Backends ### From B2 to Local Storage 1. **Download your data** from B2 (optional - keep as backup) 2. **Update config.json:** ```json { "storage": { "backend": "local", "local_path": "storage" } } ``` 3. **Restart the application** **Note:** Existing files in B2 won't be automatically transferred. URLs will break unless you migrate the data. ### From Local to B2 Storage 1. **Set up B2 bucket and credentials** 2. **Update config.json:** ```json { "storage": { "backend": "b2" }, "b2": { "application_key_id": "your_key_id", "application_key": "your_key", "bucket_name": "your_bucket" } } ``` 3. **Restart the application** **Migration Script (Optional):** If you want to migrate existing local files to B2, create a simple script: ```python #!/usr/bin/env python3 import os from pathlib import Path from src.storage import LocalStorageBackend, B2StorageBackend # Initialize both backends local = LocalStorageBackend("storage") b2 = B2StorageBackend("key_id", "key", "bucket_name") # Migrate files for file_path in local.list_files(): print(f"Migrating: {file_path}") content = local.download_file(file_path) b2.upload_file(content, file_path) print(f"✅ Migrated: {file_path}") ``` ## Directory Structure ### Local Storage Structure ``` storage/ ├── files/ │ ├── abc123.jpg │ ├── def456.pdf │ └── ... └── pastes/ ├── xyz789.txt ├── uvw012.txt └── ... ``` ### B2 Storage Structure ``` bucket/ ├── files/ │ ├── abc123.jpg │ ├── def456.pdf │ └── ... └── pastes/ ├── xyz789.txt ├── uvw012.txt └── ... ``` ## Performance Considerations ### Local Storage - **Pros:** Very fast access, no network latency - **Cons:** Limited by disk I/O, single point of failure ### B2 Storage - **Pros:** Unlimited capacity, built-in redundancy, CDN capabilities - **Cons:** Network latency, dependent on internet connection ## Security ### Local Storage - Files are stored with filesystem permissions - Secure as your server's filesystem - Access controlled by Sharey application ### B2 Storage - Files stored with B2's encryption at rest - Access controlled by application keys - Private bucket - files not publicly accessible - All access proxied through Sharey application ## Troubleshooting ### Common Issues **"Storage backend not initialized"** - Check your configuration syntax - Verify credentials (for B2) - Run `python test_storage.py` **"B2 authentication failed"** - Verify your application key ID and key - Check bucket name spelling - Ensure key has read/write permissions **"Permission denied" (Local storage)** - Check filesystem permissions on storage directory - Ensure Sharey has write access to the path **"File not found"** - Check if storage backend was changed without migration - Verify file was uploaded successfully ### Debug Commands ```bash # Test storage backend python test_storage.py # Validate configuration python src/config_util.py validate # Check application logs tail -f logs/sharey.log # Test B2 connection (if using B2) python tests/test_b2.py ``` ## Best Practices 1. **Production:** Use B2 for scalability and reliability 2. **Development:** Local storage is fine for testing 3. **Backup:** Consider periodic backups regardless of backend 4. **Monitoring:** Monitor disk space (local) or B2 costs (cloud) 5. **Security:** Use environment variables for sensitive credentials in production ## Cost Considerations ### Local Storage - **Cost:** Server disk space and bandwidth - **Scaling:** Limited by hardware ### B2 Storage - **Storage:** $0.005/GB/month - **Download:** $0.01/GB - **API calls:** Mostly free (10,000 free per day) - **Scaling:** Pay as you grow For most small to medium deployments, B2 costs are minimal (under $5/month for moderate usage).