youtube-cli/Dockerfile

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"]