|
1 | | -# LinkedIn Post Bot - Backend Dockerfile |
2 | | -# Build: docker build -t linkedin-bot-backend . |
3 | | -# Run: docker run -p 8000:8000 --env-file ../.env linkedin-bot-backend |
4 | | - |
5 | 1 | FROM python:3.11-slim |
6 | 2 |
|
7 | | -# Set working directory |
8 | 3 | WORKDIR /app |
9 | 4 |
|
10 | | -# Install system dependencies |
11 | | -RUN apt-get update && apt-get install -y --no-install-recommends \ |
12 | | - gcc \ |
| 5 | +# Install system dependencies (needed for some python packages) |
| 6 | +RUN apt-get update && apt-get install -y \ |
| 7 | + build-essential \ |
| 8 | + libpq-dev \ |
13 | 9 | && rm -rf /var/lib/apt/lists/* |
14 | 10 |
|
15 | | -# Copy requirements first (better caching) |
16 | | -COPY requirements.txt . |
17 | | - |
18 | 11 | # Install Python dependencies |
| 12 | +COPY requirements.txt . |
19 | 13 | RUN pip install --no-cache-dir -r requirements.txt |
20 | 14 |
|
21 | 15 | # Copy application code |
22 | 16 | COPY . . |
23 | 17 |
|
24 | | -# Copy services directory from parent (mounted at runtime or copied in CI) |
25 | | -# Note: In production, ensure services/ is available at /app/services |
26 | | -COPY ../services /app/services 2>/dev/null || true |
27 | | - |
28 | | -# Add parent directory to Python path for services imports |
29 | | -ENV PYTHONPATH=/app:/app/.. |
30 | | - |
31 | | -# Create directory for SQLite databases |
32 | | -RUN mkdir -p /data |
33 | | - |
34 | | -# Environment variables (override with -e or --env-file) |
35 | | -ENV PORT=8000 |
36 | | -ENV TOKEN_DB_PATH=/data/tokens.db |
37 | | -ENV USER_SETTINGS_DB_PATH=/data/user_settings.db |
38 | | -ENV POST_HISTORY_DB_PATH=/data/post_history.db |
| 18 | +# Create a non-root user for security |
| 19 | +RUN useradd -m appuser && chown -R appuser:appuser /app |
| 20 | +USER appuser |
39 | 21 |
|
40 | 22 | # Expose port |
41 | 23 | EXPOSE 8000 |
42 | 24 |
|
43 | | -# Health check |
44 | | -HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ |
45 | | - CMD curl -f http://localhost:8000/health || exit 1 |
46 | | - |
47 | | -# Run the application |
48 | | -CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"] |
| 25 | +# Production Command: Use Gunicorn with Uvicorn workers |
| 26 | +# -w 4: Use 4 worker processes (adjust based on CPU cores) |
| 27 | +# -k uvicorn.workers.UvicornWorker: Use async workers |
| 28 | +# --bind 0.0.0.0:8000: Listen on all interfaces |
| 29 | +CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "app:app", "--bind", "0.0.0.0:8000"] |
0 commit comments