#!/usr/bin/env bash set -euo pipefail cd /app/llm_be wait_for_database() { if [[ -z "${DATABASE_URL:-}" && -z "${DB_HOST:-}" ]]; then return 0 fi echo "Waiting for database..." for _ in $(seq 1 30); do if SKIP_RAG_INIT=1 uv run python - <<'PY' import os import sys os.environ.setdefault("DJANGO_SETTINGS_MODULE", "llm_be.settings") os.environ["SKIP_RAG_INIT"] = "1" import django from django.db import connections from django.db.utils import OperationalError django.setup() try: connections["default"].ensure_connection() except OperationalError: sys.exit(1) PY then echo "Database is ready." return 0 fi sleep 2 done echo "Database did not become ready in time." >&2 exit 1 } wait_for_database # ASGI (HTTP + WebSockets). UvicornWorker required for channels. export SKIP_RAG_INIT=1 uv run python manage.py migrate --noinput uv run python manage.py collectstatic --noinput unset SKIP_RAG_INIT exec uv run gunicorn llm_be.asgi:application \ -k uvicorn.workers.UvicornWorker \ --bind "${GUNICORN_BIND:-0.0.0.0:8000}" \ --workers "${GUNICORN_WORKERS:-2}"