74 lines
2.0 KiB
Docker
74 lines
2.0 KiB
Docker
# ============================================
|
|
# Stage 1: Build React frontend
|
|
# ============================================
|
|
FROM node:20-alpine AS frontend-builder
|
|
|
|
WORKDIR /build
|
|
|
|
# Copy frontend package files
|
|
COPY web/web-app/package.json web/web-app/package-lock.json ./
|
|
|
|
# Install dependencies
|
|
RUN npm ci
|
|
|
|
# Copy frontend source
|
|
COPY web/web-app/ ./
|
|
|
|
# Build production bundle
|
|
RUN npm run build
|
|
|
|
# ============================================
|
|
# Stage 2: Python server
|
|
# ============================================
|
|
FROM python:3.11-slim AS server
|
|
|
|
# Install system dependencies for yt-dlp/ffmpeg/deno
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
curl \
|
|
ffmpeg \
|
|
ca-certificates \
|
|
unzip \
|
|
git \
|
|
&& rm -rf /var/lib/apt/lists/* && \
|
|
curl -fsSL https://deno.land/install.sh | sh && \
|
|
ln -s /root/.deno/bin/deno /usr/local/bin/deno
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy Python requirements first for better caching
|
|
COPY requirements.txt requirements-api.txt ./
|
|
COPY web/requirements-web.txt ./requirements-web.txt
|
|
|
|
# Install Python dependencies, yt-dlp nightly for latest YouTube patches
|
|
RUN pip install --no-cache-dir --upgrade pip && \
|
|
pip install --no-cache-dir -r requirements.txt && \
|
|
pip install --no-cache-dir -r requirements-api.txt && \
|
|
pip install --no-cache-dir -r requirements-web.txt && \
|
|
pip install --no-cache-dir --upgrade "yt-dlp[default] @ git+https://github.com/yt-dlp/yt-dlp.git"
|
|
|
|
# Copy application code
|
|
COPY . .
|
|
|
|
# Copy built frontend from stage 1
|
|
COPY --from=frontend-builder /build/dist web/web-app/dist
|
|
|
|
# Create download and config directories
|
|
RUN mkdir -p /downloads /app/.config/youtube_cli/logs
|
|
|
|
# Set environment variables
|
|
ENV PYTHONUNBUFFERED=1
|
|
ENV PORT=4096
|
|
ENV DOWNLOAD_DIR=/downloads
|
|
ENV CONFIG_DIR=/app/.config/youtube_cli
|
|
ENV DOCKER=true
|
|
|
|
# Expose port
|
|
EXPOSE 4096
|
|
|
|
# Health check
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
|
|
CMD curl -f http://localhost:4096/api/health || exit 1
|
|
|
|
# Run the application
|
|
WORKDIR /app/web/server
|
|
CMD ["python", "app.py"] |