| |
| |
|
|
| |
| |
| |
| FROM python:3.14.3-slim as base |
|
|
| |
| ENV PYTHONUNBUFFERED=1 \ |
| PYTHONDONTWRITEBYTECODE=1 \ |
| PIP_NO_CACHE_DIR=1 \ |
| PIP_DISABLE_PIP_VERSION_CHECK=1 |
|
|
| |
| RUN apt-get update && apt-get install -y \ |
| |
| gcc \ |
| g++ \ |
| make \ |
| |
| curl \ |
| wget \ |
| |
| libxml2-dev \ |
| libxslt1-dev \ |
| |
| libjpeg-dev \ |
| libpng-dev \ |
| |
| libgeos-dev \ |
| libproj-dev \ |
| |
| libyajl-dev \ |
| |
| chromium \ |
| chromium-driver \ |
| |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
|
|
| |
| RUN groupadd -r appuser && useradd -r -g appuser appuser |
|
|
| |
| WORKDIR /app |
|
|
| |
| |
| |
| FROM base as dependencies |
|
|
| |
| COPY backend/requirements.txt /app/requirements.txt |
| COPY tests/e2e/requirements.txt /app/requirements-e2e.txt |
|
|
| |
| RUN pip install --upgrade pip setuptools wheel && \ |
| pip install -r requirements.txt && \ |
| pip install -r requirements-e2e.txt |
|
|
| |
| RUN pip install \ |
| |
| gunicorn[gthread]==21.2.0 \ |
| |
| prometheus-client==0.19.0 \ |
| structlog==23.2.0 \ |
| |
| python-jose[cryptography]==3.3.0 \ |
| passlib[bcrypt]==1.7.4 \ |
| |
| orjson==3.9.10 \ |
| uvloop==0.19.0 \ |
| |
| asyncpg==0.29.0 \ |
| |
| google-cloud-bigquery==3.13.0 \ |
| google-cloud-pubsub==2.18.4 \ |
| google-cloud-storage==2.10.0 \ |
| google-cloud-monitoring==2.16.0 |
|
|
| |
| |
| |
| FROM dependencies as application |
|
|
| |
| COPY backend/ /app/backend/ |
| COPY frontend/ /app/frontend/ |
| COPY config/ /app/config/ |
| COPY scripts/ /app/scripts/ |
| COPY data/ /app/data/ |
| COPY docs/ /app/docs/ |
|
|
| |
| COPY docker/ /app/docker/ |
|
|
| |
| RUN mkdir -p /app/logs /app/tmp /app/uploads /app/cache |
|
|
| |
| RUN chown -R appuser:appuser /app && \ |
| chmod +x /app/scripts/*.sh && \ |
| chmod +x /app/scripts/*.ps1 || true |
|
|
| |
| |
| |
| FROM application as production |
|
|
| |
| ENV MODE=cloud \ |
| ENVIRONMENT=production \ |
| LOG_LEVEL=INFO \ |
| PYTHONPATH=/app/backend \ |
| PORT=8080 |
|
|
| |
| HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ |
| CMD curl -f http://localhost:${PORT}/health || exit 1 |
| |
| |
| USER appuser |
| |
| |
| EXPOSE 8080 |
| |
| |
| CMD ["python", "-m", "gunicorn", "backend.main_application:app", \ |
| "--bind", "0.0.0.0:8080", \ |
| "--workers", "4", \ |
| "--worker-class", "uvicorn.workers.UvicornWorker", \ |
| "--worker-connections", "1000", \ |
| "--max-requests", "10000", \ |
| "--max-requests-jitter", "1000", \ |
| "--timeout", "120", \ |
| "--keep-alive", "5", \ |
| "--log-level", "info", \ |
| "--access-logfile", "-", \ |
| "--error-logfile", "-"] |
| |
| |
| |
| |
| FROM application as development |
| |
| |
| RUN pip install \ |
| |
| pytest==7.4.3 \ |
| pytest-asyncio==0.21.1 \ |
| pytest-cov==4.1.0 \ |
| pytest-html==4.1.1 \ |
| |
| black==23.11.0 \ |
| flake8==6.1.0 \ |
| mypy==1.7.1 \ |
| |
| mkdocs==1.5.3 \ |
| mkdocs-material==9.4.8 \ |
| |
| ipdb==0.13.13 \ |
| |
| locust==2.17.0 |
| |
| |
| ENV MODE=local \ |
| ENVIRONMENT=development \ |
| LOG_LEVEL=DEBUG \ |
| PYTHONPATH=/app/backend \ |
| PORT=8000 |
| |
| |
| HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=2 \ |
| CMD curl -f http://localhost:${PORT}/health || exit 1 |
|
|
| |
| USER appuser |
|
|
| |
| EXPOSE 8000 |
|
|
| |
| CMD ["python", "-m", "uvicorn", "backend.main_application:app", \ |
| "--host", "0.0.0.0", \ |
| "--port", "8000", \ |
| "--reload", \ |
| "--log-level", "debug"] |