diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000..e13d047 --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,36 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +venv/ +env/ +ENV/ +.venv + +# Testing +.pytest_cache/ +*.log +test_*.py + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# Environment +.env +.env.local + +# Git +.git/ +.gitignore + +# Documentation +README.md + +# Other +*.md +!requirements.txt diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..6674fd7 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,35 @@ +# Use Python 3.10 as base image +FROM python:3.10-slim + +# Set working directory +WORKDIR /app + +# Install system dependencies +# espeak-ng is required for Kokoro TTS (grapheme-to-phoneme conversion) +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + espeak-ng \ + && rm -rf /var/lib/apt/lists/* + +# Copy requirements file +COPY requirements.txt . + +# Install Python dependencies +RUN pip install --no-cache-dir -r requirements.txt + +# Copy backend code +COPY . . + +# Expose port 8000 +EXPOSE 8000 + +# Set environment variables +ENV PORT=8000 +ENV LOG_LEVEL=info + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')" + +# Start Uvicorn server +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml new file mode 100644 index 0000000..9aac501 --- /dev/null +++ b/backend/docker-compose.yml @@ -0,0 +1,24 @@ +version: '3.8' + +services: + backend: + build: + context: . + dockerfile: Dockerfile + container_name: text-to-audiobook-backend + ports: + - "8000:8000" + environment: + - PORT=8000 + - LOG_LEVEL=info + volumes: + # Mount code for development (optional - comment out for production) + - ./services:/app/services + - ./main.py:/app/main.py + restart: unless-stopped + healthcheck: + test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s