From 4857f49f9209cefa6dc0c079b7c044ca83e46ba3 Mon Sep 17 00:00:00 2001 From: Zareian Date: Tue, 15 Sep 2026 17:53:55 +0330 Subject: [PATCH] collect static files even when DEBUG is on MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit پنلِ ادمین روی سرور بدونِ CSS بالا آمد و هیچ خطایی هم در لاگ نبود. علت ترتیبِ کارها بود: این مرحله وقتی DEBUG روشن بود رد می‌شد، چون در آن حالت whitenoise از finders می‌خواند و جمع‌آوری لازم نیست. کسی با DEBUG روشن دیپلوی کرد و بعد DEBUG را خاموش کرد — کارِ درستی هم بود — و از آن لحظه جنگو دنبالِ فایل‌هایی می‌گشت که هیچ‌وقت جمع نشده بودند. یعنی درستیِ دیپلوی به ترتیبِ کارِ یک آدم گره خورده بود. چند ثانیه صرفه‌جویی، به قیمتِ شکستی که فقط در مرورگر دیده می‌شود. حالا بی‌قید و شرط اجرا می‌شود؛ idempotent است و در هر دو حالت درست کار می‌کند. staticfiles/ هم به gitignore اضافه شد: حالا که این مرحله همیشه اجرا می‌شود، روی ماشینِ هر توسعه‌دهنده‌ای ساخته می‌شود و ۴٫۴ مگابایت فایلِ تولیدی نباید با یک `git add .` واردِ مخزن شود. بررسی شد که با DEBUG=False کلِ مسیر کار می‌کند: استاتیک ۲۰۰، صفحه‌ی ادمین ۲۰۰، API ۲۰۰، و ورود با OTP از پنل. کدِ 0000 همان‌طور که باید، رد می‌شود. Co-Authored-By: Claude Opus 5 --- .gitignore | 3 +++ deploy.sh | 27 +++++++++++++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 498fc90..eeba69c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ data/textbooks/* # کلیدِ امضای تولیدشده‌ی خودکار (هرگز کامیت نشود) .django_secret_key + +# خروجیِ collectstatic — تولیدی است، در هر دیپلوی از نو ساخته می‌شود. +staticfiles/ diff --git a/deploy.sh b/deploy.sh index 205ed0a..cff046f 100755 --- a/deploy.sh +++ b/deploy.sh @@ -125,21 +125,20 @@ python manage.py seed_content 2>&1 | sed 's/^/ /' \ || warn "seed_content شکست خورد؛ کد به‌روز شد ولی محتوا دست‌نخورده ماند." # ─── ۵. فایل‌های استاتیک ─────────────────────────────────────────────────── -# فقط در حالتِ پروداکشن لازم است: با DEBUG=1 خودِ whitenoise از finders می‌خواند. +# بی‌قید و شرط اجرا می‌شود، حتی وقتی DEBUG روشن است. +# +# قبلاً این مرحله وقتی DEBUG=1 بود رد می‌شد، چون در آن حالت whitenoise از +# finders می‌خواند و جمع‌آوری لازم نبود. ولی این یعنی درستیِ دیپلوی به +# ترتیبِ کارهای یک آدم گره می‌خورد: اگر کسی با DEBUG روشن دیپلوی کند و بعد +# DEBUG را خاموش کند، جنگو دنبالِ فایل‌هایی می‌گردد که هیچ‌وقت جمع نشدند و +# پنلِ ادمین بدونِ CSS بالا می‌آید — بدونِ هیچ خطایی در لاگ. دقیقاً همین +# روی سرور اتفاق افتاد. +# +# هزینه‌اش چند ثانیه است و idempotent هم هست، پس همیشه اجرا می‌شود. step "جمع‌آوریِ فایل‌های استاتیک" -if python -c " -import django, os -os.environ.setdefault('DJANGO_SETTINGS_MODULE','config.settings') -django.setup() -from django.conf import settings -raise SystemExit(0 if settings.DEBUG else 1) -" 2>/dev/null; then - printf ' DEBUG روشن است — لازم نیست.\n' -else - python manage.py collectstatic --noinput >/dev/null \ - || warn "collectstatic شکست خورد؛ پنلِ ادمین ممکن است بدونِ CSS بالا بیاید." - printf ' انجام شد.\n' -fi +python manage.py collectstatic --noinput >/dev/null \ + || warn "collectstatic شکست خورد؛ پنلِ ادمین ممکن است بدونِ CSS بالا بیاید." +printf ' انجام شد.\n' # ─── ۶. بررسی‌های پیش از راه‌اندازی ──────────────────────────────────────── step "بررسیِ تنظیماتِ استقرار"