You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Find previous release
helm history gistpin -n gistpin
# Rollback to specific revision
helm rollback gistpin <revision-number> -n gistpin
# Verify rollback
kubectl rollout status deployment/backend -n gistpin --timeout=5m
kubectl rollout status deployment/analytics -n gistpin --timeout=5m
# If rollback fails, force rollout
kubectl rollout restart deployment/backend -n gistpin
kubectl rollout restart deployment/analytics -n gistpin
Database Maintenance Runbook
Routine Maintenance
Weekly Index Maintenance
-- Rebuild bloated indexesSELECT indexname, pg_size_pretty(pg_relation_size(indexname::regclass))
FROM pg_stat_user_indexes
WHERE schemaname ='public';
-- Reindex if needed
REINDEX INDEX CONCURRENTLY pins_location_idx;
Monthly Vacuum Analysis
-- Check table bloatSELECT schemaname, tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as total_size
FROM pg_tables
WHERE schemaname ='public'ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
-- Vacuum analyze all tables
VACUUM FULL ANALYZE;
Connection Pool Management
-- Check active connectionsSELECTcount(*) as total_connections,
count(*) FILTER (WHERE state ='idle') as idle,
count(*) FILTER (WHERE state ='active') as active
FROM pg_stat_activity;
-- Terminate long-running queriesSELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state ='active'AND now() - query_start > interval '30 minutes'AND pid <> pg_backend_pid();
Database Migration Procedure
# 1. Take pre-migration backup
pg_dump -h $DB_HOST -U $DB_USER gistpin > backup-pre-migration-$(date +%Y%m%d).sql
# 2. Apply migrations in transactioncd Backend
npm run migration:run
# 3. Verify schema
psql -h $DB_HOST -U $DB_USER gistpin -c " SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name;"# 4. Run post-migration tests
npm run test:e2e -- --grep "database"# 5. If failure, rollbackexport PGPASSWORD=$DB_PASSWORD
psql -h $DB_HOST -U $DB_USER gistpin < backup-pre-migration-$(date +%Y%m%d).sql
Incident Response Runbook
Severity Levels
Level
Description
Response Time
Example
P1 - Critical
Complete outage, data loss
15 minutes
API unreachable, database down
P2 - High
Major feature broken
1 hour
Wallet connection fails
P3 - Medium
Minor feature degradation
4 hours
Slow geo queries
P4 - Low
Cosmetic, non-blocking
Next business day
UI alignment bug
Incident Response Procedure
Step 1: Assess Impact (5 minutes)
# Check service health
curl -f http://localhost:3000/health ||echo"Service down"# Check recent deployments
helm list -A --filter gistpin
kubectl rollout history deployment/backend -n gistpin
# Check error rate in logs
kubectl logs -l app=backend -n gistpin --since=1h | grep -c "ERROR"
# Update external secret - operator syncs automatically# For AWS Secrets Manager, External Secrets polls every hour# Force sync if needed:
kubectl annotate externalsecret backend-secrets \
force-sync=$(date +%s) \
-n gistpin
# Watch sync status
kubectl describe externalsecret backend-secrets -n gistpin
3. Rolling Restart (if needed)
# Restart all backend pods to pick up new secret
kubectl rollout restart deployment/backend -n gistpin
# Wait for completion
kubectl rollout status deployment/backend -n gistpin --timeout=10m
4. Verification
# Verify new password is in use
kubectl exec -n gistpin deploy/backend -- \
env | grep DATABASE_URL
# Verify database connections work
kubectl exec -n gistpin deploy/backend -- \
curl -f localhost:3000/health/db
5. Revoke Old Secret
# After confirming all pods use new secret (wait 5 minutes)# AWS - schedule deletion
aws secretsmanager schedule-secret-deletion \
--secret-id gistpin/backend/database-password-old \
--recovery-window-in-days 30
# Delete old secret from Vault
vault kv delete secret/gistpin/backend/database-password-old
Backup and Restore Runbook
Automated Backups
Database backups run automatically via Kubernetes CronJob: