58 lines
2.1 KiB
Bash
58 lines
2.1 KiB
Bash
#!/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 |