#!/usr/bin/env bash # # Deploy script for the RIR-ASR Evaluation Leaderboard. # # The HF Space runs evaluation directly — no Lambda needed. # AWS S3 is used only for private dataset storage and results. # # Prerequisites: # - AWS CLI configured (aws configure) # - HuggingFace CLI installed (pip install huggingface-hub) # # Usage: # 1. Edit the variables below # 2. ./deploy.sh setup-s3 # One-time: create S3 bucket + IAM user # 3. ./deploy.sh upload-data # Upload private dataset to S3 # 4. ./deploy.sh deploy-space # Create/update HuggingFace Space set -euo pipefail # ============================================================================ # CONFIGURATION — edit these # ============================================================================ AWS_REGION="us-east-1" # S3 S3_BUCKET="FFASR_Leaderboard-storage" S3_PREFIX="generated_with_treble10" # IAM user for HF Space to access S3 IAM_USER_NAME="whojavumusic" # HuggingFace Space (full repo id: org/SpaceName) HF_SPACE_NAME="treble-technologies/FFASR_Leaderboard" # Required for deploy-space: export HF_TOKEN before running (HF Settings → Access Tokens) HF_TOKEN="${HF_TOKEN:-}" # Local paths DATASET_DIR="../data/packed/" SPACE_DIR="." # ============================================================================ # FUNCTIONS # ============================================================================ setup_s3() { echo "=== Creating S3 bucket ===" aws s3 mb "s3://${S3_BUCKET}" --region "${AWS_REGION}" 2>/dev/null || echo "Bucket already exists" # Block all public access aws s3api put-public-access-block \ --bucket "${S3_BUCKET}" \ --public-access-block-configuration \ "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true" echo "=== Creating IAM user for Space S3 access ===" aws iam create-user --user-name "${IAM_USER_NAME}" 2>/dev/null || echo "IAM user already exists" # S3-only policy scoped to this bucket S3_POLICY="{ \"Version\": \"2012-10-17\", \"Statement\": [{ \"Effect\": \"Allow\", \"Action\": [\"s3:GetObject\", \"s3:PutObject\", \"s3:ListBucket\"], \"Resource\": [ \"arn:aws:s3:::${S3_BUCKET}\", \"arn:aws:s3:::${S3_BUCKET}/*\" ] }] }" aws iam put-user-policy \ --user-name "${IAM_USER_NAME}" \ --policy-name "S3DatasetAccess" \ --policy-document "${S3_POLICY}" echo "" echo "=== Creating access keys ===" KEYS=$(aws iam create-access-key --user-name "${IAM_USER_NAME}" 2>/dev/null || echo "") if [ -n "${KEYS}" ]; then ACCESS_KEY=$(echo "${KEYS}" | python3 -c "import sys,json; print(json.load(sys.stdin)['AccessKey']['AccessKeyId'])") SECRET_KEY=$(echo "${KEYS}" | python3 -c "import sys,json; print(json.load(sys.stdin)['AccessKey']['SecretAccessKey'])") echo "" echo "Save these — you won't see the secret again:" echo " AWS_ACCESS_KEY_ID = ${ACCESS_KEY}" echo " AWS_SECRET_ACCESS_KEY = ${SECRET_KEY}" else echo "Access keys already exist. Delete old ones in IAM console if you need new ones." fi echo "" echo "=== S3 setup complete ===" } upload_data() { echo "=== Uploading dataset to S3 ===" aws s3 sync "${DATASET_DIR}/wavs/" "s3://${S3_BUCKET}/${S3_PREFIX}/wavs/" --region "${AWS_REGION}" aws s3 sync "${DATASET_DIR}/transcripts/" "s3://${S3_BUCKET}/${S3_PREFIX}/transcripts/" --region "${AWS_REGION}" echo "" echo "=== Upload complete ($(aws s3 ls "s3://${S3_BUCKET}/${S3_PREFIX}/wavs/" --region "${AWS_REGION}" | wc -l) wav files) ===" } deploy_space() { echo "=== Deploying HuggingFace Space ===" if [ -z "${HF_TOKEN}" ]; then echo "Error: Set HF_TOKEN environment variable" exit 1 fi # Create the Space repo if it doesn't exist huggingface-cli repo create "${HF_SPACE_NAME}" --type space --space-sdk gradio 2>/dev/null || true # Clone, copy files, push TMPDIR=$(mktemp -d) git clone "https://huggingface.co/spaces/${HF_SPACE_NAME}" "${TMPDIR}/space" 2>/dev/null || \ git clone "https://huggingface.co/spaces/${HF_SPACE_NAME}" "${TMPDIR}/space" cp "${SPACE_DIR}/app.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/init.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/analytics.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/ffas.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/family_registry.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/job_queue.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/metrics_config.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/remote_jobs.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/storage.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/utils_display.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/constants.py" "${TMPDIR}/space/" cp "${SPACE_DIR}/requirements.txt" "${TMPDIR}/space/" cp "${SPACE_DIR}/README.md" "${TMPDIR}/space/" rm -rf "${TMPDIR}/space/backends" "${TMPDIR}/space/benchmark" "${TMPDIR}/space/evaluation" "${TMPDIR}/space/scripts" cp -R "${SPACE_DIR}/backends" "${TMPDIR}/space/backends" cp -R "${SPACE_DIR}/benchmark" "${TMPDIR}/space/benchmark" cp -R "${SPACE_DIR}/evaluation" "${TMPDIR}/space/evaluation" cp -R "${SPACE_DIR}/scripts" "${TMPDIR}/space/scripts" cd "${TMPDIR}/space" git add -A git commit -m "Update leaderboard app" || echo "No changes to commit" git push cd - rm -rf "${TMPDIR}" echo "" echo "=== Space deployed ===" echo "URL: https://huggingface.co/spaces/${HF_SPACE_NAME}" echo "" echo "Set these secrets in Space settings (Settings > Variables and Secrets):" echo " AWS_ACCESS_KEY_ID = " echo " AWS_SECRET_ACCESS_KEY = " echo " AWS_DEFAULT_REGION = ${AWS_REGION}" echo " DATASET_S3_BUCKET = ${S3_BUCKET}" echo " DATASET_S3_PREFIX = ${S3_PREFIX}" echo " RESULTS_S3_BUCKET = ${S3_BUCKET}" echo " RESULTS_S3_KEY = results/leaderboard.csv" } # ============================================================================ # MAIN # ============================================================================ case "${1:-help}" in setup-s3) setup_s3 ;; upload-data) upload_data ;; deploy-space) deploy_space ;; all) setup_s3 upload_data deploy_space ;; *) echo "Usage: $0 {setup-s3|upload-data|deploy-space|all}" echo "" echo " setup-s3 Create private S3 bucket + IAM user for the Space" echo " upload-data Upload private dataset to S3" echo " deploy-space Deploy HuggingFace Space" echo " all Run all steps in order" ;; esac