stop a deploy from silently blocking the frontend or leaving 0000 open

سه حالتِ خراب که هیچ‌کدام در لاگِ سرور ردی نمی‌گذارند و فقط وقتی کشف می‌شدند
که یک آدم از بیرون اپ را دستی امتحان کند.

CORS_ALLOWED_ORIGINS فقط از env خوانده می‌شد و با DEBUG روشن به localhost
محدود می‌ماند. یعنی بک‌اندِ کاملاً سالم، ولی مرورگر همه‌ی درخواست‌های
math.tadrisino2.ir را بلاک می‌کند — خطایی که سمتِ سرور دیده نمی‌شود و فقط در
کنسولِ مرورگر پیداست. origin های شناخته‌شده حالا پیش‌فرضِ داخلِ کدند تا یک
متغیرِ فراموش‌شده اتصال را نشکند؛ env همچنان بازنویسی‌شان می‌کند.

/api/health حالا warnings هم می‌دهد. مهم‌ترینش: با DEBUG روشن روی سرورِ عمومی،
DEV_MASTER_OTP یعنی هر کسی با کدِ 0000 می‌تواند به‌جای هر شماره‌ای وارد شود.
این تا امروز فقط با خواندنِ تنظیماتِ سرور معلوم می‌شد، و ما به سرور دسترسی
نداریم. allowedOrigins هم برگردانده می‌شود تا مشکلِ CORS از بیرون قابلِ
تشخیص باشد.

deploy.sh قبل از دست زدن به دیتابیس متغیرهای لازم را بررسی می‌کند و با پیامِ
روشن می‌ایستد، به‌جای اینکه وسطِ کار بشکند و 502 بدهد.
.env.production.example همان‌ها را یک‌جا مستند می‌کند.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-13 20:46:23 +03:30
parent 190bff3d0f
commit eaa4b761dd
4 changed files with 116 additions and 7 deletions

44
.env.production.example Normal file
View File

@@ -0,0 +1,44 @@
# نمونه‌ی فایلِ .env برای سرور. یک‌بار پر می‌شود و بعد دیگر کاری با آن نیست.
#
# بعد از پر کردن، هر آپدیت فقط این است:
# git pull && ./deploy.sh
# ─── اجباری ──────────────────────────────────────────────────────────────
# دامنه‌هایی که این سرویس روی آن‌ها سرو می‌شود (با ویرگول جدا).
DJANGO_ALLOWED_HOSTS=api.math.tadrisino2.ir
# ─── حالتِ پروداکشن ──────────────────────────────────────────────────────
# DJANGO_DEBUG را ست نکنید (یا 0 بگذارید).
#
# ⚠️ با DJANGO_DEBUG=1 روی یک سرورِ عمومی:
# • صفحه‌های خطا کلِ تنظیمات و traceback را نشان می‌دهند
# • کدِ ورودِ آزمایشیِ 0000 برای هر شماره‌ای پذیرفته می‌شود،
# یعنی هر کسی می‌تواند به‌جای هر کاربری وارد شود
DJANGO_DEBUG=0
# با DEBUG خاموش این دو اجباری‌اند:
DJANGO_SECRET_KEY=
# یک رشته‌ی تصادفیِ بلند. ساختنش:
# python -c "import secrets; print(secrets.token_urlsafe(64))"
CACHE_URL=redis://127.0.0.1:6379/1
# بدونِ کشِ مشترک، محدودیتِ نرخ بینِ workerهای gunicorn مشترک نیست.
# دامنه‌هایی که فرم/ادمین از آن‌ها POST می‌کند
CSRF_TRUSTED_ORIGINS=https://api.math.tadrisino2.ir
# ─── اختیاری ─────────────────────────────────────────────────────────────
# origin های فرانت. اگر خالی باشد از فهرستِ پیش‌فرضِ داخلِ کد استفاده می‌شود
# که https://math.tadrisino2.ir را شامل است — معمولاً لازم نیست ست شود.
# CORS_ALLOWED_ORIGINS=https://math.tadrisino2.ir
# کلیدهای سرویس‌های بیرونی
OPENAI_API_KEY=
OPENAI_BASE_URL=https://api.gapgpt.app/v1
QDRANT_URL=https://qdrant.tadrisino2.ir:443
QDRANT_API_KEY=
KAVENEGAR_API_KEY=
KAVENEGAR_SENDER=
# نامِ سرویسِ systemd تا deploy.sh خودش ری‌استارت کند
# TADRISINO_SERVICE=tadrisino