olivas/cloud_run/deploy.sh
Vadym Samoilenko 2c5e17c7c4 Add Google Cloud Run offloading for ML inference and image processing
- Create cloud_run/saliency: FastAPI service running DeepGaze I/IIE/III
  on Cloud Run (4 vCPU, 16GB RAM); pre-downloads model weights in Docker
  build to eliminate cold-start delays; returns saliency map + gaze
  sequence + hotspots + design scores
- Create cloud_run/processing: lightweight FastAPI service for heatmap
  generation and gaze sequence visualization (2 vCPU, 4GB RAM)
- Add cloud_run/deploy.sh for gcloud deployment to project optical-414516
  in region europe-west2
- Refactor analysis pipeline to route via Cloud Run when
  CLOUD_RUN_SALIENCY_URL is set, with local fallback for dev mode
- Add cloud_run_client.py with sync httpx wrappers for background tasks
- Split pyproject.toml: base = API-only deps, [ml] = torch/deepgaze for
  local dev; production Dockerfile is now lightweight (~no PyTorch)
- Preserve Dockerfile.full + docker-compose.dev.yml for local ML dev
- Auth via X-Internal-Secret header (CLOUD_RUN_SECRET env var)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 19:39:52 +00:00

96 lines
2.7 KiB
Bash
Executable file

#!/usr/bin/env bash
# Deploy OliVAS Cloud Run services to Google Cloud Run
# Project: optical-414516 | Region: europe-west2
#
# Usage:
# ./cloud_run/deploy.sh [saliency|processing|all]
#
# Requirements:
# - gcloud CLI authenticated: gcloud auth login
# - Project set: gcloud config set project optical-414516
# - Cloud Run API enabled
# - CLOUD_RUN_SECRET env var set (shared auth secret)
set -euo pipefail
PROJECT="optical-414516"
REGION="europe-west2"
SECRET="${CLOUD_RUN_SECRET:-}"
if [ -z "$SECRET" ]; then
echo "WARNING: CLOUD_RUN_SECRET is not set. Services will be unauthenticated."
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
gcloud config set project "$PROJECT"
deploy_saliency() {
echo "=== Deploying olivas-saliency ==="
gcloud run deploy olivas-saliency \
--source "$SCRIPT_DIR/saliency" \
--region "$REGION" \
--platform managed \
--allow-unauthenticated \
--cpu 4 \
--memory 16Gi \
--timeout 300 \
--concurrency 1 \
--min-instances 0 \
--max-instances 3 \
--set-env-vars "CLOUD_RUN_SECRET=${SECRET},DEVICE=cpu" \
--no-cpu-throttling
SALIENCY_URL=$(gcloud run services describe olivas-saliency \
--region "$REGION" --format "value(status.url)")
echo "olivas-saliency deployed: $SALIENCY_URL"
}
deploy_processing() {
echo "=== Deploying olivas-processing ==="
gcloud run deploy olivas-processing \
--source "$SCRIPT_DIR/processing" \
--region "$REGION" \
--platform managed \
--allow-unauthenticated \
--cpu 2 \
--memory 4Gi \
--timeout 120 \
--concurrency 2 \
--min-instances 0 \
--max-instances 5 \
--set-env-vars "CLOUD_RUN_SECRET=${SECRET}"
PROCESSING_URL=$(gcloud run services describe olivas-processing \
--region "$REGION" --format "value(status.url)")
echo "olivas-processing deployed: $PROCESSING_URL"
}
TARGET="${1:-all}"
case "$TARGET" in
saliency)
deploy_saliency
;;
processing)
deploy_processing
;;
all)
deploy_saliency
deploy_processing
echo ""
echo "=== Deployment complete ==="
echo "Set these env vars on your VPS (in .env or docker-compose.yml):"
SALIENCY_URL=$(gcloud run services describe olivas-saliency \
--region "$REGION" --format "value(status.url)" 2>/dev/null || echo "<saliency-url>")
PROCESSING_URL=$(gcloud run services describe olivas-processing \
--region "$REGION" --format "value(status.url)" 2>/dev/null || echo "<processing-url>")
echo " CLOUD_RUN_SALIENCY_URL=$SALIENCY_URL"
echo " CLOUD_RUN_PROCESSING_URL=$PROCESSING_URL"
echo " CLOUD_RUN_SECRET=$SECRET"
;;
*)
echo "Usage: $0 [saliency|processing|all]"
exit 1
;;
esac