Migrate CPU-intensive workloads to Cloud Run for autoscaling: - Add Whisper HTTP service (FastAPI) with /transcribe endpoint - Add FFmpeg HTTP service (FastAPI) with /encode, /probe, /extract-frame, etc. - Add Dockerfiles for both services (8 vCPU, 32GB RAM, Gen2) - Add Cloud Build config for CI/CD deployment - Add Cloud Run service YAML configs with scale-to-zero - Update whisper_transcribe.py to call Cloud Run when WHISPER_SERVICE_URL set - Update video_renderer.py to call Cloud Run when FFMPEG_SERVICE_URL set - Update whisper_service.py for Cloud Run compatibility (no settings dependency) - Add ffmpeg_service_url and whisper_service_url to config.py Services scale 0→N based on request load, falling back to local execution when service URLs are not configured (hybrid mode). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
166 lines
5.9 KiB
YAML
166 lines
5.9 KiB
YAML
# =============================================================================
|
|
# Cloud Build: HTTP Services (Whisper & FFmpeg)
|
|
# =============================================================================
|
|
# Builds and deploys the autoscaling HTTP services to Cloud Run.
|
|
#
|
|
# Usage:
|
|
# gcloud builds submit --config=infra/cloud-run/cloudbuild-http-services.yaml .
|
|
#
|
|
# Or trigger automatically on push to main branch via Cloud Build triggers.
|
|
# =============================================================================
|
|
|
|
steps:
|
|
# =========================================================================
|
|
# Build Docker Images
|
|
# =========================================================================
|
|
|
|
# Build Whisper HTTP Service image
|
|
- name: 'gcr.io/cloud-builders/docker'
|
|
args:
|
|
- 'build'
|
|
- '-f'
|
|
- 'backend/Dockerfile.whisper-service'
|
|
- '-t'
|
|
- 'gcr.io/$PROJECT_ID/whisper-http-service:$COMMIT_SHA'
|
|
- '-t'
|
|
- 'gcr.io/$PROJECT_ID/whisper-http-service:latest'
|
|
- 'backend/'
|
|
id: 'build-whisper-service'
|
|
|
|
# Build FFmpeg HTTP Service image
|
|
- name: 'gcr.io/cloud-builders/docker'
|
|
args:
|
|
- 'build'
|
|
- '-f'
|
|
- 'backend/Dockerfile.ffmpeg-service'
|
|
- '-t'
|
|
- 'gcr.io/$PROJECT_ID/ffmpeg-http-service:$COMMIT_SHA'
|
|
- '-t'
|
|
- 'gcr.io/$PROJECT_ID/ffmpeg-http-service:latest'
|
|
- 'backend/'
|
|
id: 'build-ffmpeg-service'
|
|
|
|
# =========================================================================
|
|
# Push Images to Container Registry
|
|
# =========================================================================
|
|
|
|
- name: 'gcr.io/cloud-builders/docker'
|
|
args: ['push', 'gcr.io/$PROJECT_ID/whisper-http-service:$COMMIT_SHA']
|
|
id: 'push-whisper-service-sha'
|
|
waitFor: ['build-whisper-service']
|
|
|
|
- name: 'gcr.io/cloud-builders/docker'
|
|
args: ['push', 'gcr.io/$PROJECT_ID/whisper-http-service:latest']
|
|
id: 'push-whisper-service-latest'
|
|
waitFor: ['build-whisper-service']
|
|
|
|
- name: 'gcr.io/cloud-builders/docker'
|
|
args: ['push', 'gcr.io/$PROJECT_ID/ffmpeg-http-service:$COMMIT_SHA']
|
|
id: 'push-ffmpeg-service-sha'
|
|
waitFor: ['build-ffmpeg-service']
|
|
|
|
- name: 'gcr.io/cloud-builders/docker'
|
|
args: ['push', 'gcr.io/$PROJECT_ID/ffmpeg-http-service:latest']
|
|
id: 'push-ffmpeg-service-latest'
|
|
waitFor: ['build-ffmpeg-service']
|
|
|
|
# =========================================================================
|
|
# Deploy to Cloud Run
|
|
# =========================================================================
|
|
|
|
# Deploy Whisper HTTP Service
|
|
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
|
|
entrypoint: 'gcloud'
|
|
args:
|
|
- 'run'
|
|
- 'deploy'
|
|
- 'whisper-http-service'
|
|
- '--image=gcr.io/$PROJECT_ID/whisper-http-service:$COMMIT_SHA'
|
|
- '--region=$_REGION'
|
|
- '--platform=managed'
|
|
- '--no-allow-unauthenticated' # Internal only
|
|
- '--port=8080'
|
|
- '--memory=32Gi'
|
|
- '--cpu=8'
|
|
- '--min-instances=0'
|
|
- '--max-instances=10'
|
|
- '--concurrency=1'
|
|
- '--timeout=300'
|
|
- '--execution-environment=gen2'
|
|
- '--no-cpu-throttling'
|
|
- '--cpu-boost'
|
|
- '--set-env-vars=APP_ENV=prod,PYTHONPATH=/app,WHISPER_MODEL=medium,GCS_BUCKET=$_GCS_BUCKET'
|
|
- '--service-account=accessible-video-worker@$PROJECT_ID.iam.gserviceaccount.com'
|
|
id: 'deploy-whisper-service'
|
|
waitFor: ['push-whisper-service-sha']
|
|
|
|
# Deploy FFmpeg HTTP Service
|
|
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
|
|
entrypoint: 'gcloud'
|
|
args:
|
|
- 'run'
|
|
- 'deploy'
|
|
- 'ffmpeg-http-service'
|
|
- '--image=gcr.io/$PROJECT_ID/ffmpeg-http-service:$COMMIT_SHA'
|
|
- '--region=$_REGION'
|
|
- '--platform=managed'
|
|
- '--no-allow-unauthenticated' # Internal only
|
|
- '--port=8080'
|
|
- '--memory=32Gi'
|
|
- '--cpu=8'
|
|
- '--min-instances=0'
|
|
- '--max-instances=20'
|
|
- '--concurrency=1'
|
|
- '--timeout=600'
|
|
- '--execution-environment=gen2'
|
|
- '--no-cpu-throttling'
|
|
- '--cpu-boost'
|
|
- '--set-env-vars=APP_ENV=prod,PYTHONPATH=/app,GCS_BUCKET=$_GCS_BUCKET'
|
|
- '--service-account=accessible-video-worker@$PROJECT_ID.iam.gserviceaccount.com'
|
|
id: 'deploy-ffmpeg-service'
|
|
waitFor: ['push-ffmpeg-service-sha']
|
|
|
|
# =========================================================================
|
|
# Output Service URLs
|
|
# =========================================================================
|
|
|
|
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
|
|
entrypoint: 'bash'
|
|
args:
|
|
- '-c'
|
|
- |
|
|
echo "=============================================="
|
|
echo "HTTP Services Deployed Successfully!"
|
|
echo "=============================================="
|
|
echo ""
|
|
echo "Whisper Service:"
|
|
gcloud run services describe whisper-http-service --region=$_REGION --format='value(status.url)'
|
|
echo ""
|
|
echo "FFmpeg Service:"
|
|
gcloud run services describe ffmpeg-http-service --region=$_REGION --format='value(status.url)'
|
|
echo ""
|
|
echo "=============================================="
|
|
echo "To enable Cloud Run usage, set these environment variables:"
|
|
echo " WHISPER_SERVICE_URL=<whisper-service-url>"
|
|
echo " FFMPEG_SERVICE_URL=<ffmpeg-service-url>"
|
|
echo "=============================================="
|
|
id: 'output-urls'
|
|
waitFor: ['deploy-whisper-service', 'deploy-ffmpeg-service']
|
|
|
|
substitutions:
|
|
_REGION: 'us-central1'
|
|
_GCS_BUCKET: 'accessible-video'
|
|
|
|
options:
|
|
machineType: 'E2_HIGHCPU_8'
|
|
diskSizeGb: '100'
|
|
dynamic_substitutions: true
|
|
|
|
timeout: '2400s' # 40 minutes (Whisper image build takes time due to model download)
|
|
|
|
# Images to be pushed (for Cloud Build to track)
|
|
images:
|
|
- 'gcr.io/$PROJECT_ID/whisper-http-service:$COMMIT_SHA'
|
|
- 'gcr.io/$PROJECT_ID/whisper-http-service:latest'
|
|
- 'gcr.io/$PROJECT_ID/ffmpeg-http-service:$COMMIT_SHA'
|
|
- 'gcr.io/$PROJECT_ID/ffmpeg-http-service:latest'
|