GabeDA DevOps Expert
Purpose
Provide expert guidance for deploying, managing, and troubleshooting GabeDA's full-stack infrastructure across Railway (backend) and Render (frontend). Handle environment configuration, CORS setup, deployment automation, monitoring, and production optimizations.
Key Capabilities:
- Deploy backend (Django/PostgreSQL/Redis) to Railway
- Deploy frontend (React/Vite) to Render
- Configure environment variables and secrets
- Debug CORS, build failures, and connectivity issues
- Set up monitoring and logging
- Implement continuous deployment workflows
- Scale services and optimize performance
When to Invoke
Use this skill when:
- Deploying backend or frontend to production
- Fixing deployment failures (CORS, build errors, 404s)
- Configuring environment variables or secrets
- Troubleshooting production issues
- Setting up monitoring or alerts
- Implementing continuous deployment
- Scaling services or optimizing costs
- Need deployment best practices
Input required: Service to deploy (backend/frontend), issue description, or infrastructure task
GabeDA Infrastructure Overview
Current Stack
Backend (Railway):
- Platform: Railway Hobby Plan ($5/month)
- URL: https://gabedabe-production.up.railway.app
- Framework: Django 5.1 + Django REST Framework
- Database: PostgreSQL (Railway-managed)
- Cache: Redis (Railway-managed)
- Workers: Celery (for async tasks)
- Python: 3.11
Frontend (Render):
- Platform: Render Free Tier (Static Site)
- URL: https://gabedabe-frontend.onrender.com
- Framework: React 18 + TypeScript + Vite
- Build: npm run build → dist/
- Node: 22.x
Repositories:
- Backend: https://github.com/Brownbull/gabeda_backend
- Frontend: https://github.com/Brownbull/gabeda_frontend
Architecture Diagram
┌─────────────────────────────────────────────────────────────┐
│ User Browser │
└───────────────────────┬─────────────────────────────────────┘
│ HTTPS
▼
┌─────────────────────────────────────────────────────────────┐
│ Render (Frontend - Static Site) │
│ https://gabedabe-frontend.onrender.com │
│ ├─ React SPA (built with Vite) │
│ ├─ Environment: VITE_API_URL │
│ └─ Auto-deploy on git push │
└───────────────────────┬─────────────────────────────────────┘
│ API Calls (CORS-enabled)
▼
┌─────────────────────────────────────────────────────────────┐
│ Railway (Backend - Web Service) │
│ https://gabedabe-production.up.railway.app │
│ ├─ Django REST API │
│ ├─ Gunicorn (2 workers) │
│ ├─ Environment: DJANGO_SETTINGS_MODULE=production │
│ └─ Auto-deploy on git push │
└───────────┬──────────────────────────┬──────────────────────┘
│ │
▼ ▼
┌───────────────┐ ┌──────────────┐
│ PostgreSQL │ │ Redis │
│ (Railway) │ │ (Railway) │
└───────────────┘ └──────────────┘
Deployment Workflows
1. Backend Deployment (Railway)
Prerequisites
- Railway account with Hobby plan ($5/month)
- Railway CLI installed:
npm install -g @railway/cli - Backend code pushed to GitHub
Initial Deployment Steps
# 1. Navigate to backend folder
cd C:/Projects/play/gabeda_backend
# 2. Initialize Railway project (first time only)
railway init
# 3. Add PostgreSQL
railway add --plugin postgresql
# 4. Add Redis
railway add --plugin redis
# 5. Set environment variables
railway variables --set DJANGO_SETTINGS_MODULE="config.settings.production"
railway variables --set DEBUG="False"
railway variables --set SECRET_KEY="your-secret-key-here"
railway variables --set ALLOWED_HOSTS="gabedabe-production.up.railway.app"
railway variables --set CORS_ALLOWED_ORIGINS="http://localhost:5173,https://gabedabe-frontend.onrender.com"
# 6. Deploy
railway up
Configuration Files Required
railway.toml:
[build]
builder = "nixpacks"
[deploy]
startCommand = "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn config.wsgi:application --bind 0.0.0.0:$PORT --workers 2 --timeout 120"
runtime.txt:
python-3.11
Procfile:
web: python manage.py migrate && python manage.py collectstatic --noinput && gunicorn config.wsgi:application --bind 0.0.0.0:$PORT --workers 2 --timeout 120
worker: celery -A config worker --loglevel=info --concurrency=2
Environment Variables
| Variable | Value | Purpose |
|---|---|---|
DJANGO_SETTINGS_MODULE |
config.settings.production |
Load production settings |
SECRET_KEY |
Random 50-char string | Django secret key |
DEBUG |
False |
Disable debug mode |
ALLOWED_HOSTS |
gabedabe-production.up.railway.app |
Allowed hostnames |
DATABASE_URL |
Auto-provided by Railway | PostgreSQL connection |
REDIS_URL |
Auto-provided by Railway | Redis connection |
CORS_ALLOWED_ORIGINS |
http://localhost:5173,https://gabedabe-frontend.onrender.com |
CORS whitelist |
2. Frontend Deployment (Render)
Prerequisites
- Render account (free tier)
- Frontend code pushed to GitHub
Deployment Steps
Via Render Dashboard:
- Go to https://dashboard.render.com/
- Click "New +" → "Static Site"
- Connect to GitHub repo:
Brownbull/gabeda_frontend - Configure:
- Name: gabedabe-frontend
- Branch: main
- Build Command:
npm run build - Publish Directory:
dist
- Add environment variable:
- Key:
VITE_API_URL - Value:
https://gabedabe-production.up.railway.app/api
- Key:
- Click "Create Static Site"
Configuration Files Required
render.yaml (optional, for infrastructure-as-code):
services:
- type: web
name: gabedabe-frontend
env: static
buildCommand: npm run build
staticPublishPath: ./dist
envVars:
- key: VITE_API_URL
value: https://gabedabe-production.up.railway.app/api
public/_redirects (for React Router):
/* /index.html 200
Environment Variables
| Variable | Value | Purpose |
|---|---|---|
VITE_API_URL |
https://gabedabe-production.up.railway.app/api |
Backend API URL |
VITE_APP_NAME |
GabeDA |
Application name |
Important: Vite injects environment variables at build time, so any changes require a rebuild!
Troubleshooting Guide
Backend Issues
Issue: CORS Errors
Symptom: Browser console shows "blocked by CORS policy"
Diagnosis:
# Test CORS preflight
curl -v -X OPTIONS https://gabedabe-production.up.railway.app/api/accounts/auth/register/ \
-H "Origin: https://gabedabe-frontend.onrender.com" \
-H "Access-Control-Request-Method: POST"
Expected: Access-Control-Allow-Origin: https://gabedabe-frontend.onrender.com
Fixes:
Check CORS_ALLOWED_ORIGINS:
railway variables # Should show: CORS_ALLOWED_ORIGINS=http://localhost:5173,https://gabedabe-frontend.onrender.comUpdate if incorrect:
railway variables --set CORS_ALLOWED_ORIGINS="http://localhost:5173,https://gabedabe-frontend.onrender.com"Common mistakes:
- Trailing slashes (❌
https://example.com/) - Missing
http://orhttps:// - Spaces in comma-separated list
- Typos in domain name
- Trailing slashes (❌
Wait 30 seconds for Railway auto-redeploy after variable change
See: references/cors_troubleshooting.md
Issue: Build Failures
Symptom: Railway build fails with errors
Common Causes:
Python version mismatch:
- Ensure
runtime.txtspecifiespython-3.11 - Check
requirements.txtfor Python 3.12+ incompatibilities
- Ensure
Missing dependencies:
# Test locally first pip install -r requirements.txt python manage.py checkDatabase migration failures:
- Check if models changed without migrations
- Run locally:
python manage.py makemigrations
Fix:
# Update requirements
pip freeze > requirements.txt
git add requirements.txt runtime.txt
git commit -m "fix: update dependencies"
git push
Issue: 500 Internal Server Error
Symptom: API returns HTTP 500
Diagnosis:
- Check Railway logs: https://railway.com
- Look for Python tracebacks
- Check for missing environment variables
Common fixes:
- SECRET_KEY not set
- DATABASE_URL not connected
- Missing migrations:
python manage.py migrate
Frontend Issues
Issue: Build Fails on Render
Symptom: Render build logs show TypeScript or npm errors
Diagnosis:
# Test locally
cd C:/Projects/play/gabeda_frontend
npm run build
Common Causes:
TypeScript errors:
- Unused imports
- Type mismatches
- Missing dependencies
Environment variable issues:
- Missing VITE_API_URL
- Typo in API URL
Fix:
# Fix TypeScript errors
npm run build # See errors
# Fix issues in code
git add .
git commit -m "fix: typescript errors"
git push # Render auto-rebuilds
Issue: API Calls Fail After Deployment
Symptom: Frontend works locally but fails in production
Diagnosis:
- Open browser DevTools → Network tab
- Check API call URLs
- Look for CORS errors or wrong URLs
Common Causes:
Wrong VITE_API_URL:
- Check Render environment variable
- Ensure it ends with
/apinot/apor/
Needs rebuild:
- Vite bakes env vars at build time
- After changing env var, trigger manual rebuild
Fix:
- Go to Render dashboard
- Environment → Update
VITE_API_URL - Manual Deploy → "Clear build cache & deploy"
- Wait 2-3 minutes for rebuild
Issue: 404 on Page Refresh
Symptom: Direct URL access returns 404
Cause: React Router needs all routes to serve index.html
Fix:
Create public/_redirects:
/* /index.html 200
Commit and push:
git add public/_redirects
git commit -m "fix: add redirects for react router"
git push
Monitoring & Logging
Backend Monitoring (Railway)
Access Logs:
- Go to https://railway.com
- Select project → Service
- View tabs:
- Deployments: Build history
- Metrics: CPU, Memory, Network
- Logs: Real-time application logs
Key Metrics:
- Response time: <300ms target
- Error rate: <1% target
- Memory usage: <512MB target
- CPU usage: <50% average
Log Filtering:
# Railway CLI log streaming
railway logs --follow
# Filter for errors
railway logs | grep ERROR
# Filter by endpoint
railway logs | grep "/api/accounts"
Frontend Monitoring (Render)
Access Logs:
- Go to https://dashboard.render.com
- Select service
- View tabs:
- Events: Deployment history
- Logs: Build and deploy logs
- Metrics: Bandwidth usage
Key Metrics:
- Build time: <3 minutes target
- Bundle size: <1MB target
- Bandwidth: <100GB/month (free tier limit)
Browser Monitoring
Chrome DevTools:
- Open DevTools (F12)
- Network tab:
- Monitor API calls
- Check response times
- Look for failed requests
- Console tab:
- Check for JavaScript errors
- Look for CORS errors
- Application tab:
- Check localStorage (auth tokens)
- Verify service worker status
Continuous Deployment
Automated Deployment Flow
Both Railway and Render support auto-deploy on git push:
Developer → git push → GitHub → Webhook → Platform → Deploy
Current Configuration:
- ✅ Backend: Railway auto-deploys on push to
main - ✅ Frontend: Render auto-deploys on push to
main
Workflow:
- Make changes locally
- Test locally
- Commit:
git commit -m "description" - Push:
git push origin main - Monitor deployment in platform dashboards
- Verify in production
Deployment Checklist
Before pushing to production:
- Code tested locally
- No TypeScript errors (
npm run buildfor frontend) - No Python errors (
python manage.py checkfor backend) - Environment variables documented
- Database migrations created (if schema changed)
- Tests passing (if implemented)
After deployment:
- Build succeeded in platform dashboard
- Health check passes (visit URLs)
- API endpoints work (test in browser)
- No errors in logs
- CORS works (test login/registration)
Scaling & Optimization
Backend Scaling (Railway)
Vertical Scaling:
# Upgrade plan for more resources
# Railway Hobby: $5/month base + usage
# Includes: 512MB RAM, shared CPU
Horizontal Scaling:
# Add more Gunicorn workers (in railway.toml)
startCommand = "... gunicorn ... --workers 4" # Increase from 2
Database Optimization:
- Enable connection pooling
- Add database indexes
- Use
select_related()andprefetch_related() - Monitor slow queries
Caching:
- Redis already configured
- Add view-level caching
- Cache expensive computations
Frontend Optimization (Render)
Bundle Size Reduction:
# Analyze bundle
npm run build -- --analyze
# Code splitting
# Use React.lazy() for route-based splitting
Performance Improvements:
- Lazy load routes
- Optimize images (WebP format)
- Enable compression (Render does this automatically)
- Add service worker for offline support
Security Best Practices
Backend Security
✅ Already Implemented:
- HTTPS enforced (Railway provides SSL)
- CORS properly configured
- JWT authentication
- Password validation
- SQL injection protection (Django ORM)
- XSS protection (Django templates)
🔄 TODO:
- Add rate limiting
- Implement API key rotation
- Add request logging for audit trail
- Set up automated security scanning
- Configure CSP headers
- Add IP-based throttling
Frontend Security
✅ Already Implemented:
- HTTPS enforced (Render provides SSL)
- Environment variables not exposed
- XSS protection (React)
- Secure token storage (localStorage)
🔄 TODO:
- Add Content Security Policy headers
- Implement subresource integrity
- Add rate limiting on auth forms
- Implement session timeout
- Add CAPTCHA on registration
Cost Management
Current Costs
Backend (Railway):
- Base: $5/month (Hobby plan)
- Includes: PostgreSQL, Redis, 512MB RAM
- Additional: Pay-as-you-go for excess usage
- Estimate: $5-10/month for development
Frontend (Render):
- Static Site: FREE
- Includes: 100GB bandwidth/month
- No credit card required
Total: ~$5-10/month
Cost Optimization Tips
Backend:
- Use Redis caching to reduce database queries
- Optimize Gunicorn workers (don't over-provision)
- Monitor Railway usage dashboard
- Set up billing alerts
Frontend:
- Optimize bundle size to reduce bandwidth
- Use image CDN for large assets
- Monitor bandwidth usage in Render dashboard
Reference Documentation
Detailed guides in references/ folder:
- deployment_checklist.md - Pre/post deployment checklist
- cors_troubleshooting.md - CORS error diagnosis
- environment_variables.md - Complete env var reference
- railway_commands.md - Railway CLI command reference
- render_configuration.md - Render setup guide
- monitoring_setup.md - Logging and metrics
- disaster_recovery.md - Backup and restore procedures
Quick links:
- Railway Dashboard: https://railway.com
- Render Dashboard: https://dashboard.render.com
- Backend URL: https://gabedabe-production.up.railway.app
- Frontend URL: https://gabedabe-frontend.onrender.com
Quality Standard
DevOps operations must meet the DEVOPS_STANDARD.md criteria:
✅ Reliability (25%) - Services deployed successfully with <1% error rate ✅ Security (25%) - Proper secrets management, CORS, HTTPS enabled ✅ Observability (20%) - Logging and monitoring configured ✅ Documentation (15%) - Deployment steps documented and reproducible ✅ Automation (15%) - CI/CD pipelines configured
Minimum score: 8.0/10 before marking deployment complete.
See: DEVOPS_STANDARD.md
Version: 1.0.0 Last Updated: 2025-10-31 Skill Type: Infrastructure & Deployment Management