collect static files even when DEBUG is on
پنلِ ادمین روی سرور بدونِ CSS بالا آمد و هیچ خطایی هم در لاگ نبود. علت ترتیبِ کارها بود: این مرحله وقتی DEBUG روشن بود رد میشد، چون در آن حالت whitenoise از finders میخواند و جمعآوری لازم نیست. کسی با DEBUG روشن دیپلوی کرد و بعد DEBUG را خاموش کرد — کارِ درستی هم بود — و از آن لحظه جنگو دنبالِ فایلهایی میگشت که هیچوقت جمع نشده بودند. یعنی درستیِ دیپلوی به ترتیبِ کارِ یک آدم گره خورده بود. چند ثانیه صرفهجویی، به قیمتِ شکستی که فقط در مرورگر دیده میشود. حالا بیقید و شرط اجرا میشود؛ idempotent است و در هر دو حالت درست کار میکند. staticfiles/ هم به gitignore اضافه شد: حالا که این مرحله همیشه اجرا میشود، روی ماشینِ هر توسعهدهندهای ساخته میشود و ۴٫۴ مگابایت فایلِ تولیدی نباید با یک `git add .` واردِ مخزن شود. بررسی شد که با DEBUG=False کلِ مسیر کار میکند: استاتیک ۲۰۰، صفحهی ادمین ۲۰۰، API ۲۰۰، و ورود با OTP از پنل. کدِ 0000 همانطور که باید، رد میشود. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -11,3 +11,6 @@ data/textbooks/*
|
||||
|
||||
# کلیدِ امضای تولیدشدهی خودکار (هرگز کامیت نشود)
|
||||
.django_secret_key
|
||||
|
||||
# خروجیِ collectstatic — تولیدی است، در هر دیپلوی از نو ساخته میشود.
|
||||
staticfiles/
|
||||
|
||||
27
deploy.sh
27
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 "بررسیِ تنظیماتِ استقرار"
|
||||
|
||||
Reference in New Issue
Block a user