diff --git a/Dockerfile b/Dockerfile index 21bcc5b..1ac0bc7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,52 +3,53 @@ # ========================================== FROM python:3.11-slim AS builder -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 WORKDIR /app -RUN apt-get update && apt-get install -y --no-install-recommends \ +# بهینه‌سازی ۱: استفاده از کش سیستم‌عامل برای apt +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update && apt-get install -y --no-install-recommends \ build-essential \ - libpq-dev \ - && rm -rf /var/lib/apt/lists/* + libpq-dev RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" COPY requirements.txt . -#RUN pip install --no-cache-dir -r requirements.txt -RUN pip install --no-cache-dir --default-timeout=1000 -i https://package-mirror.liara.ir/repository/pypi/simple -r requirements.txt + +# بهینه‌سازی ۲: استفاده از مکانیزم کش BuildKit برای pip (حذف --no-cache-dir) +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install --default-timeout=1000 -i https://package-mirror.liara.ir/repository/pypi/simple -r requirements.txt # ========================================== # Stage 2: Final Production Image # ========================================== FROM python:3.11-slim -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 -ENV PATH="/opt/venv/bin:$PATH" +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PATH="/opt/venv/bin:$PATH" WORKDIR /app -# نصب کتابخانه‌های سیستم‌عامل برای زمان اجرا + ابزار ارزشمند supervisor -RUN apt-get update && apt-get install -y --no-install-recommends \ +# بهینه‌سازی ۳: انتقال دستور ساخت کاربر به بالاترین نقطه (چون دائم تغییر نمی‌کند) +RUN useradd -m -u 1000 django + +# بهینه‌سازی ۴: استفاده از کش apt در استیج نهایی و ادغام پوشه‌ها +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update && apt-get install -y --no-install-recommends \ libpq5 \ - supervisor \ - && rm -rf /var/lib/apt/lists/* + supervisor && \ + mkdir -p /app/staticfiles /app/mediafiles /etc/supervisor /var/log/supervisor && \ + chown -R django:django /app /etc/supervisor /var/log/supervisor # کپی کردن لایه پاکیزه پکیج‌ها از استیج اول COPY --from=builder /opt/venv /opt/venv -# تمهیدات امنیتی: ساخت کاربر سیستم غیر ریشه -RUN useradd -m -u 1000 django - -# ساخت دایرکتوری‌های مورد نیاز و واگذاری مالکیت به کاربر django -RUN mkdir -p /app/staticfiles /app/mediafiles /etc/supervisor && \ - chown -R django:django /app /etc/supervisor - -RUN mkdir -p /var/log/supervisor && chown -R django:django /var/log/supervisor - # کپی کردن کدهای پروژه با مالکیت کاربر محدود شده COPY --chown=django:django . . diff --git a/supervisor.conf b/supervisor.conf index d7dedb6..6b16571 100644 --- a/supervisor.conf +++ b/supervisor.conf @@ -1,13 +1,21 @@ [supervisord] nodaemon=true -# به جای مسیرهای سیستم، از /tmp استفاده کنید logfile=/dev/null pidfile=/tmp/supervisord.pid +[unix_http_server] +file=/tmp/supervisor.sock +chmod=0700 + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///tmp/supervisor.sock + [program:django-web] command=gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3 directory=/app -user=django autostart=true autorestart=true stdout_logfile=/dev/stdout @@ -18,7 +26,6 @@ stderr_logfile_maxbytes=0 [program:celery-worker] command=celery -A config worker -l INFO directory=/app -user=django autostart=true autorestart=true stdout_logfile=/dev/stdout