#!/bin/sh # ۱. متوقف کردن آنی کل فرآیند کانتینر در صورت بروز خطا در هر لایه set -e # اگر کامند سفارشی داده شده (worker/scheduler) می‌گریشن/استاتیک فقط در سرویس وب اجرا می‌شود RUN_WEB_SETUP=1 if [ "$#" -gt 0 ] && [ "$1" != "gunicorn" ]; then RUN_WEB_SETUP=0 fi if [ "$RUN_WEB_SETUP" = "1" ]; then echo "==> [1/4] Collecting Static Files..." python manage.py collectstatic --noinput --clear echo "==> [2/4] Running Database Migrations..." python manage.py migrate --noinput fi echo "==> [3/4] Optimizing SQLite Storage (WAL & Synchronous)..." # استفاده از بلاک EOF پایتون برای خوانایی، ایزولاسیون خطا و ثبت سیستماتیک لاگ‌ها python << 'EOF' import sqlite3 import sys db_path = '/app/sqlite/db.sqlite3' try: conn = sqlite3.connect(db_path, timeout=30) cursor = conn.cursor() # فعال‌سازی و تایید صحت حالت WAL cursor.execute('PRAGMA journal_mode=WAL;') journal_mode = cursor.fetchone()[0] cursor.execute('PRAGMA synchronous=FULL;') cursor.execute('PRAGMA synchronous;') sync_mode = cursor.fetchone()[0] conn.close() print(f"SUCCESS: Infrastructure Database Configured -> Journal: {journal_mode.upper()} | Sync: {sync_mode}") except sqlite3.OperationalError as e: print(f"CRITICAL: Database is locked or inaccessible: {str(e)}", file=sys.stderr) sys.exit(1) # بازگرداندن وضعیت خطا به داکر برای جلوگیری از بالا آمدن وب‌سرور معیوب except Exception as e: print(f"CRITICAL: Failed to apply enterprise database optimization: {str(e)}", file=sys.stderr) sys.exit(1) EOF echo "==> [4/4] Starting Application..." # اگر کامند سفارشی داده شده باشد (مثل sms_worker/sms_scan) همان اجرا می‌شود؛ # در غیر این‌صورت وب‌سرور Gunicorn به‌عنوان PID 1 جایگزین می‌شود (Graceful Shutdown). if [ "$#" -gt 0 ]; then exec "$@" else exec gunicorn --bind 0.0.0.0:8000 khatibi.wsgi:application fi