Deployment
Gyrinx is deployed on Google Cloud Platform using Cloud Run for the application and Cloud SQL for the database. The deployment process is fully automated through GitHub and Google Cloud Build.
Architecture Overview
Deployment Pipeline
Automatic Deployment
Code Push - Developer pushes to
mainbranchGitHub Actions - Runs tests and checks
Cloud Build Trigger - Automatically triggered on main branch changes
Container Build - Docker image built from
DockerfileDeploy to Cloud Run - New image deployed automatically
Database Migrations - Run automatically on container startup
Build Configuration
cloudbuild.yaml
steps:
# Build Docker image
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/gyrinx:$COMMIT_SHA', '.']
# Push to Container Registry
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/gyrinx:$COMMIT_SHA']
# Deploy to Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
args: ['run', 'deploy', 'gyrinx',
'--image', 'gcr.io/$PROJECT_ID/gyrinx:$COMMIT_SHA',
'--region', 'europe-west2',
'--platform', 'managed']Environment Configuration
Production Settings
Database: Cloud SQL PostgreSQL
Static Files: Served by WhiteNoise
Security: HTTPS enforced, secure headers
Scaling: Automatic based on traffic
Environment Variables
Database Management
Migrations
Migrations run automatically when the container starts:
Database Backups
Automatic Backups: Cloud SQL provides automatic daily backups
Point-in-time Recovery: Available for disaster recovery
Manual Backups: Can be triggered before major deployments
Database Access
Monitoring and Observability
Cloud Run Monitoring
Metrics: Request count, latency, memory usage
Logs: Application logs and access logs
Alerts: Configured for high error rates and latency
Health Checks
Alerting
Discord Integration: Alerts sent to
#opschannelError Tracking: 500 errors and exceptions
Performance Monitoring: Slow requests and high memory usage
Security
HTTPS and SSL
Automatic SSL: Cloud Run provides automatic SSL certificates
Security Headers: Configured in Django settings
CSRF Protection: Enforced for all POST requests
Access Control
IAM Roles: Principle of least privilege
Service Accounts: Separate accounts for different services
Secret Management: Environment variables for sensitive data
Security Scanning
Container Scanning: Automatic vulnerability scanning
Dependency Updates: Regular security updates
Code Analysis: GitHub Security Advisories
Performance Optimization
Cloud Run Configuration
Database Performance
Connection Pooling: Configured in Django settings
Read Replicas: Available for read-heavy workloads
Query Optimization: Regular performance monitoring
Disaster Recovery
Backup Strategy
Database Backups: Daily automatic backups with 7-day retention
Point-in-time Recovery: Up to 7 days
Code Repository: Git provides complete history
Container Images: Stored in Container Registry
Recovery Procedures
Deployment Checklist
Pre-deployment
Post-deployment
Troubleshooting
Common Issues
Migration Failures
Container Start Failures
Database Connection Issues
Performance Issues
Monitor Cloud Run metrics for CPU/memory usage
Check database query performance
Review Django debug toolbar output locally
Cost Optimization
Resource Management
Auto-scaling: Scales to zero when not in use
Right-sizing: Monitor resource usage and adjust limits
Database Sizing: Regular review of database performance tiers
Monitoring Costs
Budget Alerts: Set up billing alerts
Resource Usage: Regular review of Cloud Console metrics
Optimization Opportunities: Identify unused resources
Future Improvements
Staging Environment
Consider adding a staging environment for testing
Could use Cloud Run with separate database
Automated testing on staging before production
Advanced Monitoring
Application Performance Monitoring (APM)
Real User Monitoring (RUM)
Error tracking with detailed stack traces
CI/CD Enhancements
Canary deployments
Blue-green deployments
Automated rollback on failures
Last updated