#!/bin/sh # ۱. متوقف کردن آنی کل فرآیند کانتینر در صورت بروز خطا در هر لایه set -e echo "==> [1/4] Collecting Static Files..." python manage.py collectstatic --noinput --clear echo "==> [2/4] Running Database Migrations..." python manage.py migrate --noinput 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 Gunicorn Web Server..." # جایگزین کردن پروسس PID 1 با Gunicorn برای مدیریت اصولی سیگنال‌های توقف داکر (Graceful Shutdown) exec gunicorn --bind 0.0.0.0:8000 khatibi.wsgi:application