- 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>
96 lines
2.7 KiB
Bash
Executable file
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
|