| # Deployment Guide - Crypto Resource Aggregator | |
| ## Quick Deployment to Hugging Face Spaces | |
| ### Method 1: Web Interface (Recommended for Beginners) | |
| 1. **Create a Hugging Face Account** | |
| - Go to https://huggingface.co/join | |
| - Sign up for a free account | |
| 2. **Create a New Space** | |
| - Go to https://huggingface.co/new-space | |
| - Choose a name (e.g., `crypto-resource-aggregator`) | |
| - Select SDK: **Docker** | |
| - Choose visibility: **Public** or **Private** | |
| - Click "Create Space" | |
| 3. **Upload Files** | |
| Upload the following files to your Space: | |
| - `app.py` - Main application file | |
| - `requirements.txt` - Python dependencies | |
| - `all_apis_merged_2025.json` - Resource configuration | |
| - `README.md` - Documentation | |
| - `Dockerfile` - Docker configuration | |
| 4. **Wait for Build** | |
| - The Space will automatically build and deploy | |
| - This may take 2-5 minutes | |
| - You'll see the build logs in real-time | |
| 5. **Access Your API** | |
| - Once deployed, your API will be available at: | |
| `https://[your-username]-[space-name].hf.space` | |
| - Example: `https://username-crypto-resource-aggregator.hf.space` | |
| ### Method 2: Git CLI (Recommended for Advanced Users) | |
| ```bash | |
| # Clone your Space repository | |
| git clone https://huggingface.co/spaces/[your-username]/[space-name] | |
| cd [space-name] | |
| # Copy all files to the repository | |
| cp app.py requirements.txt all_apis_merged_2025.json README.md Dockerfile . | |
| # Commit and push | |
| git add . | |
| git commit -m "Initial deployment of Crypto Resource Aggregator" | |
| git push | |
| ``` | |
| --- | |
| ## Alternative Deployment Options | |
| ### Option 1: Heroku | |
| ```bash | |
| # Install Heroku CLI | |
| # https://devcenter.heroku.com/articles/heroku-cli | |
| # Create a new app | |
| heroku create crypto-resource-aggregator | |
| # Create Procfile | |
| echo "web: python app.py" > Procfile | |
| # Deploy | |
| git add . | |
| git commit -m "Deploy to Heroku" | |
| git push heroku main | |
| # Open your app | |
| heroku open | |
| ``` | |
| ### Option 2: Railway | |
| ```bash | |
| # Install Railway CLI | |
| npm i -g @railway/cli | |
| # Login | |
| railway login | |
| # Initialize project | |
| railway init | |
| # Deploy | |
| railway up | |
| # Get deployment URL | |
| railway domain | |
| ``` | |
| ### Option 3: Render | |
| 1. Go to https://render.com | |
| 2. Click "New +" → "Web Service" | |
| 3. Connect your GitHub repository | |
| 4. Configure: | |
| - **Build Command**: `pip install -r requirements.txt` | |
| - **Start Command**: `python app.py` | |
| - **Environment**: Python 3 | |
| 5. Click "Create Web Service" | |
| ### Option 4: Docker (Self-Hosted) | |
| ```bash | |
| # Build the Docker image | |
| docker build -t crypto-aggregator . | |
| # Run the container | |
| docker run -d -p 7860:7860 --name crypto-aggregator crypto-aggregator | |
| # Check logs | |
| docker logs crypto-aggregator | |
| # Stop the container | |
| docker stop crypto-aggregator | |
| # Remove the container | |
| docker rm crypto-aggregator | |
| ``` | |
| ### Option 5: Docker Compose (Self-Hosted) | |
| Create `docker-compose.yml`: | |
| ```yaml | |
| version: '3.8' | |
| services: | |
| aggregator: | |
| build: . | |
| ports: | |
| - "7860:7860" | |
| restart: unless-stopped | |
| volumes: | |
| - ./history.db:/app/history.db | |
| environment: | |
| - ENVIRONMENT=production | |
| ``` | |
| Run: | |
| ```bash | |
| docker-compose up -d | |
| ``` | |
| ### Option 6: AWS EC2 | |
| ```bash | |
| # Connect to your EC2 instance | |
| ssh -i your-key.pem ubuntu@your-instance-ip | |
| # Install Python and dependencies | |
| sudo apt update | |
| sudo apt install python3-pip python3-venv -y | |
| # Create virtual environment | |
| python3 -m venv venv | |
| source venv/bin/activate | |
| # Upload files (from local machine) | |
| scp -i your-key.pem app.py requirements.txt all_apis_merged_2025.json ubuntu@your-instance-ip:~/ | |
| # Install dependencies | |
| pip install -r requirements.txt | |
| # Run with nohup | |
| nohup python app.py > output.log 2>&1 & | |
| # Or use systemd service (recommended) | |
| sudo nano /etc/systemd/system/crypto-aggregator.service | |
| ``` | |
| Create systemd service file: | |
| ```ini | |
| [Unit] | |
| Description=Crypto Resource Aggregator | |
| After=network.target | |
| [Service] | |
| User=ubuntu | |
| WorkingDirectory=/home/ubuntu/crypto-aggregator | |
| ExecStart=/home/ubuntu/venv/bin/python app.py | |
| Restart=always | |
| [Install] | |
| WantedBy=multi-user.target | |
| ``` | |
| Enable and start: | |
| ```bash | |
| sudo systemctl enable crypto-aggregator | |
| sudo systemctl start crypto-aggregator | |
| sudo systemctl status crypto-aggregator | |
| ``` | |
| ### Option 7: Google Cloud Run | |
| ```bash | |
| # Install gcloud CLI | |
| # https://cloud.google.com/sdk/docs/install | |
| # Authenticate | |
| gcloud auth login | |
| # Set project | |
| gcloud config set project YOUR_PROJECT_ID | |
| # Build and deploy | |
| gcloud run deploy crypto-aggregator \ | |
| --source . \ | |
| --platform managed \ | |
| --region us-central1 \ | |
| --allow-unauthenticated | |
| # Get URL | |
| gcloud run services describe crypto-aggregator --region us-central1 --format 'value(status.url)' | |
| ``` | |
| ### Option 8: DigitalOcean App Platform | |
| 1. Go to https://cloud.digitalocean.com/apps | |
| 2. Click "Create App" | |
| 3. Connect your GitHub repository | |
| 4. Configure: | |
| - **Run Command**: `python app.py` | |
| - **Environment**: Python 3.11 | |
| - **HTTP Port**: 7860 | |
| 5. Click "Deploy" | |
| --- | |
| ## Environment Variables (Optional) | |
| You can configure the following environment variables: | |
| ```bash | |
| # Port (default: 7860) | |
| export PORT=8000 | |
| # Log level (default: INFO) | |
| export LOG_LEVEL=DEBUG | |
| # Database path (default: history.db) | |
| export DATABASE_PATH=/path/to/history.db | |
| ``` | |
| --- | |
| ## Post-Deployment Testing | |
| ### 1. Test Health Endpoint | |
| ```bash | |
| curl https://your-deployment-url.com/health | |
| ``` | |
| Expected response: | |
| ```json | |
| { | |
| "status": "healthy", | |
| "timestamp": "2025-11-10T...", | |
| "resources_loaded": true, | |
| "database_connected": true | |
| } | |
| ``` | |
| ### 2. Test Resource Listing | |
| ```bash | |
| curl https://your-deployment-url.com/resources | |
| ``` | |
| ### 3. Test Query Endpoint | |
| ```bash | |
| curl -X POST https://your-deployment-url.com/query \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "resource_type": "market_data", | |
| "resource_name": "coingecko", | |
| "endpoint": "/simple/price", | |
| "params": { | |
| "ids": "bitcoin", | |
| "vs_currencies": "usd" | |
| } | |
| }' | |
| ``` | |
| ### 4. Test Status Monitoring | |
| ```bash | |
| curl https://your-deployment-url.com/status | |
| ``` | |
| ### 5. Run Full Test Suite | |
| From your local machine: | |
| ```bash | |
| # Update BASE_URL in test_aggregator.py | |
| # Change: BASE_URL = "http://localhost:7860" | |
| # To: BASE_URL = "https://your-deployment-url.com" | |
| # Run tests | |
| python test_aggregator.py | |
| ``` | |
| --- | |
| ## Performance Optimization | |
| ### 1. Enable Caching | |
| Add Redis for caching (optional): | |
| ```python | |
| import redis | |
| import json | |
| # Connect to Redis | |
| redis_client = redis.Redis(host='localhost', port=6379, decode_responses=True) | |
| # Cache resource data | |
| def get_cached_data(key, ttl=300): | |
| cached = redis_client.get(key) | |
| if cached: | |
| return json.loads(cached) | |
| return None | |
| def set_cached_data(key, data, ttl=300): | |
| redis_client.setex(key, ttl, json.dumps(data)) | |
| ``` | |
| ### 2. Use Connection Pooling | |
| Already implemented with `aiohttp.ClientSession` | |
| ### 3. Add Rate Limiting | |
| Install: | |
| ```bash | |
| pip install slowapi | |
| ``` | |
| Add to `app.py`: | |
| ```python | |
| from slowapi import Limiter, _rate_limit_exceeded_handler | |
| from slowapi.util import get_remote_address | |
| from slowapi.errors import RateLimitExceeded | |
| limiter = Limiter(key_func=get_remote_address) | |
| app.state.limiter = limiter | |
| app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) | |
| @app.post("/query") | |
| @limiter.limit("60/minute") | |
| async def query_resource(request: Request, query: ResourceQuery): | |
| # ... existing code | |
| ``` | |
| ### 4. Add Monitoring | |
| Use Sentry for error tracking: | |
| ```bash | |
| pip install sentry-sdk | |
| ``` | |
| ```python | |
| import sentry_sdk | |
| from sentry_sdk.integrations.fastapi import FastApiIntegration | |
| sentry_sdk.init( | |
| dsn="your-sentry-dsn", | |
| integrations=[FastApiIntegration()], | |
| traces_sample_rate=1.0, | |
| ) | |
| ``` | |
| --- | |
| ## Security Best Practices | |
| ### 1. API Key Management | |
| Store API keys in environment variables: | |
| ```python | |
| import os | |
| API_KEYS = { | |
| 'etherscan': os.getenv('ETHERSCAN_API_KEY', 'default-key'), | |
| 'coinmarketcap': os.getenv('CMC_API_KEY', 'default-key'), | |
| } | |
| ``` | |
| ### 2. Enable HTTPS | |
| Most platforms (Hugging Face, Heroku, etc.) provide HTTPS by default. | |
| For self-hosted, use Let's Encrypt: | |
| ```bash | |
| # Install Certbot | |
| sudo apt install certbot python3-certbot-nginx | |
| # Get certificate | |
| sudo certbot --nginx -d your-domain.com | |
| ``` | |
| ### 3. Add Authentication (Optional) | |
| ```bash | |
| pip install python-jose[cryptography] passlib[bcrypt] | |
| ``` | |
| ```python | |
| from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials | |
| from fastapi import Security | |
| security = HTTPBearer() | |
| @app.post("/query") | |
| async def query_resource( | |
| query: ResourceQuery, | |
| credentials: HTTPAuthorizationCredentials = Security(security) | |
| ): | |
| # Verify token | |
| if credentials.credentials != "your-secret-token": | |
| raise HTTPException(status_code=401, detail="Invalid token") | |
| # ... existing code | |
| ``` | |
| --- | |
| ## Monitoring & Maintenance | |
| ### 1. Monitor Logs | |
| Hugging Face Spaces: | |
| - View logs in the Space settings → "Logs" tab | |
| Docker: | |
| ```bash | |
| docker logs -f crypto-aggregator | |
| ``` | |
| Systemd: | |
| ```bash | |
| journalctl -u crypto-aggregator -f | |
| ``` | |
| ### 2. Database Maintenance | |
| Backup database regularly: | |
| ```bash | |
| # Local backup | |
| cp history.db history_backup_$(date +%Y%m%d).db | |
| # Remote backup | |
| scp user@server:/path/to/history.db ./backups/ | |
| ``` | |
| Clean old records: | |
| ```sql | |
| -- Remove records older than 30 days | |
| DELETE FROM query_history WHERE timestamp < datetime('now', '-30 days'); | |
| DELETE FROM resource_status WHERE last_check < datetime('now', '-30 days'); | |
| ``` | |
| ### 3. Update Resources | |
| To add new resources, update `all_apis_merged_2025.json` and redeploy. | |
| ### 4. Health Checks | |
| Set up automated health checks: | |
| ```bash | |
| # Cron job (every 5 minutes) | |
| */5 * * * * curl https://your-deployment-url.com/health || echo "API is down!" | |
| ``` | |
| Use UptimeRobot or similar service for monitoring. | |
| --- | |
| ## Troubleshooting | |
| ### Issue: Server won't start | |
| **Solution:** | |
| ```bash | |
| # Check if port 7860 is in use | |
| lsof -i :7860 | |
| # Kill existing process | |
| kill -9 $(lsof -t -i:7860) | |
| # Or use a different port | |
| PORT=8000 python app.py | |
| ``` | |
| ### Issue: Database locked | |
| **Solution:** | |
| ```bash | |
| # Stop all instances | |
| pkill -f app.py | |
| # Remove lock (if exists) | |
| rm history.db-journal | |
| # Restart | |
| python app.py | |
| ``` | |
| ### Issue: High memory usage | |
| **Solution:** | |
| - Add connection limits | |
| - Implement request queuing | |
| - Scale horizontally with multiple instances | |
| ### Issue: API rate limits | |
| **Solution:** | |
| - Implement caching | |
| - Add multiple API keys for rotation | |
| - Use fallback resources | |
| --- | |
| ## Scaling | |
| ### Horizontal Scaling | |
| Use a load balancer with multiple instances: | |
| ```yaml | |
| # docker-compose-scaled.yml | |
| version: '3.8' | |
| services: | |
| aggregator: | |
| build: . | |
| deploy: | |
| replicas: 3 | |
| environment: | |
| - WORKER_ID=${HOSTNAME} | |
| nginx: | |
| image: nginx:alpine | |
| ports: | |
| - "80:80" | |
| volumes: | |
| - ./nginx.conf:/etc/nginx/nginx.conf | |
| depends_on: | |
| - aggregator | |
| ``` | |
| ### Vertical Scaling | |
| Increase resources on your hosting platform: | |
| - Hugging Face: Upgrade to paid tier | |
| - AWS: Use larger EC2 instance | |
| - Docker: Adjust container resources | |
| --- | |
| ## Support | |
| For issues or questions: | |
| 1. Check `/health` endpoint | |
| 2. Review application logs | |
| 3. Test individual resources with `/status` | |
| 4. Verify database with SQLite browser | |
| --- | |
| ## Next Steps | |
| After deployment: | |
| 1. **Integrate with your main app** using the provided client examples | |
| 2. **Set up monitoring** with health checks and alerts | |
| 3. **Configure backups** for the history database | |
| 4. **Add custom resources** by updating the JSON file | |
| 5. **Implement caching** for frequently accessed data | |
| 6. **Enable authentication** if needed for security | |
| --- | |
| **Congratulations! Your Crypto Resource Aggregator is now deployed and ready to use!** 🚀 | |