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>
97 lines
3.1 KiB
Text
97 lines
3.1 KiB
Text
# =============================================================================
|
|
# Dockerfile for FFmpeg HTTP Service - Cloud Run Deployment
|
|
# =============================================================================
|
|
# This Dockerfile creates a FastAPI-based HTTP service for FFmpeg operations,
|
|
# designed for deployment on Google Cloud Run with autoscaling.
|
|
#
|
|
# Key features:
|
|
# - Lightweight image with FFmpeg + FastAPI (no Whisper model)
|
|
# - Fast startup for quick autoscaling
|
|
# - Optimized for 8 vCPU / 32GB RAM Cloud Run instances
|
|
# =============================================================================
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Stage 1: Builder - Install Python dependencies using Poetry
|
|
# -----------------------------------------------------------------------------
|
|
FROM python:3.11-slim AS builder
|
|
|
|
# Install build dependencies
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
build-essential \
|
|
curl \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install Poetry
|
|
RUN pip install --no-cache-dir poetry==1.8.2
|
|
|
|
# Configure Poetry
|
|
ENV POETRY_NO_INTERACTION=1 \
|
|
POETRY_VIRTUALENVS_CREATE=false \
|
|
POETRY_CACHE_DIR=/tmp/poetry_cache
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy dependency files
|
|
COPY pyproject.toml poetry.lock ./
|
|
|
|
# Install dependencies (exclude faster-whisper to keep image small)
|
|
# Note: We still install all deps for simplicity, but could optimize with groups
|
|
RUN poetry config virtualenvs.create false \
|
|
&& poetry install --only main --no-interaction --no-ansi \
|
|
&& rm -rf $POETRY_CACHE_DIR
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Stage 2: Runtime - FFmpeg HTTP Service
|
|
# -----------------------------------------------------------------------------
|
|
FROM python:3.11-slim AS runtime
|
|
|
|
# Install runtime dependencies including FFmpeg
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
libmagic1 \
|
|
curl \
|
|
tini \
|
|
ffmpeg \
|
|
&& rm -rf /var/lib/apt/lists/* \
|
|
&& apt-get clean
|
|
|
|
# Create non-root user for security
|
|
RUN groupadd --gid 1000 app \
|
|
&& useradd --uid 1000 --gid app --shell /bin/bash --create-home app
|
|
|
|
# Copy Python packages from builder
|
|
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
|
COPY --from=builder /usr/local/bin /usr/local/bin
|
|
|
|
# Set environment variables
|
|
ENV PYTHONPATH=/app \
|
|
PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
APP_ENV=prod
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy application code
|
|
COPY --chown=app:app . .
|
|
|
|
# Switch to non-root user
|
|
USER app
|
|
|
|
# Health check
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
|
|
CMD curl -f http://localhost:8080/health || exit 1
|
|
|
|
# Expose HTTP port (Cloud Run uses 8080 by default)
|
|
EXPOSE 8080
|
|
|
|
# Use tini as init system
|
|
ENTRYPOINT ["tini", "--"]
|
|
|
|
# Start Uvicorn server
|
|
# - 1 worker since Cloud Run uses containerConcurrency=1
|
|
# - Bind to 0.0.0.0:8080 for Cloud Run
|
|
# - Timeout of 300s for long FFmpeg operations
|
|
CMD ["uvicorn", "app.services.ffmpeg_http_service:app", \
|
|
"--host", "0.0.0.0", \
|
|
"--port", "8080", \
|
|
"--workers", "1", \
|
|
"--timeout-keep-alive", "300"]
|