fashionistar-celery-queues / Dockerfile.celery
FASHIONISTAR CI/CD
🔄 Celery Queues Deploy: 4aae6106b1530c3cc7d7d64f5e3c3e1d5015691d [GitHub Actions]
27c799c
Raw
History Blame
4.12 kB
# =============================================================================
# FASHIONISTAR — Celery Worker Dockerfile (Northflank + Multi-Platform)
# =============================================================================
# Primary Target: Northflank Free Sandbox (linux/amd64)
# Also Works: Render, Railway, GCP Cloud Run Jobs, local dev
#
# Celery queues handled:
# - default : General async tasks
# - ai_tasks : AI/ML body measurement computation
# - measurements : Body measurement processing
# - analytics : Reporting & aggregation
# - notifications : Email / SMS / Push
# - webhooks : Incoming webhook processing
#
# Start modes (via CMD or entrypoint arg):
# celery-worker → Full Celery worker (default)
# celery-beat → Celery Beat scheduler only
# celery-all → Worker + Beat combined (saves resources on small tiers)
# =============================================================================
ARG PYTHON_VERSION=3.13-slim
ARG UV_IMAGE_TAG=0.8.22
# ── Stage 1: uv binary ───────────────────────────────────────────────────────
FROM ghcr.io/astral-sh/uv:${UV_IMAGE_TAG} AS uvbin
# ── Stage 2: dependency builder ──────────────────────────────────────────────
FROM python:${PYTHON_VERSION} AS builder
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
UV_COMPILE_BYTECODE=1 \
UV_LINK_MODE=copy \
UV_PROJECT_ENVIRONMENT=/opt/venv \
VIRTUAL_ENV=/opt/venv
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
COPY --from=uvbin /uv /uvx /bin/
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev --no-editable --no-install-project && \
uv pip uninstall --python /opt/venv torch torchvision mediapipe open-clip-torch sentence-transformers opencv-python-headless opencv-contrib-python nvidia-cuda-nvrtc-cu12 nvidia-cuda-runtime-cu12 nvidia-cuda-cupti-cu12 nvidia-cudnn-cu12 nvidia-cublas-cu12 nvidia-cufft-cu12 nvidia-curand-cu12 nvidia-cusolver-cu12 nvidia-cusparse-cu12 nvidia-nccl-cu12 nvidia-nvtx-cu12 nvidia-nvjitlink-cu12 triton
# ── Stage 3: runtime ─────────────────────────────────────────────────────────
FROM python:${PYTHON_VERSION} AS runner
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
UV_LINK_MODE=copy \
UV_PROJECT_ENVIRONMENT=/opt/venv \
PATH="/opt/venv/bin:$PATH" \
DJANGO_SETTINGS_MODULE=backend.config.production \
WORKING_ENVIRONMENT=production \
# Celery concurrency: 4 workers per container (tune to Northflank free limits)
CELERY_CONCURRENCY=4 \
# Queues this worker handles
CELERY_QUEUES=default,ai_tasks,measurements,analytics,notifications,webhooks \
# Prevent worker process from accumulating memory leaks
CELERY_MAX_TASKS_PER_CHILD=100 \
CELERY_LOG_LEVEL=info
RUN apt-get update && apt-get install -y --no-install-recommends \
libpq5 \
postgresql-client \
curl \
&& rm -rf /var/lib/apt/lists/*
COPY --from=uvbin /uv /uvx /bin/
COPY --from=builder /opt/venv /opt/venv
# Create non-root user (UID 1000 — matches Hugging Face + general best practice)
RUN useradd --create-home --uid 1000 --shell /bin/sh appuser && \
mkdir -p /app/staticfiles /app/media /app/logs && \
chown -R appuser:appuser /app
WORKDIR /app
COPY --chown=appuser:appuser . .
COPY --chown=appuser:appuser entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
USER appuser
# Celery worker has no HTTP port — only connects outbound to Redis broker
# No EXPOSE needed for worker-type services (Northflank handles this correctly)
ENTRYPOINT ["/entrypoint.sh"]
# Default: Celery worker mode. Override with "celery-beat" for the Beat scheduler.
CMD ["celery-worker"]