376 lines
8.2 KiB
Markdown
376 lines
8.2 KiB
Markdown
# 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).
|